summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/datatype.h2
-rw-r--r--include/headers.h14
-rw-r--r--include/payload.h1
-rw-r--r--src/parser.y1
-rw-r--r--src/payload.c29
5 files changed, 47 insertions, 0 deletions
diff --git a/include/datatype.h b/include/datatype.h
index ea18f719..aa270c0e 100644
--- a/include/datatype.h
+++ b/include/datatype.h
@@ -18,6 +18,7 @@
* @TYPE_INET_SERVICE: internet service (integer subtype)
* @TYPE_ICMP_TYPE: ICMP type codes (integer subtype)
* @TYPE_TCP_FLAG: TCP flag (bitmask subtype)
+ * @TCPE_DCCP_PKTTYPE: DCCP packet type (integer subtype)
* @TYPE_MH_TYPE: Mobility Header type (integer subtype)
* @TYPE_TIME: relative time
* @TYPE_MARK: packet mark (integer subtype)
@@ -46,6 +47,7 @@ enum datatypes {
TYPE_INET_SERVICE,
TYPE_ICMP_TYPE,
TYPE_TCP_FLAG,
+ TYPE_DCCP_PKTTYPE,
TYPE_MH_TYPE,
TYPE_TIME,
TYPE_MARK,
diff --git a/include/headers.h b/include/headers.h
index 5bbfdc49..469d6740 100644
--- a/include/headers.h
+++ b/include/headers.h
@@ -39,6 +39,20 @@ struct ip_comp_hdr {
# define IPPROTO_DCCP 33
#endif
+enum dccp_pkt_type {
+ DCCP_PKT_REQUEST = 0,
+ DCCP_PKT_RESPONSE,
+ DCCP_PKT_DATA,
+ DCCP_PKT_ACK,
+ DCCP_PKT_DATAACK,
+ DCCP_PKT_CLOSEREQ,
+ DCCP_PKT_CLOSE,
+ DCCP_PKT_RESET,
+ DCCP_PKT_SYNC,
+ DCCP_PKT_SYNCACK,
+ DCCP_PKT_INVALID,
+};
+
struct dccp_hdr {
uint16_t dccph_sport,
dccph_dport;
diff --git a/include/payload.h b/include/payload.h
index 3a7150bd..8f5398b7 100644
--- a/include/payload.h
+++ b/include/payload.h
@@ -258,6 +258,7 @@ enum dccp_hdr_fields {
DCCPHDR_INVALID,
DCCPHDR_SPORT,
DCCPHDR_DPORT,
+ DCCPHDR_TYPE,
};
enum sctp_hdr_fields {
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(&ethertype_type);
}