summaryrefslogtreecommitdiffstats
path: root/src/proto.c
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2016-03-26 10:04:48 +0000
committerPatrick McHardy <kaber@trash.net>2016-04-24 22:15:10 +0100
commit7f9cd6f5841132109aa1d514a0624eeb89747011 (patch)
tree02e43a46e09da3a6add0d5fce8c09c405df9a9cf /src/proto.c
parent1f229e4f83a651029e7cdc13e24a2827a6af25d2 (diff)
proto: add protocol header fields filter and ordering for packet decoding
The next patch introduces packet decoding for tracing messages based on the proto definitions. In order to provide a readable output, add a filter to surpress uninteresting header fields and allow to specify and explicit output order. Signed-off-by: Patrick McHardy <kaber@trash.net>
Diffstat (limited to 'src/proto.c')
-rw-r--r--src/proto.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/proto.c b/src/proto.c
index 329d9919..cecde0f4 100644
--- a/src/proto.c
+++ b/src/proto.c
@@ -244,6 +244,12 @@ const struct proto_desc proto_ah = {
[AHHDR_SPI] = AHHDR_FIELD("spi", spi),
[AHHDR_SEQUENCE] = AHHDR_FIELD("sequence", seq_no),
},
+ .format = {
+ .order = {
+ AHHDR_SPI, AHHDR_HDRLENGTH, AHHDR_NEXTHDR,
+ },
+ .filter = (1 << AHHDR_RESERVED) | (1 << AHHDR_SEQUENCE)
+ },
};
/*
@@ -431,6 +437,11 @@ const struct proto_desc proto_tcp = {
[TCPHDR_CHECKSUM] = TCPHDR_FIELD("checksum", check),
[TCPHDR_URGPTR] = TCPHDR_FIELD("urgptr", urg_ptr),
},
+ .format = {
+ .filter = (1 << TCPHDR_SEQ) | (1 << TCPHDR_ACKSEQ) |
+ (1 << TCPHDR_DOFF) | (1 << TCPHDR_RESERVED) |
+ (1 << TCPHDR_URGPTR),
+ },
};
/*
@@ -535,6 +546,14 @@ const struct proto_desc proto_ip = {
[IPHDR_SADDR] = IPHDR_ADDR("saddr", saddr),
[IPHDR_DADDR] = IPHDR_ADDR("daddr", daddr),
},
+ .format = {
+ .order = {
+ IPHDR_SADDR, IPHDR_DADDR, IPHDR_TOS, IPHDR_TTL,
+ IPHDR_ID, IPHDR_PROTOCOL, IPHDR_LENGTH,
+ },
+ .filter = (1 << IPHDR_VERSION) | (1 << IPHDR_HDRLENGTH) |
+ (1 << IPHDR_FRAG_OFF),
+ },
};
/*
@@ -631,6 +650,14 @@ const struct proto_desc proto_ip6 = {
[IP6HDR_SADDR] = IP6HDR_ADDR("saddr", saddr),
[IP6HDR_DADDR] = IP6HDR_ADDR("daddr", daddr),
},
+ .format = {
+ .order = {
+ IP6HDR_SADDR, IP6HDR_DADDR, IP6HDR_PRIORITY,
+ IP6HDR_HOPLIMIT, IP6HDR_FLOWLABEL, IP6HDR_NEXTHDR,
+ IP6HDR_LENGTH,
+ },
+ .filter = (1 << IP6HDR_VERSION),
+ },
};
/*
@@ -719,6 +746,10 @@ const struct proto_desc proto_arp = {
[ARPHDR_PLN] = ARPHDR_FIELD("plen", ar_pln),
[ARPHDR_OP] = ARPHDR_TYPE("operation", &arpop_type, ar_op),
},
+ .format = {
+ .filter = (1 << ARPHDR_HRD) | (1 << ARPHDR_PRO) |
+ (1 << ARPHDR_HLN) | (1 << ARPHDR_PLN),
+ },
};
/*
@@ -818,6 +849,12 @@ const struct proto_desc proto_eth = {
[ETHHDR_SADDR] = ETHHDR_ADDR("saddr", ether_shost),
[ETHHDR_TYPE] = ETHHDR_TYPE("type", ether_type),
},
+ .format = {
+ .order = {
+ ETHHDR_SADDR, ETHHDR_DADDR, ETHHDR_TYPE,
+ },
+ },
+
};
/*