summaryrefslogtreecommitdiff
path: root/usr/src/cmd/cmd-inet/sbin/dhcpagent/interface.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/cmd-inet/sbin/dhcpagent/interface.c')
-rw-r--r--usr/src/cmd/cmd-inet/sbin/dhcpagent/interface.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/usr/src/cmd/cmd-inet/sbin/dhcpagent/interface.c b/usr/src/cmd/cmd-inet/sbin/dhcpagent/interface.c
index fd18717259..3e4a2dd285 100644
--- a/usr/src/cmd/cmd-inet/sbin/dhcpagent/interface.c
+++ b/usr/src/cmd/cmd-inet/sbin/dhcpagent/interface.c
@@ -438,6 +438,7 @@ insert_lif(dhcp_pif_t *pif, const char *lname, int *error)
lif->lif_max = 1024;
else
lif->lif_max = lifr.lifr_mtu;
+ lif->lif_mtu_orig = lif->lif_mtu = lif->lif_max;
if (ioctl(fd, SIOCGLIFADDR, &lifr) == -1) {
if (errno == ENXIO)
@@ -1227,6 +1228,41 @@ clear_lif_dhcp(dhcp_lif_t *lif)
(void) ioctl(fd, SIOCSLIFFLAGS, &lifr);
}
+boolean_t
+set_lif_mtu(dhcp_lif_t *lif, uint_t mtu)
+{
+ struct lifreq lifr;
+ int fd = lif->lif_pif->pif_isv6 ? v6_sock_fd : v4_sock_fd;
+
+ if (lif->lif_mtu == mtu) {
+ /*
+ * We set the MTU to this value already.
+ */
+ return (B_TRUE);
+ }
+
+ (void) memset(&lifr, 0, sizeof (lifr));
+ (void) strlcpy(lifr.lifr_name, lif->lif_name, LIFNAMSIZ);
+ lifr.lifr_mtu = mtu;
+
+ if (ioctl(fd, SIOCSLIFMTU, &lifr) == -1) {
+ return (B_FALSE);
+ }
+
+ lif->lif_mtu = mtu;
+ return (B_TRUE);
+}
+
+boolean_t
+clear_lif_mtu(dhcp_lif_t *lif)
+{
+ if (lif->lif_mtu == lif->lif_mtu_orig) {
+ return (B_TRUE);
+ }
+
+ return (set_lif_mtu(lif, lif->lif_mtu_orig));
+}
+
/*
* set_lif_deprecated(): Set the "deprecated" flag to tell users that this
* address will be going away. As the interface is