[Click] click element customization

Ruetee Chitpranee rueteec at gmail.com
Fri Dec 23 07:06:54 EST 2011


Thank you very much for your answer :)
Now, It's clear.

On Fri, Dec 23, 2011 at 12:12 PM, Beyers Cronje <bcronje at gmail.com> wrote:

> Hi Ruetee,
>
> Your first problem is that you are assuming the IP Header annotation is set
> when you call "p->ip_header()", which in your case it has not. I.e.
> p->has_network_header() == false. The packet header annotations are
> typically set through MarkIPHeader or CheckIPHeader, and only elements
> downstream of these elements can use p->ip_header(). Have a look at
> MarkIPHeader on how to set the annotation. Keep in mind MarkIPHeader and
> CheckIPHeader assumes input packets are valid IP packets.
>
> Possibly a better approach to familiarize yourself with Click and test
> custom elements would be something like:
>
> InfiniteSource -> Classifier(12/0800) -> MarkIPHeader(14) -> YourElement ->
> Discard;
>
> Or even easier:
>
> FromDump(/path/to/dump.pcap) -> Classifier(12/0800) -> MarkIPHeader(14) ->
> YourElement -> Discard;
>
> Beyers
>
> On Fri, Dec 23, 2011 at 12:51 AM, Ruetee Chitpranee <rueteec at gmail.com
> >wrote:
>
> > Hi,
> >
> > First of all, I'm really a beginner for Click. Now, I'm trying to
> customize
> > InfiniteSource to correct IP Header checksum as always (..for trying and
> > make me understand better about click elements :)
> >
> > My idea is on function run_task (or function setup_packet() -- but seems
> > cannot manage anything here :-/, before push result packet out, I will
> > extract "click_ip" from the packet and process checksum update, then set
> > the header back.
> >
> > Look simple but I still got Segmentation fault :(
> >
> > Here is what I did ...
> >
> > bool
> > InfiniteSourcex::run_task(Task *)
> > {
> >    if (!_active || !_nonfull_signal)
> > return false;
> >    int n = _burstsize;
> >    if (_limit >= 0 && _count + n >= (ucounter_t) _limit)
> > n = (_count > (ucounter_t) _limit ? 0 : _limit - _count);
> >    for (int i = 0; i < n; i++) {
> > Packet *p = _packet->clone();
> > if (_timestamp)
> >    p->timestamp_anno().assign_now();
> >
> > ///////// customize here /////////
> >
> > click_ip *ip = const_cast<click_ip *>(p->ip_header());
> >
> > //// solution1: code from SetIPChecksum element////
> > unsigned plen, hlen;
> > plen = p->network_length();
> > hlen = ip->ip_hl << 2;
> > click_chatter("network len is %u", plen);
> > click_chatter("ip len is %u", hlen);
> > ip->ip_sum = 0;
> > ip->ip_sum = click_in_cksum((unsigned char *)ip, hlen);
> >
> > p->set_ip_header(ip, sizeof(click_ip));
> >
> >
> > //// solution2: code from IPEncap element////
> >
> > if (ip->ip_len) { // use_dst_anno
> > ip->ip_dst = p->dst_ip_anno();
> > update_cksum(ip, 16);
> > update_cksum(ip, 18);
> > } else
> > p->set_dst_ip_anno(IPAddress(ip->ip_dst));
> > ip->ip_len = htons(p->length());
> > ip->ip_id = htons(0);
> > update_cksum(ip, 2);
> > update_cksum(ip, 4);
> >
> > p->set_ip_header(ip, sizeof(click_ip));
> >
> >  ///////// customize end /////////
> >
> > output(0).push(p);
> >    }
> >    _count += n;
> >    if (n > 0)
> > _task.fast_reschedule();
> >    else if (_end_h && _limit >= 0 && _count >= (ucounter_t) _limit)
> > (void) _end_h->call_write();
> >    return n > 0;
> > }
> >
> >
> > Please advise what I should do....
> > Thank you very much in advance.
> >
> > Regards,
> >
> > Ruetee C.
> > _______________________________________________
> > click mailing list
> > click at amsterdam.lcs.mit.edu
> > https://amsterdam.lcs.mit.edu/mailman/listinfo/click
> >
> _______________________________________________
> click mailing list
> click at amsterdam.lcs.mit.edu
> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
>



-- 
Ruetee C.


More information about the click mailing list