From 44e97b2009dc2bee93f25684b274f458f50ea667 Mon Sep 17 00:00:00 2001 From: Vadim Kochan Date: Sun, 18 Dec 2016 11:52:48 +0200 Subject: trafgen: parser: Parse IPv6 address by strict match pattern Used IPv6 pattern from nftables project [1] to match valid only IPv6 address to do not mess with MAC or other syntax patterns with ':' symbol. [1] http://git.netfilter.org/nftables/tree/src/scanner.l Signed-off-by: Vadim Kochan [tk: add refrence to nftables source] Signed-off-by: Tobias Klauser --- trafgen_lexer.l | 52 ++++++++++++++++++++++++++++++++++++++++++++++++---- trafgen_parser.y | 2 +- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/trafgen_lexer.l b/trafgen_lexer.l index 025fbfe..65ec245 100644 --- a/trafgen_lexer.l +++ b/trafgen_lexer.l @@ -77,13 +77,57 @@ number_bin ([0]?[b][0-1]+) number_dec (([0])|([1-9][0-9]*)) number_ascii ([a-zA-Z]) +/* rules taken from nftables scanner.l */ +hex4 ([[:xdigit:]]{1,4}) +v680 (({hex4}:){7}{hex4}) +v670 ((:)((:{hex4}){7})) +v671 ((({hex4}:){1})((:{hex4}){6})) +v672 ((({hex4}:){2})((:{hex4}){5})) +v673 ((({hex4}:){3})((:{hex4}){4})) +v674 ((({hex4}:){4})((:{hex4}){3})) +v675 ((({hex4}:){5})((:{hex4}){2})) +v676 ((({hex4}:){6})(:{hex4}{1})) +v677 ((({hex4}:){7})(:)) +v67 ({v670}|{v671}|{v672}|{v673}|{v674}|{v675}|{v676}|{v677}) +v660 ((:)((:{hex4}){6})) +v661 ((({hex4}:){1})((:{hex4}){5})) +v662 ((({hex4}:){2})((:{hex4}){4})) +v663 ((({hex4}:){3})((:{hex4}){3})) +v664 ((({hex4}:){4})((:{hex4}){2})) +v665 ((({hex4}:){5})((:{hex4}){1})) +v666 ((({hex4}:){6})(:)) +v66 ({v660}|{v661}|{v662}|{v663}|{v664}|{v665}|{v666}) +v650 ((:)((:{hex4}){5})) +v651 ((({hex4}:){1})((:{hex4}){4})) +v652 ((({hex4}:){2})((:{hex4}){3})) +v653 ((({hex4}:){3})((:{hex4}){2})) +v654 ((({hex4}:){4})(:{hex4}{1})) +v655 ((({hex4}:){5})(:)) +v65 ({v650}|{v651}|{v652}|{v653}|{v654}|{v655}) +v640 ((:)((:{hex4}){4})) +v641 ((({hex4}:){1})((:{hex4}){3})) +v642 ((({hex4}:){2})((:{hex4}){2})) +v643 ((({hex4}:){3})((:{hex4}){1})) +v644 ((({hex4}:){4})(:)) +v64 ({v640}|{v641}|{v642}|{v643}|{v644}) +v630 ((:)((:{hex4}){3})) +v631 ((({hex4}:){1})((:{hex4}){2})) +v632 ((({hex4}:){2})((:{hex4}){1})) +v633 ((({hex4}:){3})(:)) +v63 ({v630}|{v631}|{v632}|{v633}) +v620 ((:)((:{hex4}){2})) +v621 ((({hex4}:){1})((:{hex4}){1})) +v622 ((({hex4}:){2})(:)) +v62 ({v620}|{v621}|{v622}) +v610 ((:)(:{hex4}{1})) +v611 ((({hex4}:){1})(:)) +v61 ({v610}|{v611}) +v60 (::) + a_hex ([a-fA-F0-9]+) mac ({a_hex}:{a_hex}:{a_hex}:{a_hex}:{a_hex}:{a_hex}) ip4_addr ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+) - /* We're very permissive about IPv6 addresses the grammar accepts, as - * they can come in various different formats. In any case, - * inet_pton(AF_INET6, ...) will reject the invalid ones later on. */ -ip6_addr (({a_hex}?:)?({a_hex}?:)?({a_hex}?:)?({a_hex}?:)?({a_hex}?:)?({a_hex}?:)?({a_hex}?:)?({a_hex})?) +ip6_addr ({v680}|{v67}|{v66}|{v65}|{v64}|{v63}|{v62}|{v61}|{v60}) %% diff --git a/trafgen_parser.y b/trafgen_parser.y index bfeed2e..a1b8b0c 100644 --- a/trafgen_parser.y +++ b/trafgen_parser.y @@ -416,7 +416,7 @@ static void proto_field_expr_eval(void) else if (field->len == 4) proto_hdr_field_set_be32(hdr, field->id, field_expr.val.number); else - bug(); + proto_hdr_field_set_bytes(hdr, field->id, field_expr.val.bytes); break; case FIELD_EXPR_MAC: -- cgit v1.2.3-54-g00ecf