From ec2b58ea4dc45079470efedaa632da25031d5adc Mon Sep 17 00:00:00 2001
From: Stefano Brivio <sbrivio@redhat.com>
Date: Tue, 7 Sep 2021 11:19:57 +0200
Subject: conf, dhcp, ndp: Fix message about default MTU, make NDP consistent

Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
---
 conf.c | 15 ++++++++++++++-
 dhcp.c |  3 +--
 ndp.c  |  2 +-
 3 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/conf.c b/conf.c
index fd8f3cf..2622a38 100644
--- a/conf.c
+++ b/conf.c
@@ -617,7 +617,9 @@ static void usage(const char *name)
 		info("      /tmp/passt_ISO8601-TIMESTAMP_INSTANCE-NUMBER.pcap");
 
 	info(   "  -m, --mtu MTU	Assign MTU via DHCP/NDP");
-	info(   "    default: no MTU assigned via DHCP/NDP options");
+	info(   "    a zero value disables assignment");
+	info(   "    default: 65520: maximum 802.3 MTU minus 802.3 header");
+	info(   "                    length, rounded to 32 bits (IPv4 words)");
 	info(   "  -a, --address ADDR	Assign IPv4 or IPv6 address ADDR");
 	info(   "    can be specified zero to two times (for IPv4 and IPv6)");
 	info(   "    default: use addresses from interface with default route");
@@ -954,6 +956,12 @@ void conf(struct ctx *c, int argc, char **argv)
 
 			errno = 0;
 			c->mtu = strtol(optarg, NULL, 0);
+
+			if (!c->mtu) {
+				c->mtu = -1;
+				break;
+			}
+
 			if (c->mtu < ETH_MIN_MTU || c->mtu > (int)ETH_MAX_MTU ||
 			    errno) {
 				err("Invalid MTU: %s", optarg);
@@ -1132,6 +1140,11 @@ void conf(struct ctx *c, int argc, char **argv)
 		}
 	}
 
+	if (!c->mtu) {
+		c->mtu = (ETH_MAX_MTU - ETH_HLEN) /
+			 sizeof(uint32_t) * sizeof(uint32_t);
+	}
+
 	get_routes(c);
 	get_addrs(c);
 
diff --git a/dhcp.c b/dhcp.c
index 4969eec..24194ee 100644
--- a/dhcp.c
+++ b/dhcp.c
@@ -49,7 +49,6 @@ struct opt {
 static struct opt opts[255] = {
 	[1]  = { 0, 4, {                      0 }, 0, { 0 }, },	/* Mask */
 	[3]  = { 0, 4, {                      0 }, 0, { 0 }, },	/* Router */
-	[26] = { 0, 2, {             0xff, 0xf0 }, 0, { 0 }, },	/* MTU */
 	[51] = { 0, 4, { 0xff, 0xff, 0xff, 0xff }, 0, { 0 }, },	/* Lease time */
 	[53] = { 0, 1, {                      0 }, 0, { 0 }, },	/* Type */
 #define DHCPDISCOVER	1
@@ -319,7 +318,7 @@ int dhcp(struct ctx *c, struct ethhdr *eh, size_t len)
 		*(unsigned long *)&opts[121].s[10] = c->gw4;
 	}
 
-	if (c->mtu) {
+	if (c->mtu != -1) {
 		opts[26].slen = 2;
 		opts[26].s[0] = c->mtu / 256;
 		opts[26].s[1] = c->mtu % 256;
diff --git a/ndp.c b/ndp.c
index 74445ad..a1d76c1 100644
--- a/ndp.c
+++ b/ndp.c
@@ -116,7 +116,7 @@ int ndp(struct ctx *c, struct ethhdr *eh, size_t len)
 		memcpy(p, &c->addr6, 8);	/* prefix */
 		p += 16;
 
-		if (c->mtu) {
+		if (c->mtu != -1) {
 			*p++ = 5;			/* type */
 			*p++ = 1;			/* length */
 			p += 2;				/* reserved */
-- 
cgit v1.2.3