[netsniff-ng] [PATCH v2 3/4] trafgen: parser: Add syntax for MPLS header creating

2016-02-07 Thread Vadim Kochan
Add 'mpls()' function for creating MPLS header with parameters:

lbl|label   MPLS label
lastIndicates the last label on MPLS stack
tc|tclass|exp   Traffic Class (TC)
ttl TTL (Time To Live)

Currently only unicast MPLS is supported, but multicast might be set
via 'eth()' function.

Signed-off-by: Vadim Kochan 
---
 trafgen_lexer.l  |  7 +++
 trafgen_parser.y | 34 +-
 2 files changed, 40 insertions(+), 1 deletion(-)

diff --git a/trafgen_lexer.l b/trafgen_lexer.l
index e1d1a3f..3c624f8 100644
--- a/trafgen_lexer.l
+++ b/trafgen_lexer.l
@@ -120,6 +120,12 @@ ip4_addr   ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)
 "1ad"  { return K_1AD; }
 "1q"   { return K_1Q; }
 
+   /* MPLS (Multi Protocol Label Switching) */
+"lbl"|"label"  { return K_LABEL; }
+"last" { return K_LAST; }
+"tc"|"tclass"  { return K_TC; }
+"exp"  { return K_EXP; }
+
/* ARP */
 "sha"|"smac"   { return K_SHA; }
 "spa"|"sip"{ return K_SPA; }
@@ -167,6 +173,7 @@ ip4_addr([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)
 
 "eth"  { return K_ETH; }
 "vlan" { return K_VLAN; }
+"mpls" { return K_MPLS; }
 "arp"  { return K_ARP; }
 "ip4"|"ipv4"   { return K_IP4; }
 "udp"  { return K_UDP; }
diff --git a/trafgen_parser.y b/trafgen_parser.y
index 655b0ba..0b1c0fb 100644
--- a/trafgen_parser.y
+++ b/trafgen_parser.y
@@ -356,9 +356,10 @@ static void proto_add(enum proto_id pid)
 %token K_SPORT K_DPORT
 %token K_SEQ K_ACK_SEQ K_DOFF K_CWR K_ECE K_URG K_ACK K_PSH K_RST K_SYN K_FIN 
K_WINDOW K_URG_PTR
 %token K_TPID K_TCI K_PCP K_DEI K_1Q K_1AD
+%token K_LABEL K_TC K_LAST K_EXP
 
 %token K_ETH
-%token K_VLAN
+%token K_VLAN K_MPLS
 %token K_ARP
 %token K_IP4
 %token K_UDP K_TCP
@@ -583,6 +584,7 @@ ddec
 proto
: eth_proto { }
| vlan_proto { }
+   | mpls_proto { }
| arp_proto { }
| ip4_proto { }
| udp_proto { }
@@ -653,6 +655,36 @@ vlan_field
{ proto_field_set_be16(hdr, VLAN_VID, $5); }
;
 
+mpls_proto
+   : mpls '(' mpls_param_list ')' { }
+   ;
+
+mpls
+   : K_MPLS { proto_add(PROTO_MPLS); }
+   ;
+
+mpls_param_list
+   : { }
+   | mpls_field { }
+   | mpls_field delimiter mpls_param_list { }
+   ;
+
+mpls_tc
+   : K_TC { }
+   | K_EXP { }
+   ;
+
+mpls_field
+   : K_LABEL skip_white '=' skip_white number
+   { proto_field_set_be32(hdr, MPLS_LABEL, $5); }
+   | mpls_tc skip_white '=' skip_white number
+   { proto_field_set_be32(hdr, MPLS_TC, $5); }
+   | K_LAST skip_white '=' skip_white number
+   { proto_field_set_be32(hdr, MPLS_LAST, $5); }
+   | K_TTL skip_white '=' skip_white number
+   { proto_field_set_be32(hdr, MPLS_TTL, $5); }
+   ;
+
 arp_proto
: arp '(' arp_param_list ')' { }
;
-- 
2.6.3

-- 
You received this message because you are subscribed to the Google Groups 
"netsniff-ng" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to netsniff-ng+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


[netsniff-ng] [PATCH v2 1/4] trafgen: proto: Fix bad field masking

2016-02-07 Thread Vadim Kochan
Current logic does OR of existing field value & shift-masked
specified value, which is not enough as 0s bits from
the specified value will be not set (be cause of OR),
so fixed it by reseting original field value by AND with
reverted field mask, in otherwords - bits part of original field
value is reset to 0s and only after OR-ed with specified shift-masked
value.

Signed-off-by: Vadim Kochan 
---
 trafgen_proto.c | 24 
 1 file changed, 20 insertions(+), 4 deletions(-)

diff --git a/trafgen_proto.c b/trafgen_proto.c
index efa8fce..214547e 100644
--- a/trafgen_proto.c
+++ b/trafgen_proto.c
@@ -182,7 +182,9 @@ static void __proto_field_set_bytes(struct proto_hdr *hdr, 
uint32_t fid,
uint8_t *bytes, bool is_default, bool is_be)
 {
struct proto_field *field;
-   uint8_t *payload;
+   uint8_t *payload, *p8;
+   uint16_t *p16;
+   uint32_t *p32;
uint32_t v32;
uint16_t v16;
uint8_t v8;
@@ -195,18 +197,32 @@ static void __proto_field_set_bytes(struct proto_hdr 
*hdr, uint32_t fid,
payload = _packet()->payload[field->pkt_offset];
 
if (field->len == 1) {
+   p8 = payload;
+   *p8 = field->mask ? *p8 & ~field->mask : *p8;
+
v8 = field_shift_and_mask(field, *bytes);
-   v8 = field->mask ? (v8 | *payload) : v8;
+   v8 = field->mask ? (v8 | *p8) : v8;
+
bytes = 
} else if (field->len == 2) {
+   p16 = (uint16_t *)payload;
+   *p16 = be16_to_cpu(*p16);
+   *p16 = cpu_to_be16(field->mask ? *p16 & ~field->mask : *p16);
+
v16 = field_shift_and_mask(field, *(uint16_t *)bytes);
v16 = is_be ? cpu_to_be16(v16) : v16;
-   v16 = field->mask ? (v16 | *(uint16_t *)payload) : v16;
+   v16 = field->mask ? (v16 | *p16) : v16;
+
bytes = (uint8_t *)
} else if (field->len == 4) {
+   p32 = (uint32_t *)payload;
+   *p32 = be32_to_cpu(*p32);
+   *p32 = cpu_to_be32(field->mask ? *p32 & ~field->mask : *p32);
+
v32 = field_shift_and_mask(field, *(uint32_t *)bytes);
v32 = is_be ? cpu_to_be32(v32) : v32;
-   v32 = field->mask ? (v32 | *(uint32_t *)payload) : v32;
+   v32 = field->mask ? (v32 | *p32) : v32;
+
bytes = (uint8_t *)
}
 
-- 
2.6.3

-- 
You received this message because you are subscribed to the Google Groups 
"netsniff-ng" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to netsniff-ng+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.