From 11c5f88f81cb628988ddad405c5295fa237b3311 Mon Sep 17 00:00:00 2001 From: Patrick McHardy Date: Tue, 28 Jul 2009 14:17:42 +0200 Subject: payload: add DCCP packet type definitions # nft describe dccp type payload expression, datatype dccp_pkttype (DCCP packet type) (basetype integer), 4 bits pre-defined symbolic constants: request 0x0 response 0x1 data 0x2 ack 0x3 dataack 0x4 closereq 0x5 close 0x6 reset 0x7 sync 0x8 syncack 0x9 Signed-off-by: Patrick McHardy --- src/parser.y | 1 + src/payload.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) (limited to 'src') diff --git a/src/parser.y b/src/parser.y index 419dcd72..3004cb25 100644 --- a/src/parser.y +++ b/src/parser.y @@ -1439,6 +1439,7 @@ dccp_hdr_expr : DCCP dccp_hdr_field dccp_hdr_field : SPORT { $$ = DCCPHDR_SPORT; } | DPORT { $$ = DCCPHDR_DPORT; } + | TYPE { $$ = DCCPHDR_TYPE; } ; sctp_hdr_expr : SCTP sctp_hdr_field diff --git a/src/payload.c b/src/payload.c index f41d4c17..944fed1b 100644 --- a/src/payload.c +++ b/src/payload.c @@ -691,6 +691,33 @@ const struct payload_desc payload_tcp = { * DCCP */ +static const struct symbol_table dccp_pkttype_tbl = { + .symbols = { + SYMBOL("request", DCCP_PKT_REQUEST), + SYMBOL("response", DCCP_PKT_RESPONSE), + SYMBOL("data", DCCP_PKT_DATA), + SYMBOL("ack", DCCP_PKT_ACK), + SYMBOL("dataack", DCCP_PKT_DATAACK), + SYMBOL("closereq", DCCP_PKT_CLOSEREQ), + SYMBOL("close", DCCP_PKT_CLOSE), + SYMBOL("reset", DCCP_PKT_RESET), + SYMBOL("sync", DCCP_PKT_SYNC), + SYMBOL("syncack", DCCP_PKT_SYNCACK), + SYMBOL_LIST_END + }, +}; + +static const struct datatype dccp_pkttype_type = { + .type = TYPE_DCCP_PKTTYPE, + .name = "dccp_pkttype", + .desc = "DCCP packet type", + .byteorder = BYTEORDER_INVALID, + .size = 4, + .basetype = &integer_type, + .sym_tbl = &dccp_pkttype_tbl, +}; + + #define DCCPHDR_FIELD(__name, __member) \ HDR_FIELD(__name, struct dccp_hdr, __member) @@ -700,6 +727,7 @@ const struct payload_desc payload_dccp = { .templates = { [DCCPHDR_SPORT] = INET_SERVICE("sport", struct dccp_hdr, dccph_sport), [DCCPHDR_DPORT] = INET_SERVICE("dport", struct dccp_hdr, dccph_dport), + [DCCPHDR_TYPE] = HDR_BITFIELD("type", &dccp_pkttype_type, 67, 4), }, }; @@ -925,6 +953,7 @@ static void __init payload_init(void) { datatype_register(&icmp_type_type); datatype_register(&tcp_flag_type); + datatype_register(&dccp_pkttype_type); datatype_register(&arpop_type); datatype_register(ðertype_type); } -- cgit v1.2.3