Add support for IPV6 routing header type 0 reserved field and addresses with corresponding tests Signed-off-by: Harsha Sharma <harshasharmaiitr@xxxxxxxxx> --- For struct exthdr_rt0, I have specified type to be IPPROTO_ROUTING due to which when exthdr_init_raw is called in exthdr_find_template which initialises expr->exthdr.desc to exthdr_protocols[type] and that will be $exthdr_rt and not &exthdr_rt0, when testing the testcases this warning comes 'rt0 rserved 2' mismatches 'rt unknown 0x2' and same for the addrs. Fot this one possible way is to define IPPROTO_ROUTING0 in header file in /usr/include/. Can anyone please suggest what will be the best way to fix these warnings ? I'll add more testcases once these warnings are fixed. Thanks. Changes in v2: -Changed log message -Added tests and removed errors but warning is still there include/exthdr.h | 2 ++ src/exthdr.c | 4 ++-- src/parser_bison.y | 6 ++---- tests/py/ip6/rt0.t | 4 ++++ tests/py/ip6/rt0.t.payload | 14 ++++++++++++++ 5 files changed, 24 insertions(+), 6 deletions(-) diff --git a/include/exthdr.h b/include/exthdr.h index 97ccc38..3930108 100644 --- a/include/exthdr.h +++ b/include/exthdr.h @@ -14,6 +14,8 @@ struct exthdr_desc { const char *name; uint8_t type; + unsigned int protocol_key; + const struct exthdr_desc *protocols[3]; struct proto_hdr_template templates[10]; }; diff --git a/src/exthdr.c b/src/exthdr.c index ac3e163..ddd0018 100644 --- a/src/exthdr.c +++ b/src/exthdr.c @@ -246,6 +246,8 @@ const struct exthdr_desc exthdr_rt2 = { HDR_TEMPLATE(__name, __dtype, struct ip6_rthdr0, __member) const struct exthdr_desc exthdr_rt0 = { + .name = "rt0", + .type = IPPROTO_ROUTING, .templates = { [RT0HDR_RESERVED] = RT0_FIELD("reserved", ip6r0_reserved, &integer_type), [RT0HDR_ADDR_1] = RT0_FIELD("addr[1]", ip6r0_addr[0], &ip6addr_type), @@ -260,13 +262,11 @@ const struct exthdr_desc exthdr_rt0 = { const struct exthdr_desc exthdr_rt = { .name = "rt", .type = IPPROTO_ROUTING, -#if 0 .protocol_key = RTHDR_TYPE, .protocols = { [0] = &exthdr_rt0, [2] = &exthdr_rt2, }, -#endif .templates = { [RTHDR_NEXTHDR] = RT_FIELD("nexthdr", ip6r_nxt, &inet_protocol_type), [RTHDR_HDRLENGTH] = RT_FIELD("hdrlength", ip6r_len, &integer_type), diff --git a/src/parser_bison.y b/src/parser_bison.y index 7016f5b..7c4e775 100644 --- a/src/parser_bison.y +++ b/src/parser_bison.y @@ -3697,10 +3697,8 @@ rt0_hdr_expr : RT0 rt0_hdr_field } ; -rt0_hdr_field : ADDR '[' NUM ']' - { - $$ = RT0HDR_ADDR_1 + $3 - 1; - } +rt0_hdr_field : ADDR'['NUM']' { $$ = RT0HDR_ADDR_1 + $3 - 1;} + | RESERVED { $$ = RT0HDR_RESERVED; } ; rt2_hdr_expr : RT2 rt2_hdr_field diff --git a/tests/py/ip6/rt0.t b/tests/py/ip6/rt0.t index 1d50a89..ebbae75 100644 --- a/tests/py/ip6/rt0.t +++ b/tests/py/ip6/rt0.t @@ -4,3 +4,7 @@ rt nexthop 192.168.0.1;fail rt nexthop fd00::1;ok;rt ip6 nexthop fd00::1 + +rt0 reserved 2;ok +rt0 addr [1] 2001:db8:0:1:1:1:1:1;ok +rt0 addr [2] 2001:db8:0:0:0:0:1:1;ok diff --git a/tests/py/ip6/rt0.t.payload b/tests/py/ip6/rt0.t.payload index 464b7f2..69577e7 100644 --- a/tests/py/ip6/rt0.t.payload +++ b/tests/py/ip6/rt0.t.payload @@ -3,3 +3,17 @@ ip6 test-ip6 output [ rt load nexthop6 => reg 1 ] [ cmp eq reg 1 0x000000fd 0x00000000 0x00000000 0x01000000 ] +# rt0 reserved 2 +ip6 test-ip6 output + [ exthdr load 1b @ 43 + 4 => reg 1 ] + [ cmp eq reg 1 0x00000002 ] + +# rt0 addr [1] 2001:db8:0:1:1:1:1:1 +ip6 test-ip6 output + [ exthdr load 16b @ 43 + 8 => reg 1 ] + [ cmp eq reg 1 0xb80d0120 0x01000000 0x01000100 0x01000100 ] + +# rt0 addr [2] 2001:db8:0:0:0:0:1:1 +ip6 test-ip6 output + [ exthdr load 16b @ 43 + 8 => reg 1 ] + [ cmp eq reg 1 0xb80d0120 0x00000000 0x00000000 0x01000100 ] -- 2.11.0 -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html