[Click] No network header/Segmentation fault

Tushar Soni omega_marines at yahoo.com
Mon Jul 7 06:07:23 EDT 2008


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


      


More information about the click mailing list