[Click] Basic question about IP header fields.

Nikki tuna_armadillo at hotmail.com
Mon Oct 22 22:19:06 EDT 2007


Hi guys,

Firstly, many many thanks for the help, its been great - I've only just
got round to putting it into practice now I've got most of the theory
out of the way, but the code you gave me has worked a treat. I think I
need to read up on pointers a bit more to fully understand it, but I
think I see what its doing.

So anyway, on to my new question. I tried messing around with the code,
in my new element and it now looks like this:

const click_ip *iph = p->ip_header();   // Get pointer to IP Header
	
	if (!iph){   // Make sure it's a valid header
	p->kill(); 
	return; 
	}
	else if (iph->ip_len <= 1000){   // Check Total Length field 
	output(0).push(p);
	}
	else{
	output(1).push(p);
	}

I want to split packets through different outputs depending on packet
size, but the code above just pushes everything through output 1. I'm
using FromDump in my config script, and am using a dump with packets of
varying sizes, from 40 to 1420 bytes - but they all come out of output
1, not output 0. Where am I going wrong?

Thanks,
Josh


On Tue, 2007-09-11 at 01:02 +0200, Beyers Cronje wrote:
> Josh,
> 
> And so I inadvertently demonstrated one of the classic beginner
> mistakes to watch out for :) Always either push/pull, kill or store
> the packet for later use...
> 
> 
> On 9/11/07, Eddie Kohler <kohler at cs.ucla.edu> wrote:
>         Thanks, Beyers -- but I'd either "assert(iph)" or "if (!iph) {
>         p->kill(); return; }", to avoid leaking memory.
>         E
>         
>         
>         Beyers Cronje wrote:
>         > Hi Josh,
>         >
>         > You need to get a pointer to the IP Header. A simple
>         example: 
>         >
>         > const click_ip *iph = p->ip_header();   // Get pointer to IP
>         Header
>         > if (!iph)   // Make sure it's a valid header
>         >   return;
>         >
>         > if (iph->ip_tos <= n)   // Check TOS field 
>         >   output(0).push(p);
>         > else
>         >   output(1).push(p)
>         >
>         > The above example expects IP packets. So you'll have to
>         filter on IP packets
>         > and also set the IP header annotations i.e.:
>         >
>         > FromDevice(eth0) -> Classifier(12/0800) -> MarkIPHeader(14)
>         -> YourElement;
>         >
>         > Classifier to filter IP packets, and MarkIPHeader to set
>         annotations. You
>         > can also use CheckIPHeader instead of MarkIPHeader. 
>         >
>         > Hope this helps.
>         >
>         > Beyers
>         >
>         > On 9/10/07, Josh Butler <tuna_armadillo at hotmail.com> wrote:
>         >> Hi,
>         >>
>         >> This is my first question and probably won't be my last.
>         I've been doing a 
>         >> project involving Click for a while, but owing to my very
>         basic programming
>         >> skills have struggled quite a lot, though I've enjoyed
>         messing about with
>         >> click in the process - I've been writing a bit of an
>         idiot's guide as I've 
>         >> gone along!
>         >>
>         >> I've got my head round creating the router configuration
>         scripts by
>         >> combining elements and am now looking to go inside the
>         elements and make
>         >> some changes. I've chosen the tee element as one of the
>         easier elements to 
>         >> look at and modify, and have a good understanding of what
>         it does in push
>         >> mode.
>         >>
>         >> I now want to modify this element in a very basic way,
>         using a simple if
>         >> statement if possible so that I can push packets through
>         either the 
>         >> element's first or second output port depending on some
>         criteria such as the
>         >> type of service field within the IP header. Here's what I
>         mean in
>         >> pseudocode, if that's the correct term; 
>         >>
>         >> if (type_of_service_field <= n){
>         >>     output(0).push(p);
>         >>     }
>         >>     else {
>         >>     output(1).push(p);
>         >>     }
>         >>
>         >> I've looked through all the material on the click site and
>         can't find a 
>         >> simple answer to the question of how to access the
>         different fields within
>         >> the IP header. Maybe I'm being stupid, but a bit of help
>         would be awesome.
>         >>
>         >> Thanks,
>         >> Josh 
>         >>
>         >>
>         _________________________________________________________________
>         >> 100's of Music vouchers to be won with MSN Music
>         >> https://www.musicmashup.co.uk
>         >> _______________________________________________
>         >> 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