in_cksum() for ip packets with multiple mbufs
Giorgos Keramidas
keramida at ceid.upatras.gr
Sun Oct 23 05:06:20 PDT 2005
On 2005-10-23 04:13, kamal kc <kamal_ckk at yahoo.com> wrote:
> /* the argument m is the (struct mbuf *) that
> * contains the packet data
> */
>
> void copy_the_memorybuffer(struct mbuf **m)
> {
> struct mbuf *mbuf_pointer=*m;
> struct mbuf **next_packet;
>
> next_packet=&mbuf_pointer;
>
> struct ip *my_ip_hdr;
> my_ip_hdr=mtod((*next_packet),struct ip *);
> my_ip_hdr->ip_tos=64;
> my_ip_hdr->ip_sum=0;
>
> my_ip_hdr->ip_sum=
> in_cksum((*next_packet),(my_ip_hdr->ip_hl<<2));
> .......
> }
Why all this pointer fun? How do you know that it's safe to dereference
`m' when you do:
struct mbuf *mbuf_pointer=*m;
Why are you dereferencing `m' once to obtain mbuf_pointer and then
taking the address of that to obtain next_packet, when you could
just do:
next_packet = m;
There are also several other problems with copy_the_memorybuffer() as
it's written above:
- It's considered bad style to mix declarations and code the way you
have done above
- It is probably better to return the copy of the mbuf you're
fiddling with, instead of modifying in place a parameter of the
function.
- If you are not *REALLY* copying the data of the mbuf, then
the name of copy_the_memorybuffer() is very confusing.
- What is the magic constant 64 that is assigned to ip_tos?
What you probably want to do is something like:
void
ip_set_type_of_service(struct mbuf *m)
{
struct ip *iph;
assert(m != NULL);
iph = mtod(m, struct ip *);
iph->ip_tos = IPTOS_PREC_IMMEDIATE;
iph->ip_sum = 0;
iph->ip_sum = in_cksum((uint16_t *)iph, iph->ip_hl << 2);
}
but that's not copying anything.
> but still it doesn't seem to work. and the problem
> is still there.
You have obviously made a lot of changes that we haven't seen yet.
Instead of posting snippets here and there, save a copy of the original
sources somewhere, then a copy of the new sources, and run diff(1) on
the two directories to extract *ALL* the changes.
$ cd /usr/src
$ diff -ruN src.old/ src/ > /tmp/patchfile
and put the patchfile somewhere online where we can have a look at all
the changes.
More information about the freebsd-net
mailing list