From 99606ffa5f01f81c43a905705feba27e6360df95 Mon Sep 17 00:00:00 2001 From: Robert Buchholz <[email protected]> Date: Sun, 25 Jan 2009 19:44:38 +0100 Subject: [PATCH] Add OFFSET to CheckIP6Header
Similar to the offset parameter of CheckIPHeader, this allows specifying
a byte offset to read the IP6 header from.
---
elements/ip6/checkip6header.cc | 27 ++++++++++++++++-----------
elements/ip6/checkip6header.hh | 15 +++++++++++++--
2 files changed, 29 insertions(+), 13 deletions(-)
diff --git a/elements/ip6/checkip6header.cc b/elements/ip6/checkip6header.cc
index 4341cc7..9f5007c 100644
--- a/elements/ip6/checkip6header.cc
+++ b/elements/ip6/checkip6header.cc
@@ -42,17 +42,21 @@ CheckIP6Header::~CheckIP6Header()
int
CheckIP6Header::configure(Vector<String> &conf, ErrorHandler *errh)
{
-
- if (conf.size() > 1)
- return errh->error("too many arguments to `CheckIP6Header([ADDRS])'");
-
+ String badaddrs = String::make_empty();
+ _offset = 0;
Vector<String> ips;
// ips.push_back("0::0"); // this address is only bad if we are a router
ips.push_back("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"); // bad IP6 address
- if (conf.size()) {
+ if (cp_va_kparse(conf, this, errh,
+ "BADADDRS", cpkP, cpString, &badaddrs,
+ "OFFSET", cpkP, cpUnsigned, &_offset,
+ cpEnd) < 0)
+ return -1;
+
+ if (badaddrs) {
Vector<String> words;
- cp_spacevec(conf[0], words);
+ cp_spacevec(badaddrs, words);
IP6Address a;
for (int j = 0; j < words.size(); j++) {
if (!cp_ip6_address(words[j], (unsigned char *)&a)) {
@@ -94,11 +98,12 @@ CheckIP6Header::drop_it(Packet *p)
Packet *
CheckIP6Header::simple_action(Packet *p)
{
- const click_ip6 *ip = reinterpret_cast <const click_ip6 *>( p->data());
+ const click_ip6 *ip = reinterpret_cast <const click_ip6 *>( p->data() + _offset);
+ unsigned plen = p->length() - _offset;
struct IP6Address src;
// check if the packet is smaller than ip6 header
- if(p->length() < sizeof(click_ip6))
+ if(plen < sizeof(click_ip6))
goto bad;
// check version
@@ -106,7 +111,7 @@ CheckIP6Header::simple_action(Packet *p)
goto bad;
// check if the PayloadLength field is valid
- if(ntohs(ip->ip6_plen) > (p->length()-40))
+ if(ntohs(ip->ip6_plen) > (plen-40))
goto bad;
/*
@@ -130,8 +135,8 @@ CheckIP6Header::simple_action(Packet *p)
p->set_ip6_header(ip);
// shorten packet according to IP6 payload length field
- if(ntohs(ip->ip6_plen) < (p->length()-40))
- p->take(p->length() - 40 - ip->ip6_plen);
+ if(ntohs(ip->ip6_plen) < (plen-40))
+ p->take(plen - 40 - ip->ip6_plen);
return(p);
bad:
diff --git a/elements/ip6/checkip6header.hh b/elements/ip6/checkip6header.hh
index 5ec7511..b6a5b4c 100644
--- a/elements/ip6/checkip6header.hh
+++ b/elements/ip6/checkip6header.hh
@@ -6,26 +6,37 @@ CLICK_DECLS
/*
* =c
- * CheckIP6Header([BADADDRS])
+ * CheckIP6Header([BADADDRS, OFFSET])
* =s ip6
*
* =d
*
- * Expects IP6 packets as input. Checks that the packet's length is
+ * Expects IP6 packets as input starting at OFFSET bytes. Default OFFSET
+ * is zero. Checks that the packet's length is
* reasonable, and that the IP6 version, length, are valid. Checks that the
* IP6 source address is a legal unicast address. Shortens packets to the IP6
* length, if the IP length is shorter than the nominal packet length (due to
* Ethernet padding, for example). Pushes invalid packets out on output 1,
* unless output 1 was unused; if so, drops invalid packets.
*
+ * Keyword arguments are:
+ *
+ * =item BADADDRS
+ *
* The BADADDRS argument is a space-separated list of IP6 addresses that are
* not to be tolerated as source addresses. 0::0 is a bad address for routers,
* for example, but okay for link local packets.
*
+ * =item OFFSET
+ *
+ * Unsigned integer. Byte position at which the IP6 header begins. Default is 0.
+ *
* =a MarkIP6Header */
class CheckIP6Header : public Element {
+ int _offset;
+
int _n_bad_src;
IP6Address *_bad_src; // array of illegal IP6 src addresses.
#ifdef CLICK_LINUXMODULE
--
1.6.2
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ click mailing list [email protected] https://amsterdam.lcs.mit.edu/mailman/listinfo/click
