Date: Thu, 15 Aug 2002 21:43:01 +0300 From: Maxim Sobolev <sobomax@FreeBSD.org> To: hackers@FreeBSD.org, net@FreeBSD.org Subject: Increasing size of if_flags field in the ifnet structure [patch for review] Message-ID: <3D5BF635.3764C796@FreeBSD.org>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Folks,
When implementing ability to switch interface into promisc mode using
ifconfig(8) I've stumbled into the problem with already exhausted
space in the `short if_flags' field in the ifnet structure. I need to
allocate one new flag, while we already have 16 IFF_* flags, and even
one additional flag which is implemented using currently free
if_ipending field of the said structure. Attached patch is aimed at
increasing size of if_flags to 32 bits, as well as to clean-up
if_ipending abuse. Granted, it will break backward ABI compatibility,
but IMO it is not a big problem.
Comments and suggestions are greatly appreciated. Thanks!
-Maxim
[-- Attachment #2 --]
Index: src/share/man/man4/netintro.4
===================================================================
RCS file: /home/ncvs/src/share/man/man4/netintro.4,v
retrieving revision 1.20
diff -d -u -r1.20 netintro.4
--- src/share/man/man4/netintro.4 18 Mar 2002 12:39:32 -0000 1.20
+++ src/share/man/man4/netintro.4 15 Aug 2002 18:33:42 -0000
@@ -197,7 +197,7 @@
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
- short ifru_flags;
+ int ifru_flags;
int ifru_metric;
int ifru_mtu;
int ifru_phys;
Index: src/share/man/man9/ifnet.9
===================================================================
RCS file: /home/ncvs/src/share/man/man9/ifnet.9,v
retrieving revision 1.25
diff -d -u -r1.25 ifnet.9
--- src/share/man/man9/ifnet.9 10 Jan 2002 11:57:10 -0000 1.25
+++ src/share/man/man9/ifnet.9 15 Aug 2002 18:33:43 -0000
@@ -284,7 +284,7 @@
(Set by driver,
decremented by generic watchdog code.)
.It Va if_flags
-.Pq Vt short
+.Pq Vt int
Flags describing operational parameters of this interface (see below).
(Manipulated by both driver and generic code.)
.It Va if_capabilities
Index: src/sys/compat/linux/linux_ioctl.c
===================================================================
RCS file: /home/ncvs/src/sys/compat/linux/linux_ioctl.c,v
retrieving revision 1.86
diff -d -u -r1.86 linux_ioctl.c
--- src/sys/compat/linux/linux_ioctl.c 26 Jun 2002 15:53:11 -0000 1.86
+++ src/sys/compat/linux/linux_ioctl.c 15 Aug 2002 18:33:45 -0000
@@ -1963,7 +1963,7 @@
{
l_short flags;
- flags = ifp->if_flags;
+ flags = ifp->if_flags & 0xffff;
/* these flags have no Linux equivalent */
flags &= ~(IFF_SMART|IFF_OACTIVE|IFF_SIMPLEX|
IFF_LINK0|IFF_LINK1|IFF_LINK2);
Index: src/sys/dev/fxp/if_fxp.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/fxp/if_fxp.c,v
retrieving revision 1.138
diff -d -u -r1.138 if_fxp.c
--- src/sys/dev/fxp/if_fxp.c 9 Aug 2002 01:48:28 -0000 1.138
+++ src/sys/dev/fxp/if_fxp.c 15 Aug 2002 18:33:46 -0000
@@ -1193,7 +1193,7 @@
#ifdef DEVICE_POLLING
struct ifnet *ifp = &sc->sc_if;
- if (ifp->if_ipending & IFF_POLLING)
+ if (ifp->if_flags & IFF_POLLING)
return;
if (ether_poll_register(fxp_poll, ifp)) {
/* disable interrupts */
@@ -1785,7 +1785,7 @@
* ... but only do that if we are not polling. And because (presumably)
* the default is interrupts on, we need to disable them explicitly!
*/
- if ( ifp->if_ipending & IFF_POLLING )
+ if ( ifp->if_flags & IFF_POLLING )
CSR_WRITE_1(sc, FXP_CSR_SCB_INTRCNTL, FXP_SCB_INTR_DISABLE);
else
#endif /* DEVICE_POLLING */
Index: src/sys/dev/vx/if_vx.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/vx/if_vx.c,v
retrieving revision 1.36
diff -d -u -r1.36 if_vx.c
--- src/sys/dev/vx/if_vx.c 20 Mar 2002 02:07:47 -0000 1.36
+++ src/sys/dev/vx/if_vx.c 15 Aug 2002 18:33:47 -0000
@@ -285,7 +285,7 @@
register struct ifnet *ifp = &sc->arpcom.ac_if;
int i, j, k;
char *reason, *warning;
- static short prev_flags;
+ static int prev_flags;
static char prev_conn = -1;
if (prev_conn == -1) {
Index: src/sys/kern/kern_poll.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_poll.c,v
retrieving revision 1.9
diff -d -u -r1.9 kern_poll.c
--- src/sys/kern/kern_poll.c 4 Aug 2002 21:00:49 -0000 1.9
+++ src/sys/kern/kern_poll.c 15 Aug 2002 18:33:48 -0000
@@ -383,7 +383,7 @@
for (i = 0 ; i < poll_handlers ; i++) {
if (pr[i].handler &&
pr[i].ifp->if_flags & IFF_RUNNING) {
- pr[i].ifp->if_ipending &= ~IFF_POLLING;
+ pr[i].ifp->if_flags &= ~IFF_POLLING;
pr[i].handler(pr[i].ifp, POLL_DEREGISTER, 1);
}
pr[i].handler=NULL;
@@ -415,7 +415,7 @@
return 0;
if ( !(ifp->if_flags & IFF_UP) ) /* must be up */
return 0;
- if (ifp->if_ipending & IFF_POLLING) /* already polling */
+ if (ifp->if_flags & IFF_POLLING) /* already polling */
return 0;
s = splhigh();
@@ -440,7 +440,7 @@
pr[poll_handlers].handler = h;
pr[poll_handlers].ifp = ifp;
poll_handlers++;
- ifp->if_ipending |= IFF_POLLING;
+ ifp->if_flags |= IFF_POLLING;
splx(s);
if (idlepoll_sleeping)
wakeup(&idlepoll_sleeping);
@@ -459,14 +459,14 @@
int i;
mtx_lock(&Giant);
- if ( !ifp || !(ifp->if_ipending & IFF_POLLING) ) {
+ if ( !ifp || !(ifp->if_flags & IFF_POLLING) ) {
mtx_unlock(&Giant);
return 0;
}
for (i = 0 ; i < poll_handlers ; i++)
if (pr[i].ifp == ifp) /* found it */
break;
- ifp->if_ipending &= ~IFF_POLLING; /* found or not... */
+ ifp->if_flags &= ~IFF_POLLING; /* found or not... */
if (i == poll_handlers) {
mtx_unlock(&Giant);
printf("ether_poll_deregister: ifp not found!!!\n");
Index: src/sys/net/if.c
===================================================================
RCS file: /home/ncvs/src/sys/net/if.c,v
retrieving revision 1.144
diff -d -u -r1.144 if.c
--- src/sys/net/if.c 1 Aug 2002 21:15:53 -0000 1.144
+++ src/sys/net/if.c 15 Aug 2002 18:33:48 -0000
@@ -1438,7 +1438,7 @@
struct ifnet *ifp;
struct ifreq *ifr;
int error;
- short oif_flags;
+ int oif_flags;
switch (cmd) {
case SIOCGIFCONF:
Index: src/sys/net/if.h
===================================================================
RCS file: /home/ncvs/src/sys/net/if.h,v
retrieving revision 1.73
diff -d -u -r1.73 if.h
--- src/sys/net/if.h 25 May 2002 20:17:04 -0000 1.73
+++ src/sys/net/if.h 15 Aug 2002 18:33:49 -0000
@@ -139,14 +139,6 @@
#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: */
@@ -232,7 +224,7 @@
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
- short ifru_flags[2];
+ int ifru_flags[2];
short ifru_index;
int ifru_metric;
int ifru_mtu;
Index: src/sys/net/if_tap.c
===================================================================
RCS file: /home/ncvs/src/sys/net/if_tap.c,v
retrieving revision 1.19
diff -d -u -r1.19 if_tap.c
--- src/sys/net/if_tap.c 6 May 2002 19:31:28 -0000 1.19
+++ src/sys/net/if_tap.c 15 Aug 2002 18:33:49 -0000
@@ -654,7 +654,7 @@
struct ifnet *ifp = &tp->tap_if;
struct tapinfo *tapp = NULL;
int s;
- short f;
+ int f;
switch (cmd) {
case TAPSIFINFO:
@@ -728,7 +728,7 @@
break;
case VMIO_SIOCSIFFLAGS: /* VMware/VMnet SIOCSIFFLAGS */
- f = *(short *)data;
+ f = *(int *)data;
f &= 0x0fff;
f &= ~IFF_CANTCHANGE;
f |= IFF_UP;
Index: src/sys/net/if_var.h
===================================================================
RCS file: /home/ncvs/src/sys/net/if_var.h,v
retrieving revision 1.48
diff -d -u -r1.48 if_var.h
--- src/sys/net/if_var.h 14 Aug 2002 01:37:22 -0000 1.48
+++ src/sys/net/if_var.h 15 Aug 2002 18:33:50 -0000
@@ -138,7 +138,7 @@
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 */
Index: src/sys/net/rtsock.c
===================================================================
RCS file: /home/ncvs/src/sys/net/rtsock.c,v
retrieving revision 1.75
diff -d -u -r1.75 rtsock.c
--- src/sys/net/rtsock.c 18 Jun 2002 07:42:01 -0000 1.75
+++ src/sys/net/rtsock.c 15 Aug 2002 18:33:51 -0000
@@ -757,7 +757,7 @@
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 @@
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);
Index: src/sys/netatm/atm_if.c
===================================================================
RCS file: /home/ncvs/src/sys/netatm/atm_if.c,v
retrieving revision 1.14
diff -d -u -r1.14 atm_if.c
--- src/sys/netatm/atm_if.c 14 Jun 2002 16:59:38 -0000 1.14
+++ src/sys/netatm/atm_if.c 15 Aug 2002 18:33:51 -0000
@@ -1057,7 +1057,7 @@
break;
case SIOCGIFFLAGS:
- *(short *)data = ifp->if_flags;
+ *(int *)data = ifp->if_flags;
break;
case SIOCSIFFLAGS:
Index: src/sys/netinet6/in6_var.h
===================================================================
RCS file: /home/ncvs/src/sys/netinet6/in6_var.h,v
retrieving revision 1.10
diff -d -u -r1.10 in6_var.h
--- src/sys/netinet6/in6_var.h 19 Apr 2002 04:46:22 -0000 1.10
+++ src/sys/netinet6/in6_var.h 15 Aug 2002 18:33:51 -0000
@@ -234,7 +234,7 @@
union {
struct sockaddr_in6 ifru_addr;
struct sockaddr_in6 ifru_dstaddr;
- short ifru_flags;
+ int ifru_flags;
int ifru_flags6;
int ifru_metric;
caddr_t ifru_data;
Index: src/sys/nfsclient/bootp_subr.c
===================================================================
RCS file: /home/ncvs/src/sys/nfsclient/bootp_subr.c,v
retrieving revision 1.41
diff -d -u -r1.41 bootp_subr.c
--- src/sys/nfsclient/bootp_subr.c 31 May 2002 11:52:34 -0000 1.41
+++ src/sys/nfsclient/bootp_subr.c 15 Aug 2002 18:33:53 -0000
@@ -385,7 +385,7 @@
printf("%s%d flags %x, addr ",
ifp->if_name,
ifp->if_unit,
- (unsigned short) ifp->if_flags);
+ ifp->if_flags);
print_sin_addr((struct sockaddr_in *) ifa->ifa_addr);
printf(", broadcast ");
print_sin_addr((struct sockaddr_in *) ifa->ifa_dstaddr);
Index: src/sys/pci/if_dc.c
===================================================================
RCS file: /home/ncvs/src/sys/pci/if_dc.c,v
retrieving revision 1.74
diff -d -u -r1.74 if_dc.c
--- src/sys/pci/if_dc.c 30 Jun 2002 22:05:46 -0000 1.74
+++ src/sys/pci/if_dc.c 15 Aug 2002 18:33:55 -0000
@@ -2483,7 +2483,7 @@
while(!(sc->dc_ldata->dc_rx_list[i].dc_status & DC_RXSTAT_OWN)) {
#ifdef DEVICE_POLLING
- if (ifp->if_ipending & IFF_POLLING) {
+ if (ifp->if_flags & IFF_POLLING) {
if (sc->rxcycles <= 0)
break;
sc->rxcycles--;
@@ -2885,7 +2885,7 @@
DC_LOCK(sc);
ifp = &sc->arpcom.ac_if;
#ifdef DEVICE_POLLING
- if (ifp->if_ipending & IFF_POLLING)
+ if (ifp->if_flags & IFF_POLLING)
goto done;
if (ether_poll_register(dc_poll, ifp)) { /* ok, disable interrupts */
CSR_WRITE_4(sc, DC_IMR, 0x00000000);
@@ -3265,7 +3265,7 @@
* the case of polling. Some cards (e.g. fxp) turn interrupts on
* after a reset.
*/
- if (ifp->if_ipending & IFF_POLLING)
+ if (ifp->if_flags & IFF_POLLING)
CSR_WRITE_4(sc, DC_IMR, 0x00000000);
else
#endif
Index: src/sys/pci/if_rl.c
===================================================================
RCS file: /home/ncvs/src/sys/pci/if_rl.c,v
retrieving revision 1.72
diff -d -u -r1.72 if_rl.c
--- src/sys/pci/if_rl.c 30 Jul 2002 17:31:42 -0000 1.72
+++ src/sys/pci/if_rl.c 15 Aug 2002 18:33:56 -0000
@@ -1187,7 +1187,7 @@
while((CSR_READ_1(sc, RL_COMMAND) & RL_CMD_EMPTY_RXBUF) == 0) {
#ifdef DEVICE_POLLING
- if (ifp->if_ipending & IFF_POLLING) {
+ if (ifp->if_flags & IFF_POLLING) {
if (sc->rxcycles <= 0)
break;
sc->rxcycles--;
@@ -1416,7 +1416,7 @@
ifp = &sc->arpcom.ac_if;
#ifdef DEVICE_POLLING
- if (ifp->if_ipending & IFF_POLLING)
+ if (ifp->if_flags & IFF_POLLING)
goto done;
if (ether_poll_register(rl_poll, ifp)) { /* ok, disable interrupts */
CSR_WRITE_2(sc, RL_IMR, 0x0000);
@@ -1654,7 +1654,7 @@
/*
* Disable interrupts if we are polling.
*/
- if (ifp->if_ipending & IFF_POLLING)
+ if (ifp->if_flags & IFF_POLLING)
CSR_WRITE_2(sc, RL_IMR, 0);
else /* otherwise ... */
#endif /* DEVICE_POLLING */
Index: src/sys/pci/if_sis.c
===================================================================
RCS file: /home/ncvs/src/sys/pci/if_sis.c,v
retrieving revision 1.53
diff -d -u -r1.53 if_sis.c
--- src/sys/pci/if_sis.c 7 Aug 2002 16:08:54 -0000 1.53
+++ src/sys/pci/if_sis.c 15 Aug 2002 18:33:57 -0000
@@ -1285,7 +1285,7 @@
while(SIS_OWNDESC(&sc->sis_ldata.sis_rx_list[i])) {
#ifdef DEVICE_POLLING
- if (ifp->if_ipending & IFF_POLLING) {
+ if (ifp->if_flags & IFF_POLLING) {
if (sc->rxcycles <= 0)
break;
sc->rxcycles--;
@@ -1508,7 +1508,7 @@
SIS_LOCK(sc);
#ifdef DEVICE_POLLING
- if (ifp->if_ipending & IFF_POLLING)
+ if (ifp->if_flags & IFF_POLLING)
goto done;
if (ether_poll_register(sis_poll, ifp)) { /* ok, disable interrupts */
CSR_WRITE_4(sc, SIS_IER, 0);
@@ -1810,7 +1810,7 @@
* ... only enable interrupts if we are not polling, make sure
* they are off otherwise.
*/
- if (ifp->if_ipending & IFF_POLLING)
+ if (ifp->if_flags & IFF_POLLING)
CSR_WRITE_4(sc, SIS_IER, 0);
else
#endif /* DEVICE_POLLING */
Index: src/usr.sbin/mrouted/config.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/mrouted/config.c,v
retrieving revision 1.14
diff -d -u -r1.14 config.c
--- src/usr.sbin/mrouted/config.c 28 Aug 1999 01:17:03 -0000 1.14
+++ src/usr.sbin/mrouted/config.c 15 Aug 2002 18:33:57 -0000
@@ -32,7 +32,7 @@
register vifi_t vifi;
int n;
u_int32 addr, mask, subnet;
- short flags;
+ int flags;
int num_ifreq = 32;
ifc.ifc_len = num_ifreq * sizeof(struct ifreq);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3D5BF635.3764C796>
