Add two fields to the ifnet structure indicating what extra capabilities
a network device has, and which ones are enabled.
This commit is contained in:
parent
7429c0e49b
commit
016da741b2
14
sys/net/if.c
14
sys/net/if.c
@ -994,6 +994,11 @@ ifioctl(so, cmd, data, td)
|
||||
ifr->ifr_flags = ifp->if_flags;
|
||||
break;
|
||||
|
||||
case SIOCGIFCAP:
|
||||
ifr->ifr_reqcap = ifp->if_capabilities;
|
||||
ifr->ifr_curcap = ifp->if_capenable;
|
||||
break;
|
||||
|
||||
case SIOCGIFMETRIC:
|
||||
ifr->ifr_metric = ifp->if_metric;
|
||||
break;
|
||||
@ -1031,6 +1036,15 @@ ifioctl(so, cmd, data, td)
|
||||
getmicrotime(&ifp->if_lastchange);
|
||||
break;
|
||||
|
||||
case SIOCSIFCAP:
|
||||
error = suser_td(td);
|
||||
if (error)
|
||||
return (error);
|
||||
if (ifr->ifr_reqcap & ~ifp->if_capabilities)
|
||||
return (EINVAL);
|
||||
(void) (*ifp->if_ioctl)(ifp, cmd, data);
|
||||
break;
|
||||
|
||||
case SIOCSIFMETRIC:
|
||||
error = suser_td(td);
|
||||
if (error)
|
||||
|
@ -136,6 +136,10 @@ struct if_data {
|
||||
(IFF_BROADCAST|IFF_POINTOPOINT|IFF_RUNNING|IFF_OACTIVE|\
|
||||
IFF_SIMPLEX|IFF_MULTICAST|IFF_ALLMULTI|IFF_SMART)
|
||||
|
||||
/* Capabilities that interfaces can advertise. */
|
||||
#define IFCAP_HWCSUM 0x0001 /* can do hardware checksums */
|
||||
#define IFCAP_NETCONS 0x0002 /* can be a network console */
|
||||
|
||||
#define IFQ_MAXLEN 50
|
||||
#define IFNET_SLOWHZ 1 /* granularity is 1 second */
|
||||
|
||||
@ -198,6 +202,7 @@ struct ifreq {
|
||||
int ifru_phys;
|
||||
int ifru_media;
|
||||
caddr_t ifru_data;
|
||||
int ifru_cap[2];
|
||||
} ifr_ifru;
|
||||
#define ifr_addr ifr_ifru.ifru_addr /* address */
|
||||
#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */
|
||||
@ -209,6 +214,8 @@ struct ifreq {
|
||||
#define ifr_phys ifr_ifru.ifru_phys /* physical wire */
|
||||
#define ifr_media ifr_ifru.ifru_media /* physical media */
|
||||
#define ifr_data ifr_ifru.ifru_data /* for use by interface */
|
||||
#define ifr_reqcap ifr_ifru.ifru_cap[0] /* requested capabilities */
|
||||
#define ifr_curcap ifr_ifru.ifru_cap[1] /* current capabilities */
|
||||
};
|
||||
|
||||
#define _SIZEOF_ADDR_IFREQ(ifr) \
|
||||
|
@ -117,6 +117,8 @@ struct ifnet {
|
||||
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_capabilities; /* interface capabilities */
|
||||
int if_capenable; /* enabled features */
|
||||
int if_mpsafe; /* XXX TEMPORARY */
|
||||
int if_ipending; /* interrupts pending */
|
||||
void *if_linkmib; /* link-type-specific MIB data */
|
||||
|
Loading…
x
Reference in New Issue
Block a user