Skip to content

Commit

Permalink
pktloc: support to specify a shift operator for packet locations
Browse files Browse the repository at this point in the history
no users yet though.
  • Loading branch information
tgraf committed Nov 4, 2010
1 parent d283c8e commit 59880cb
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 21 deletions.
44 changes: 32 additions & 12 deletions etc/pktloc
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,32 @@
# Location definitions for packet matching
#

# name alignment offset mask
ip.version u8 net+0 0xF0
# name alignment offset mask shift
ip.version u8 net+0 0xF0 4
ip.hdrlen u8 net+0 0x0F
ip.diffserv u8 net+1
ip.length u16 net+2
ip.id u16 net+4
ip.df u8 net+6 0x40
ip.mf u8 net+6 0x20
ip.flag.res u8 net+6 0xff 7
ip.df u8 net+6 0x40 6
ip.mf u8 net+6 0x20 5
ip.offset u16 net+6 0x1FFF
ip.ttl u8 net+8
ip.proto u8 net+9
ip.chksum u16 net+10
ip.src u32 net+12
ip.dst u32 net+16

# if ip.ihl > 5
ip.opts u32 net+20


#
# IP version 6
#
# name alignment offset mask
ip6.version u8 net+0 0xF0
ip6.tc u16 net+0 0xFF0
# name alignment offset mask shift
ip6.version u8 net+0 0xF0 4
ip6.tc u16 net+0 0xFF0 4
ip6.flowlabel u32 net+0 0xFFFFF
ip6.length u16 net+4
ip6.nexthdr u8 net+6
Expand All @@ -33,14 +38,29 @@ ip6.dst 16 net+24
#
# Transmission Control Protocol (TCP)
#
# name alignment offset mask
# name alignment offset mask shift
tcp.sport u16 tcp+0
tcp.dport u16 tcp+2
tcp.seq u32 tcp+4
tcp.ack u32 tcp+8
tcp.off u8 tcp+12 0xF0
tcp.reserved u8 tcp+12 0x0F
# FLAGS

# Data offset (4 bits)
tcp.off u8 tcp+12 0xF0 4

# Reserved [0 0 0] (3 bits)
tcp.reserved u8 tcp+12 0x04 1

# ECN [N C E] (3 bits)
tcp.ecn u16 tcp+12 0x01C00 6

# Individual TCP flags (0|1) (6 bits in total)
tcp.flag.urg u8 tcp+13 0x20 5
tcp.flag.ack u8 tcp+13 0x10 4
tcp.flag.psh u8 tcp+13 0x08 3
tcp.flag.rst u8 tcp+13 0x04 2
tpc.flag.syn u8 tcp+13 0x02 1
tcp.flag.fin u8 tcp+13 0x01

tcp.win u16 tcp+14
tcp.csum u16 tcp+16
tcp.urg u16 tcp+18
Expand All @@ -49,7 +69,7 @@ tcp.opts u32 tcp+20
#
# User Datagram Protocol (UDP)
#
# name alignment offset mask
# name alignment offset mask shift
udp.sport u16 tcp+0
udp.dport u16 tcp+2
udp.length u16 tcp+4
Expand Down
1 change: 1 addition & 0 deletions include/netlink/route/pktloc.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ struct rtnl_pktloc
{
char * name;
uint8_t layer;
uint8_t shift;
uint16_t offset;
uint16_t align;
uint32_t mask;
Expand Down
5 changes: 3 additions & 2 deletions lib/route/pktloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -222,8 +222,9 @@ int rtnl_pktloc_add(struct rtnl_pktloc *loc)
}

NL_DBG(2, "New packet location entry \"%s\" align=%u layer=%u "
"offset=%u mask=%#x refnt=%u\n", loc->name, loc->align,
loc->layer, loc->offset, loc->mask, loc->refcnt);
"offset=%u mask=%#x shift=%u refnt=%u\n",
loc->name, loc->align, loc->layer, loc->offset,
loc->mask, loc->shift, loc->refcnt);

nl_list_add_tail(&loc->list, &pktloc_name_ht[pktloc_hash(loc->name)]);

Expand Down
13 changes: 11 additions & 2 deletions lib/route/pktloc_syntax.y
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

%parse-param {void *scanner}
%lex-param {void *scanner}
%expect 1

%union {
struct rtnl_pktloc *l;
Expand All @@ -32,7 +33,7 @@ static void yyerror(YYLTYPE *locp, void *scanner, const char *msg)
%token <i> ERROR NUMBER LAYER ALIGN
%token <s> NAME

%type <i> mask layer align
%type <i> mask layer align shift
%type <l> location

%destructor { free($$); } NAME
Expand All @@ -47,7 +48,7 @@ input:
;

location:
NAME align layer NUMBER mask
NAME align layer NUMBER mask shift
{
struct rtnl_pktloc *loc;

Expand All @@ -62,6 +63,7 @@ location:
loc->layer = $3;
loc->offset = $4;
loc->mask = $5;
loc->shift = $6;

if (rtnl_pktloc_add(loc) < 0) {
NL_DBG(1, "Duplicate packet location entry "
Expand Down Expand Up @@ -92,3 +94,10 @@ mask:
| NUMBER
{ $$ = $1; }
;

shift:
/* empty */
{ $$ = 0; }
| NUMBER
{ $$ = $1; }
;
14 changes: 9 additions & 5 deletions src/nl-pktloc-lookup.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ static void dump_u32_style(struct rtnl_pktloc *loc, uint32_t value)
nl_cli_fatal(EINVAL, "u32 does not support link "
"layer locations.");

if (loc->shift > 0)
nl_cli_fatal(EINVAL, "u32 does not support shifting.");

printf("%s %x %x at %s%u\n",
align_txt[loc->align],
value, loc->mask ? loc->mask : align_mask[loc->align],
Expand All @@ -80,21 +83,22 @@ static char *get_align_txt(struct rtnl_pktloc *loc)

static void dump_loc(struct rtnl_pktloc *loc)
{
printf("%s = %s at %s+%u %#x\n",
printf("%s = %s at %s+%u & %#x >> %u\n",
loc->name, get_align_txt(loc), layer_txt[loc->layer],
loc->offset, loc->mask);
loc->offset, loc->mask, loc->shift);
}

static void list_cb(struct rtnl_pktloc *loc, void *arg)
{
printf("%-26s %-5s %3s+%-4u %#-10x %u\n",
printf("%-26s %-5s %3s+%-4u %#-10x %-8u %u\n",
loc->name, get_align_txt(loc), layer_txt[loc->layer],
loc->offset, loc->mask, loc->refcnt);
loc->offset, loc->mask, loc->shift, loc->refcnt);
}

static void do_list(void)
{
printf("name align offset mask refcnt\n");
printf(
"name align offset mask shift refcnt\n");
printf("---------------------------------------------------------\n");

rtnl_pktloc_foreach(&list_cb, NULL);
Expand Down

0 comments on commit 59880cb

Please sign in to comment.