summaryrefslogtreecommitdiffstats
path: root/sys/net
diff options
context:
space:
mode:
Diffstat (limited to 'sys/net')
-rw-r--r--sys/net/if.c30
-rw-r--r--sys/net/if.h12
-rw-r--r--sys/net/if_tap.c4
-rw-r--r--sys/net/if_var.h2
-rw-r--r--sys/net/rtsock.c4
5 files changed, 26 insertions, 26 deletions
diff --git a/sys/net/if.c b/sys/net/if.c
index 1dd37ec..969963d 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -1234,6 +1234,7 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td)
struct ifreq *ifr;
struct ifstat *ifs;
int error = 0;
+ int new_flags;
ifr = (struct ifreq *)data;
switch (cmd) {
@@ -1242,7 +1243,8 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td)
break;
case SIOCGIFFLAGS:
- ifr->ifr_flags = ifp->if_flags;
+ ifr->ifr_flags = ifp->if_flags & 0xffff;
+ ifr->ifr_flagshigh = ifp->if_flags >> 16;
break;
case SIOCGIFCAP:
@@ -1272,22 +1274,23 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td)
error = suser(td);
if (error)
return (error);
- ifr->ifr_prevflags = ifp->if_flags;
+ new_flags = (ifr->ifr_flags & 0xffff) |
+ (ifr->ifr_flagshigh << 16);
if (ifp->if_flags & IFF_SMART) {
/* Smart drivers twiddle their own routes */
} else if (ifp->if_flags & IFF_UP &&
- (ifr->ifr_flags & IFF_UP) == 0) {
+ (new_flags & IFF_UP) == 0) {
int s = splimp();
if_down(ifp);
splx(s);
- } else if (ifr->ifr_flags & IFF_UP &&
+ } else if (new_flags & IFF_UP &&
(ifp->if_flags & IFF_UP) == 0) {
int s = splimp();
if_up(ifp);
splx(s);
}
ifp->if_flags = (ifp->if_flags & IFF_CANTCHANGE) |
- (ifr->ifr_flags &~ IFF_CANTCHANGE);
+ (new_flags &~ IFF_CANTCHANGE);
if (ifp->if_ioctl)
(void) (*ifp->if_ioctl)(ifp, cmd, data);
getmicrotime(&ifp->if_lastchange);
@@ -1438,7 +1441,7 @@ ifioctl(so, cmd, data, td)
struct ifnet *ifp;
struct ifreq *ifr;
int error;
- short oif_flags;
+ int oif_flags;
switch (cmd) {
case SIOCGIFCONF:
@@ -1573,7 +1576,8 @@ ifpromisc(ifp, pswitch)
return (0);
ifp->if_flags &= ~IFF_PROMISC;
}
- ifr.ifr_flags = ifp->if_flags;
+ ifr.ifr_flags = ifp->if_flags & 0xffff;
+ ifr.ifr_flagshigh = ifp->if_flags >> 16;
error = (*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifr);
if (error == 0) {
log(LOG_INFO, "%s%d: promiscuous mode %s\n",
@@ -1695,7 +1699,8 @@ if_allmulti(ifp, onswitch)
if (onswitch) {
if (ifp->if_amcount++ == 0) {
ifp->if_flags |= IFF_ALLMULTI;
- ifr.ifr_flags = ifp->if_flags;
+ ifr.ifr_flags = ifp->if_flags & 0xffff;
+ ifr.ifr_flagshigh = ifp->if_flags >> 16;
error = ifp->if_ioctl(ifp, SIOCSIFFLAGS, (caddr_t)&ifr);
}
} else {
@@ -1704,7 +1709,8 @@ if_allmulti(ifp, onswitch)
} else {
ifp->if_amcount = 0;
ifp->if_flags &= ~IFF_ALLMULTI;
- ifr.ifr_flags = ifp->if_flags;
+ ifr.ifr_flags = ifp->if_flags & 0xffff;;
+ ifr.ifr_flagshigh = ifp->if_flags >> 16;
error = ifp->if_ioctl(ifp, SIOCSIFFLAGS, (caddr_t)&ifr);
}
}
@@ -1919,10 +1925,12 @@ if_setlladdr(struct ifnet *ifp, const u_char *lladdr, int len)
*/
if ((ifp->if_flags & IFF_UP) != 0) {
ifp->if_flags &= ~IFF_UP;
- ifr.ifr_flags = ifp->if_flags;
+ ifr.ifr_flags = ifp->if_flags & 0xffff;
+ ifr.ifr_flagshigh = ifp->if_flags >> 16;
(*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifr);
ifp->if_flags |= IFF_UP;
- ifr.ifr_flags = ifp->if_flags;
+ ifr.ifr_flags = ifp->if_flags & 0xffff;
+ ifr.ifr_flagshigh = ifp->if_flags >> 16;
(*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifr);
#ifdef INET
/*
diff --git a/sys/net/if.h b/sys/net/if.h
index 0074cec..fc95786 100644
--- a/sys/net/if.h
+++ b/sys/net/if.h
@@ -139,14 +139,6 @@ struct if_data {
#define IFF_LINK2 0x4000 /* per link layer defined bit */
#define IFF_ALTPHYS IFF_LINK2 /* use alternate physical connection */
#define IFF_MULTICAST 0x8000 /* supports multicast */
-
-/*
- * The following flag(s) ought to go in if_flags, but we cannot change
- * struct ifnet because of binary compatibility, so we store them in
- * if_ipending, which is not used so far.
- * If possible, make sure the value is not conflicting with other
- * IFF flags, so we have an easier time when we want to merge them.
- */
#define IFF_POLLING 0x10000 /* Interface is in polling mode. */
/* flags set internally only: */
@@ -244,8 +236,8 @@ struct ifreq {
#define ifr_addr ifr_ifru.ifru_addr /* address */
#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */
#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */
-#define ifr_flags ifr_ifru.ifru_flags[0] /* flags */
-#define ifr_prevflags ifr_ifru.ifru_flags[1] /* flags */
+#define ifr_flags ifr_ifru.ifru_flags[0] /* flags (low 16 bits) */
+#define ifr_flagshigh ifr_ifru.ifru_flags[1] /* flags (high 16 bits) */
#define ifr_metric ifr_ifru.ifru_metric /* metric */
#define ifr_mtu ifr_ifru.ifru_mtu /* mtu */
#define ifr_phys ifr_ifru.ifru_phys /* physical wire */
diff --git a/sys/net/if_tap.c b/sys/net/if_tap.c
index ef0a36d..0d46639 100644
--- a/sys/net/if_tap.c
+++ b/sys/net/if_tap.c
@@ -654,7 +654,7 @@ tapioctl(dev, cmd, data, flag, td)
struct ifnet *ifp = &tp->tap_if;
struct tapinfo *tapp = NULL;
int s;
- short f;
+ int f;
switch (cmd) {
case TAPSIFINFO:
@@ -728,7 +728,7 @@ tapioctl(dev, cmd, data, flag, td)
break;
case VMIO_SIOCSIFFLAGS: /* VMware/VMnet SIOCSIFFLAGS */
- f = *(short *)data;
+ f = *(int *)data;
f &= 0x0fff;
f &= ~IFF_CANTCHANGE;
f |= IFF_UP;
diff --git a/sys/net/if_var.h b/sys/net/if_var.h
index f36091b..bd9ebfd 100644
--- a/sys/net/if_var.h
+++ b/sys/net/if_var.h
@@ -138,7 +138,7 @@ struct ifnet {
u_short if_index; /* numeric abbreviation for this if */
short if_unit; /* sub-unit for lower level driver */
short if_timer; /* time 'til if_watchdog called */
- short if_flags; /* up/down, broadcast, etc. */
+ int if_flags; /* up/down, broadcast, etc. */
int if_capabilities; /* interface capabilities */
int if_capenable; /* enabled features */
int if_ipending; /* interrupts pending */
diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c
index d9c2316..98a042c 100644
--- a/sys/net/rtsock.c
+++ b/sys/net/rtsock.c
@@ -757,7 +757,7 @@ rt_ifmsg(ifp)
return;
ifm = mtod(m, struct if_msghdr *);
ifm->ifm_index = ifp->if_index;
- ifm->ifm_flags = (u_short)ifp->if_flags;
+ ifm->ifm_flags = ifp->if_flags;
ifm->ifm_data = ifp->if_data;
ifm->ifm_addrs = 0;
route_proto.sp_protocol = 0;
@@ -958,7 +958,7 @@ sysctl_iflist(af, w)
ifm = (struct if_msghdr *)w->w_tmem;
ifm->ifm_index = ifp->if_index;
- ifm->ifm_flags = (u_short)ifp->if_flags;
+ ifm->ifm_flags = ifp->if_flags;
ifm->ifm_data = ifp->if_data;
ifm->ifm_addrs = info.rti_addrs;
error = SYSCTL_OUT(w->w_req,(caddr_t)ifm, len);
OpenPOWER on IntegriCloud