From: "Michael Lawson (mshindo)" <michael@sphinix.com>
To: netfilter-devel@vger.kernel.org
Subject: Fwd: Modifying TCP packets with libnetfilter_queue
Date: Thu, 27 Aug 2009 16:16:41 +1200 [thread overview]
Message-ID: <c97a47b90908262116q61d4a77fif52cb49880a4d3d1@mail.gmail.com> (raw)
In-Reply-To: <c97a47b90908262115l1dc29b78q7c02661b64af8cd9@mail.gmail.com>
Hi,
I am attempting to adjust contents of tcp packets using the nf queue
system, the queue part is working as I expected, however I am running
into problems recalculating the tcp checksum. At the moment, the
packet isnt being changed, and I am simply reading the checksum, then
trying to regenerate it, these values arent matching and I am at a
loss as to where I am going wrong.
Here is the checksum code at the moment:
struct tcp_pseudo /*the tcp pseudo header*/
{
__u32 src_addr;
__u32 dst_addr;
__u8 zero;
__u8 proto;
__u16 length;
}pseudohead;
long checksum(unsigned short *addr, unsigned int count) {
register long sum = 0;
while( count > 1 ) {
/* This is the inner loop */
sum += * addr++;
count -= 2;
}
/* Add left-over byte, if any */
if( count > 0 )
sum += * (unsigned char *) addr;
/* Fold 32-bit sum to 16 bits */
while (sum>>16)
sum = (sum & 0xffff) + (sum >> 16);
return ~sum;
}
long get_tcp_checksum(struct iphdr * myip, struct tcphdr * mytcp) {
mytcp->check = 0;
u16 total_len = ntohs(myip->tot_len);
int tcpopt_len = mytcp->doff*4 - 20;
int tcpdatalen = total_len - (mytcp->doff*4) - (myip->ihl*4);
/*Setup the pseudo header*/
pseudohead.src_addr=myip->saddr;
pseudohead.dst_addr=myip->daddr;
pseudohead.zero=0;
pseudohead.proto=IPPROTO_TCP;
pseudohead.length=htons(sizeof(struct tcphdr) + tcpopt_len + tcpdatalen);
/*Calc lengths*/
int totaltcp_len = sizeof(struct tcp_pseudo) + sizeof(struct
tcphdr) + tcpopt_len + tcpdatalen;
unsigned short * tcp = new unsigned short[totaltcp_len];
/*Copy to required mem*/
memcpy((unsigned char *)tcp,&pseudohead,sizeof(struct tcp_pseudo));
memcpy((unsigned char *)tcp+sizeof(struct tcp_pseudo),(unsigned
char *)mytcp,sizeof(struct tcphdr));
if(tcpopt_len > 0)
memcpy((unsigned char *)tcp+sizeof(struct
tcp_pseudo)+sizeof(struct tcphdr), (unsigned char
*)myip+(myip->ihl*4)+(sizeof(struct tcphdr)), tcpopt_len);
if(tcpdatalen > 0)
memcpy((unsigned char *)tcp+sizeof(struct
tcp_pseudo)+sizeof(struct tcphdr), (unsigned char
*)mytcp+(mytcp->doff*4), tcpdatalen);
// memcpy((unsigned char *)tcp+sizeof(struct
tcp_pseudo)+sizeof(struct tcphdr)+tcpopt_len, (unsigned char
*)mytcp+(mytcp->doff*4), tcpdatalen);
return checksum(tcp, totaltcp_len);
}
and the whole file, although not much bigger is here:
http://pastebin.com/m2bc636ed
An example of the output values I am getting at the moment is:
packet size = 529 ip->checksum = 22679 tcp->checksum = 14964 new
ip->checksum = 22679 new tcp->checksum = 8007
packet size = 52 ip->checksum = 13465 tcp->checksum = 8007 new
ip->checksum = 13465 new tcp->checksum = 31444
packet size = 52 ip->checksum = 13209 tcp->checksum = 31444 new
ip->checksum = 13209 new tcp->checksum = 50105
packet size = 52 ip->checksum = 12953 tcp->checksum = 50105 new
ip->checksum = 12953 new tcp->checksum = 12783
Any help or suggestions please? I am at a loss
--
Michael Lawson (mshindo)
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next parent reply other threads:[~2009-08-27 4:17 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <c97a47b90908262115l1dc29b78q7c02661b64af8cd9@mail.gmail.com>
2009-08-27 4:16 ` Michael Lawson (mshindo) [this message]
2009-08-27 5:34 ` Fwd: Modifying TCP packets with libnetfilter_queue Kuzin Andrey
[not found] ` <c97a47b90908271909l5849517bp729022d4cdd7cb6f@mail.gmail.com>
2009-08-28 2:09 ` Michael Lawson (mshindo)
2009-08-28 11:26 ` Bruno Moreira Guedes
2009-08-28 19:53 ` Zhiyun Qian
2009-08-28 20:51 ` Bruno Moreira Guedes
2009-08-28 22:48 ` Michael Lawson (mshindo)
2009-09-07 2:52 ` Michael Lawson (mshindo)
2009-09-07 4:45 ` Michael Lawson (mshindo)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=c97a47b90908262116q61d4a77fif52cb49880a4d3d1@mail.gmail.com \
--to=michael@sphinix.com \
--cc=netfilter-devel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).