[Click] header annotations, variable meanings, etc.

Nicholas Murphy nmurphy at cs.washington.edu
Sun Dec 10 20:00:09 EST 2006


Hmm...ok.  First of all, I don't see any such element in my  
distribution. :)  But I looked at setipdscp.cc (which is maybe what  
you were referring to?), and I see the following lines.

   uint16_t old_hw = (reinterpret_cast<uint16_t *>(ip))[0];
   ip->ip_tos = (ip->ip_tos & 0x3) | _dscp;
   uint16_t new_hw = (reinterpret_cast<uint16_t *>(ip))[0];

   // 19.Aug.1999 - incrementally update IP checksum according to  
RFC1624.
   // new_sum = ~(~old_sum + ~old_halfword + new_halfword)
   uint32_t sum = (~ip->ip_sum & 0xFFFF) + (~old_hw & 0xFFFF) + new_hw;
   sum = (sum & 0xFFFF) + (sum >> 16);
   ip->ip_sum = ~(sum + (sum >> 16));

This seems to be modifying the fields I mentioned before that you  
said didn't change the original packet.  Will forwarding the packet  
with these modifications out on a ToDevice not reflect these  
changes?  I'm confused.

Sorry for the newbie questions.

Thanks,
Nick

On Dec 10, 2006, at 3:30 PM, Eddie Kohler wrote:

> Hi Nick,
>
> Check out, for example, elements/ip/setipdhcp.cc (the smaction()  
> method).
>
> You need to create a WritablePacket using the uniqueify() method,  
> then you can simply modify its data.
>
>    WritablePacket *wp = p->uniqueify();
>    if (!wp)
>        // not enough memory to create a new packet
>        return 0;
>    wp->data()[0] = 'W';  // or whatever
>
> Eddie
>
>
> Nicholas Murphy wrote:
>> Eddie-
>> Thanks for your responses.  One quick followup: what is the  
>> appropriate way to actually make modifications to the packet if  
>> modifying the annotations doesn't actually change the packet?
>> Thanks,
>> Nick
>> On Dec 9, 2006, at 7:09 PM, Eddie Kohler wrote:
>>> Hi Nicholas,
>>>
>>> Nicholas Murphy wrote:
>>>> A few random (probably newbie) questions:
>>>> 1) So, you seem to need to run packets through something like   
>>>> CheckIPHeader in order to fill out the packet header  
>>>> annotations,  correct?  Do these annotations persist across  
>>>> elements that use  "uniquify", things like Tee, etc.?
>>>
>>> Yes.
>>>
>>>> 2) Are transport-layer annotations only filled out once you run   
>>>> through something like IPClassifier?
>>>
>>> The CheckIPHeader annotation sets both the start-network-header  
>>> annotation and the end-network-header==start-transport-header  
>>> annotation.
>>>
>>>> 3) Am I right in thinking that variables like "network_length 
>>>> ()"  represent the length from the beginning of the network  
>>>> header to the  end of the packet?
>>>
>>> Yes!
>>>
>>>> 4) Am I right in assuming there will never be any layering   
>>>> information (e.g., ethernet footer) after the data?
>>>
>>> In practice yes, although this depends on your network layer.
>>>
>>>
>>>> 5) Does changing the annotation variables (e.g., ip_header()- 
>>>> >ip_len)  actually modify the packet itself?
>>>
>>> Nope!
>>>
>>> Eddie
>>>
>>>> Hopefully these are all easy yes/no's. :)
>>>> Thanks,
>>>> Nick
>>>> _______________________________________________
>>>> click mailing list
>>>> click at amsterdam.lcs.mit.edu
>>>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click



More information about the click mailing list