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 <[EMAIL PROTECTED]>
> To: Tushar Soni <[EMAIL PROTECTED]>
> Cc: [EMAIL PROTECTED]
> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]>
> To: Tushar Soni <[EMAIL PROTECTED]>
> Cc: [EMAIL PROTECTED]
> 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 <[EMAIL PROTECTED]> 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
> [email protected]
> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
>
>
>
> _______________________________________________
> click mailing list
> [email protected]
> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
_______________________________________________
click mailing list
[email protected]
https://amsterdam.lcs.mit.edu/mailman/listinfo/click