diff options
Diffstat (limited to 'usr/src/cmd/cmd-inet/sbin/dhcpagent/interface.c')
-rw-r--r-- | usr/src/cmd/cmd-inet/sbin/dhcpagent/interface.c | 36 |
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 |