[Click] header annotations, variable meanings, etc.

Nicholas Murphy nmurphy at cs.washington.edu
Sun Dec 10 20:59:01 EST 2006


Ok...I think we were just getting signals crossed in terminology.   
Thanks for clarifying.

Nick

On Dec 10, 2006, at 5:54 PM, Eddie Kohler wrote:

> That is modifying THE PACKET.  The IP header annotation doesn't  
> contain a COPY of the IP header; it contains a POINTER to the ip  
> header.  The IP header data itself is part of the packet data, but  
> the POINTER to the header is an annotation.
>
> Eddie
>
>
> Nicholas Murphy wrote:
>> 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