summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAhmed Abdelsalam <ahabdels@gmail.com>2020-08-07 15:02:16 +0000
committerfxlb <devel.fx.lebail@orange.fr>2020-08-07 16:11:20 +0000
commit1103418a18d71c0fe448c0459a42ff1bc20bb0dc (patch)
tree4f2d85577399073f177d790246e0cc748b74ed5a
parent58d8b5d435492e136e3cf1fee13299f8caf27815 (diff)
downloadtcpdump-1103418a18d71c0fe448c0459a42ff1bc20bb0dc.tar.gz
Add support for ethernet IP protocol
The SRv6 network programming defines a new IP protocol number [1]. The new protocol number is used in the Next Header field of an IPv6 header or any extension header indicates that the payload is an Ethernet. IANA has assigned 143 as the protocol number of ethernet [2]. The SRv6 packet has the following format: IPv6 HDR + SRH + Ethernet HDR + IPv4/IPv6 packet This patch allows TCPDUMP to dissect such SRv6 packets. [1] https://tools.ietf.org/html/draft-ietf-spring-srv6-network-programming-16#section-9.1 [2] https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml Signed-off-by: Ahmed Abdelsalam <ahabdels@gmail.com>
-rw-r--r--ipproto.c1
-rw-r--r--ipproto.h3
-rw-r--r--print-ip-demux.c10
-rw-r--r--tests/TESTLIST1
-rw-r--r--tests/ipv6-srh-ipproto-ether.out1
-rw-r--r--tests/ipv6-srh-ipproto-ether.pcapbin0 -> 236 bytes
6 files changed, 16 insertions, 0 deletions
diff --git a/ipproto.c b/ipproto.c
index 58ceeeba..a3b0714a 100644
--- a/ipproto.c
+++ b/ipproto.c
@@ -50,6 +50,7 @@ const struct tok ipproto_values[] = {
{ IPPROTO_PGM, "PGM" },
{ IPPROTO_SCTP, "SCTP" },
{ IPPROTO_MOBILITY, "Mobility" },
+ { IPPROTO_ETHERNET, "Ethernet" },
{ 0, NULL }
};
diff --git a/ipproto.h b/ipproto.h
index 845cf008..baec4bdc 100644
--- a/ipproto.h
+++ b/ipproto.h
@@ -140,3 +140,6 @@ extern const char *netdb_protoname (const uint8_t);
#ifndef IPPROTO_MOBILITY
#define IPPROTO_MOBILITY 135
#endif
+#ifndef IPPROTO_ETHERNET
+#define IPPROTO_ETHERNET 143 /* TEMPORARY - registered 2020-01-31, expires 2021-01-31 */
+#endif
diff --git a/print-ip-demux.c b/print-ip-demux.c
index 7df0f709..8b53187c 100644
--- a/print-ip-demux.c
+++ b/print-ip-demux.c
@@ -208,6 +208,16 @@ again:
pgm_print(ndo, bp, length, iph);
break;
+ case IPPROTO_ETHERNET:
+ if (ver == 6)
+ ether_print(ndo, bp, length, ND_BYTES_AVAILABLE_AFTER(bp), NULL, NULL);
+ else {
+ ND_PRINT("[%s requires IPv6]",
+ tok2str(ipproto_values,"unknown",nh));
+ nd_print_invalid(ndo);
+ }
+ break;
+
case IPPROTO_NONE:
ND_PRINT("no next header");
break;
diff --git a/tests/TESTLIST b/tests/TESTLIST
index 90fc31d2..8da36269 100644
--- a/tests/TESTLIST
+++ b/tests/TESTLIST
@@ -285,6 +285,7 @@ ipv6-bad-version ipv6-bad-version.pcap ipv6-bad-version.out
ipv6-routing-header ipv6-routing-header.pcap ipv6-routing-header.out -v
ipv6-srh-ext-header ipv6-srh-ext-header.pcap ipv6-srh-ext-header.out -v
ipv6-srh-insert-cksum ipv6-srh-insert-cksum.pcap ipv6-srh-insert-cksum.out -v
+ipv6-srh-ipproto-ether ipv6-srh-ipproto-ether.pcap ipv6-srh-ipproto-ether.out -ev
# Loopback/CTP test case
loopback loopback.pcap loopback.out
diff --git a/tests/ipv6-srh-ipproto-ether.out b/tests/ipv6-srh-ipproto-ether.out
new file mode 100644
index 00000000..96a99bc7
--- /dev/null
+++ b/tests/ipv6-srh-ipproto-ether.out
@@ -0,0 +1 @@
+ 1 15:07:04.802036 be:f5:06:09:44:74 > d6:67:19:4e:0f:4f, ethertype IPv6 (0x86dd), length 196: (flowlabel 0xde027, hlim 63, next-header Routing (43) payload length: 142) a::1 > c::2: srcrt (len=2, type=4, segleft=0, last-entry=0, flags=0x0, tag=0, [0]c::2) ae:64:42:3b:5b:9a > 1e:1d:df:cd:54:7a, ethertype IPv6 (0x86dd), length 118: (flowlabel 0xde027, hlim 64, next-header ICMPv6 (58) payload length: 64) a::2 > e::2: [icmp6 sum ok] ICMP6, echo request, id 18516, seq 1339
diff --git a/tests/ipv6-srh-ipproto-ether.pcap b/tests/ipv6-srh-ipproto-ether.pcap
new file mode 100644
index 00000000..30181e4d
--- /dev/null
+++ b/tests/ipv6-srh-ipproto-ether.pcap
Binary files differ