[Click] No network header/Segmentation fault

Eddie Kohler kohler at cs.ucla.edu
Wed Jul 16 19:55:10 EDT 2008


Also, if your Decoder path needs an IP header, then MarkIPHeader should occur 
before every entry point to decoder.  Here pre_cl[0] goes to [1]decoder 
without an intervening MarkIPHeader or CheckIPHeader.

Eddie


Tushar Soni wrote:
> Hey,
> 
> Well I have not forgotten to Strip or the offset.
> 
> Here is my click configuration:
> 
> tun::KernelTun(1.0.0.1/8);
> decoder::Decoder(); //This is the element i created inside which is the code that i sent in my previous mails
> FromDevice(ath0, SNIFFER false)->pre_cl::Classifier(12/0977, -); //0x0977 is the ethernet type for my coded packet.
> pre_cl[0]->Strip(14)->[1]decoder[1]->MarkIPHeader(0)->IPPrint(decoded)->tun;
> pre_cl[1]->Strip(14)->CheckIPHeader()->MarkIPHeader(0)->IPClassifier(dst udp port 1234)->[0]decoder[0]->tun; 
> 
> Tushar
> 
> 
> Tºüçhé §übt!é
> 
> 
> 
> ----- Original Message ----
> From: Beyers Cronje <bcronje at gmail.com>
> To: Tushar Soni <omega_marines at yahoo.com>
> Cc: click at pdos.csail.mit.edu
> Sent: Monday, July 7, 2008 11:45:52 AM
> Subject: Re: [Click] No network header/Segmentation fault
> 
> 
> PS you would need to use Unstrip(14) before forwarding to tun if you use the config below.
>  
> Alternatively you can leave out Strip/Unstrip and just specify the offset of the IP Header directly in MarkIPHeader i.e. MarkIPHeader(14)
> 
> 
> On Mon, Jul 7, 2008 at 11:43 AM, Beyers Cronje <bcronje at gmail.com> wrote:
> 
> Hi,
>  
> I think you forgot to use Strip or specified the offset to MarkIPHeader in your configuration. Also remember to use Classifier to only push proper IP packets to MarkIPHeader, i.e. to get rid of ARP packets etc.
> Your config should start with something like this:
>  
> FromDevice(eth0) -> Classifier(12/0800) -> Strip(14) -> MarkIPHeader -> .......
>  Beyers
> 
>  
> On Mon, Jul 7, 2008 at 10:33 AM, Tushar Soni <omega_marines at yahoo.com> wrote:
> 
> Hi,
> 
> Thanks for your reply. I tried both MarkIPHeader and CheckIPHeader, but when I use them it gives me segmentation fault. I think the reinterpret_cast<const click_ip *>(p->data()) is not working for this particular decoded packet.
> 
> But I did try something. In my code after I decode I added the following lines:
> 
> p->push(sizeof(struct click_ether));
> p->set_mac_header(p->data(), 14); //This sets the mac header as well as the network header
> click_ip *iph = p->ip_header(); //Now this works and returns the ip header
> p->set_network_header(20); //This essentially sets the transport header
> click_udp *udph = p->udp_header(); //This also works now
> 
> After doing this when I push the packet, then the IPPrint() element (after stripping 14 bytes that i added) is able to print and there are no segmentation faults. So far so good. I send this packet to the tun. But somehow the packet is being dropped or not processed and it never reaches the application layer. I am thinking the initial reason why this packet does not have any network or transport header maybe causing the kernel to drop it. I checked the checksums of both ip and udp header and they seem to be correct. Would you have any ideas why this is happening???
> 
> Thanks a lot for your help.
> 
> Best Regards,
> 
> Tushar
> 
>  Tºüçhé §übt!é 
> 
> 
> 
> 
> ----- Original Message ----
> From: Beyers Cronje <bcronje at gmail.com>
> To: Tushar Soni <omega_marines at yahoo.com>
> Cc: click at pdos.csail.mit.edu
> Sent: Friday, July 4, 2008 5:27:59 PM
> Subject: Re: [Click] No network header/Segmentation fault
> 
> 
> Hi,
>  
> You have to use either MarkIPHeader of CheckIPHeader elements to set the IP header annotations. 
>  
> Beyers
> 
> 
> On Fri, Jul 4, 2008 at 5:06 PM, Tushar Soni <omega_marines at yahoo.com> wrote:
> 
> Hi everyone,
> 
> I have a scenario where coding some packets at the access point and decoding the packets at receiver side using click. Now when i decode the packet and use Print() element, the packet structure and ip header looks ok. But when i use IPPrint it gives me segmentation fault. When i try to get the ip header(Packet::ip_header()) or the udp header(Packet::udp_header()) it returns null (so this is the reason why IPPrint does not work). The commented code should explain better about what i am doing and the problems i am facing. I would be glad if someone could help me figure out what i am doing wrong. Thanks.
> 
> Tushar
> 
> For coding i combine a certain number of packets, from ip header onwards(ip header included). So when i decode i should have a packet from ipheader onwards.
> 
> void
> Decoder::check_uncoded(Packet *p) //p is the coded packet
> {
>    FoundPacketsList found_pkts_list;// this is typedef of type : Vector<Packet *>
>    WritablePacket *wp = p->uniqueify();
>   xor_header *xor_h_cod = (xor_header *)wp->data();//i have created my own header
>    int entries_cod = xor_h_cod->get_entries();
>    int coded_hlen = xor_header::get_header_length(entries_cod);
>    for( int i = 0; i < entries_cod; i++)
>    {
>        //_ddhq is a type if queue and here i am basically checking if the ipid of the unocoded packet
>       //is present in the coded header that i created
>        int location =  _ddhq.is_present(xor_h_cod->get_entry_ipid(i));
>        if( location >= 0 )
>        {
>                //if the id is in the coded header i add it to a list
>            found_pkts_list.push_back(_ddhq.packet(location));
>        }
>    }
>    if(found_pkts_list.size() > 0)
>    {
> 
>        bool decodable = false;
>        //this is the condition for decodability
>        if( entries_cod - found_pkts_list.size() == 1)
>        {
>            decodable = true;
>        }
>        //remove my header
>        wp->pull(coded_hlen);
>        FoundPacketsList::iterator x = found_pkts_list.begin();
>        //here i combine the packets in the list with the coded packet to decode it
>        while( x < found_pkts_list.end())
>        {
>            Packet *p_i = (*x);
>            unsigned char *xored_data = (unsigned char *)wp->data();
>            unsigned char *data = (unsigned char *)(p_i->ip_header());
>            int len = p_i->length();
>            for (int i = 0; i < len; i++) {
>                xored_data[i] ^= data[i];
>            }
>            x++;
>        }
>        if(decodable)
>        {
>            //wp = wp->uniqueify();
>            click_chatter("WOOHOO Packet Decoded");
>            click_chatter("Length: %u", wp->length());
> 
>            click_ip *iph = wp->ip_header();
>            //PROBLEM IS HERE ip_header() returns nothing
>            if(!iph)
>                click_chatter("Shitty packet"); // this is always called because the iph is never created
>            else
>            {
>                click_udp *udph = wp->udp_header();
>                if(!udph)
>                    click_chatter("UDP header not found");
>            }
>                //here i push the packet to the higher layers
>                //i use a tun element for this and when i run it gives: no network header as the error
>            output(1).push(wp);
>        }
> 
>    }
>    else
>    {
>        click_chatter("None of the packets found in uncoded queue.");
>        _codedq.push(0,p);
>    }
> }
> 
> 
> 
> 
>  Tºüçhé §übt!é
> 
> 
> 
> 
> 
> _______________________________________________
> 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



More information about the click mailing list