2005-01-07 01:45:51 +00:00
|
|
|
/*-
|
1994-05-24 10:09:53 +00:00
|
|
|
* Copyright (c) 1982, 1986, 1989, 1993
|
|
|
|
* The Regents of the University of California. All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* 4. Neither the name of the University nor the names of its contributors
|
|
|
|
* may be used to endorse or promote products derived from this software
|
|
|
|
* without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
|
|
|
*
|
|
|
|
* @(#)if.h 8.1 (Berkeley) 6/10/93
|
1999-08-28 01:08:13 +00:00
|
|
|
* $FreeBSD$
|
1994-05-24 10:09:53 +00:00
|
|
|
*/
|
|
|
|
|
1994-08-21 05:11:48 +00:00
|
|
|
#ifndef _NET_IF_H_
|
1994-11-15 14:41:38 +00:00
|
|
|
#define _NET_IF_H_
|
1994-08-21 05:11:48 +00:00
|
|
|
|
2002-10-02 07:44:50 +00:00
|
|
|
#include <sys/cdefs.h>
|
|
|
|
|
2002-05-20 22:48:39 +00:00
|
|
|
#ifdef _KERNEL
|
2001-07-02 20:49:25 +00:00
|
|
|
#include <sys/queue.h>
|
2002-05-20 22:48:39 +00:00
|
|
|
#endif
|
2001-07-02 20:49:25 +00:00
|
|
|
|
2002-10-02 07:44:50 +00:00
|
|
|
#if __BSD_VISIBLE
|
1998-03-21 13:36:20 +00:00
|
|
|
/*
|
|
|
|
* <net/if.h> does not depend on <sys/time.h> on most other systems. This
|
2001-02-06 12:05:58 +00:00
|
|
|
* helps userland compatibility. (struct timeval ifi_lastchange)
|
1998-03-21 13:36:20 +00:00
|
|
|
*/
|
1999-12-29 04:46:21 +00:00
|
|
|
#ifndef _KERNEL
|
1998-03-21 13:36:20 +00:00
|
|
|
#include <sys/time.h>
|
|
|
|
#endif
|
|
|
|
|
2001-07-02 20:49:25 +00:00
|
|
|
struct ifnet;
|
2002-10-02 07:44:50 +00:00
|
|
|
#endif
|
2001-07-02 20:49:25 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Length of interface external name, including terminating '\0'.
|
|
|
|
* Note: this is the same size as a generic device's external name.
|
|
|
|
*/
|
2002-10-02 07:44:50 +00:00
|
|
|
#define IF_NAMESIZE 16
|
|
|
|
#if __BSD_VISIBLE
|
|
|
|
#define IFNAMSIZ IF_NAMESIZE
|
2003-10-31 18:32:15 +00:00
|
|
|
#define IF_MAXUNIT 0x7fff /* historical value */
|
2002-10-02 07:44:50 +00:00
|
|
|
#endif
|
|
|
|
#if __BSD_VISIBLE
|
|
|
|
|
2001-07-02 20:49:25 +00:00
|
|
|
/*
|
|
|
|
* Structure used to query names of interface cloners.
|
|
|
|
*/
|
|
|
|
|
|
|
|
struct if_clonereq {
|
|
|
|
int ifcr_total; /* total cloners (out) */
|
|
|
|
int ifcr_count; /* room for this many in user buffer */
|
|
|
|
char *ifcr_buffer; /* buffer for cloner names */
|
|
|
|
};
|
|
|
|
|
1996-10-21 23:05:57 +00:00
|
|
|
/*
|
|
|
|
* Structure describing information about an interface
|
|
|
|
* which may be of interest to management entities.
|
|
|
|
*/
|
1995-07-09 08:12:27 +00:00
|
|
|
struct if_data {
|
|
|
|
/* generic interface information */
|
|
|
|
u_char ifi_type; /* ethernet, tokenring, etc */
|
|
|
|
u_char ifi_physical; /* e.g., AUI, Thinnet, 10base-T, etc */
|
|
|
|
u_char ifi_addrlen; /* media address length */
|
|
|
|
u_char ifi_hdrlen; /* media header length */
|
2004-05-03 13:48:35 +00:00
|
|
|
u_char ifi_link_state; /* current link state */
|
1996-07-30 19:17:07 +00:00
|
|
|
u_char ifi_recvquota; /* polling quota for receive intrs */
|
|
|
|
u_char ifi_xmitquota; /* polling quota for xmit intrs */
|
2004-09-01 18:22:14 +00:00
|
|
|
u_char ifi_datalen; /* length of this data struct */
|
1995-07-09 08:12:27 +00:00
|
|
|
u_long ifi_mtu; /* maximum transmission unit */
|
|
|
|
u_long ifi_metric; /* routing metric (external only) */
|
|
|
|
u_long ifi_baudrate; /* linespeed */
|
|
|
|
/* volatile statistics */
|
|
|
|
u_long ifi_ipackets; /* packets received on interface */
|
|
|
|
u_long ifi_ierrors; /* input errors on interface */
|
|
|
|
u_long ifi_opackets; /* packets sent on interface */
|
|
|
|
u_long ifi_oerrors; /* output errors on interface */
|
|
|
|
u_long ifi_collisions; /* collisions on csma interfaces */
|
|
|
|
u_long ifi_ibytes; /* total number of octets received */
|
|
|
|
u_long ifi_obytes; /* total number of octets sent */
|
|
|
|
u_long ifi_imcasts; /* packets received via multicast */
|
|
|
|
u_long ifi_omcasts; /* packets sent via multicast */
|
|
|
|
u_long ifi_iqdrops; /* dropped on input, this interface */
|
|
|
|
u_long ifi_noproto; /* destined for unsupported protocol */
|
2000-03-27 19:14:27 +00:00
|
|
|
u_long ifi_hwassist; /* HW offload capabilities */
|
2005-02-25 19:46:41 +00:00
|
|
|
time_t ifi_epoch; /* uptime at attach or stat reset */
|
2004-09-08 04:50:55 +00:00
|
|
|
#ifdef __alpha__
|
|
|
|
u_int ifi_timepad; /* time_t is int, not long on alpha */
|
|
|
|
#endif
|
1996-06-10 23:07:36 +00:00
|
|
|
struct timeval ifi_lastchange; /* time of last administrative change */
|
1995-07-09 08:12:27 +00:00
|
|
|
};
|
|
|
|
|
2005-08-09 12:56:20 +00:00
|
|
|
/*-
|
Rename IFF_RUNNING to IFF_DRV_RUNNING, IFF_OACTIVE to IFF_DRV_OACTIVE,
and move both flags from ifnet.if_flags to ifnet.if_drv_flags, making
and documenting the locking of these flags the responsibility of the
device driver, not the network stack. The flags for these two fields
will be mutually exclusive so that they can be exposed to user space as
though they were stored in the same variable.
Provide #defines to provide the old names #ifndef _KERNEL, so that user
applications (such as ifconfig) can use the old flag names. Using the
old names in a device driver will result in a compile error in order to
help device driver writers adopt the new model.
When exposing the interface flags to user space, via interface ioctls
or routing sockets, or the two fields together. Since the driver flags
cannot currently be set for user space, no new logic is currently
required to handle this case.
Add some assertions that general purpose network stack routines, such
as if_setflags(), are not improperly used on driver-owned flags.
With this change, a large number of very minor network stack races are
closed, subject to correct device driver locking. Most were likely
never triggered.
Driver sweep to follow; many thanks to pjd and bz for the line-by-line
review they gave this patch.
Reviewed by: pjd, bz
MFC after: 7 days
2005-08-09 10:16:17 +00:00
|
|
|
* Interface flags are of two types: network stack owned flags, and driver
|
|
|
|
* owned flags. Historically, these values were stored in the same ifnet
|
|
|
|
* flags field, but with the advent of fine-grained locking, they have been
|
|
|
|
* broken out such that the network stack is responsible for synchronizing
|
|
|
|
* the stack-owned fields, and the device driver the device-owned fields.
|
|
|
|
* Both halves can perform lockless reads of the other half's field, subject
|
|
|
|
* to accepting the involved races.
|
|
|
|
*
|
|
|
|
* Both sets of flags come from the same number space, and should not be
|
|
|
|
* permitted to conflict, as they are exposed to user space via a single
|
|
|
|
* field.
|
|
|
|
*
|
2005-08-09 12:56:20 +00:00
|
|
|
* The following symbols identify read and write requirements for fields:
|
|
|
|
*
|
|
|
|
* (i) if_flags field set by device driver before attach, read-only there
|
|
|
|
* after.
|
|
|
|
* (n) if_flags field written only by the network stack, read by either the
|
|
|
|
* stack or driver.
|
|
|
|
* (d) if_drv_flags field written only by the device driver, read by either
|
|
|
|
* the stack or driver.
|
Rename IFF_RUNNING to IFF_DRV_RUNNING, IFF_OACTIVE to IFF_DRV_OACTIVE,
and move both flags from ifnet.if_flags to ifnet.if_drv_flags, making
and documenting the locking of these flags the responsibility of the
device driver, not the network stack. The flags for these two fields
will be mutually exclusive so that they can be exposed to user space as
though they were stored in the same variable.
Provide #defines to provide the old names #ifndef _KERNEL, so that user
applications (such as ifconfig) can use the old flag names. Using the
old names in a device driver will result in a compile error in order to
help device driver writers adopt the new model.
When exposing the interface flags to user space, via interface ioctls
or routing sockets, or the two fields together. Since the driver flags
cannot currently be set for user space, no new logic is currently
required to handle this case.
Add some assertions that general purpose network stack routines, such
as if_setflags(), are not improperly used on driver-owned flags.
With this change, a large number of very minor network stack races are
closed, subject to correct device driver locking. Most were likely
never triggered.
Driver sweep to follow; many thanks to pjd and bz for the line-by-line
review they gave this patch.
Reviewed by: pjd, bz
MFC after: 7 days
2005-08-09 10:16:17 +00:00
|
|
|
*/
|
2005-08-09 12:56:20 +00:00
|
|
|
#define IFF_UP 0x1 /* (n) interface is up */
|
|
|
|
#define IFF_BROADCAST 0x2 /* (i) broadcast address valid */
|
|
|
|
#define IFF_DEBUG 0x4 /* (n) turn on debugging */
|
|
|
|
#define IFF_LOOPBACK 0x8 /* (i) is a loopback net */
|
|
|
|
#define IFF_POINTOPOINT 0x10 /* (i) is a point-to-point link */
|
|
|
|
#define IFF_SMART 0x20 /* (i) interface manages own routes */
|
|
|
|
#define IFF_DRV_RUNNING 0x40 /* (d) resources allocated */
|
|
|
|
#define IFF_NOARP 0x80 /* (n) no address resolution protocol */
|
|
|
|
#define IFF_PROMISC 0x100 /* (n) receive all packets */
|
|
|
|
#define IFF_ALLMULTI 0x200 /* (n) receive all multicast packets */
|
|
|
|
#define IFF_DRV_OACTIVE 0x400 /* (d) tx hardware queue is full */
|
|
|
|
#define IFF_SIMPLEX 0x800 /* (i) can't hear own transmissions */
|
1994-05-24 10:09:53 +00:00
|
|
|
#define IFF_LINK0 0x1000 /* per link layer defined bit */
|
|
|
|
#define IFF_LINK1 0x2000 /* per link layer defined bit */
|
|
|
|
#define IFF_LINK2 0x4000 /* per link layer defined bit */
|
1994-10-01 19:44:38 +00:00
|
|
|
#define IFF_ALTPHYS IFF_LINK2 /* use alternate physical connection */
|
2005-08-09 12:56:20 +00:00
|
|
|
#define IFF_MULTICAST 0x8000 /* (i) supports multicast */
|
Big polling(4) cleanup.
o Axe poll in trap.
o Axe IFF_POLLING flag from if_flags.
o Rework revision 1.21 (Giant removal), in such a way that
poll_mtx is not dropped during call to polling handler.
This fixes problem with idle polling.
o Make registration and deregistration from polling in a
functional way, insted of next tick/interrupt.
o Obsolete kern.polling.enable. Polling is turned on/off
with ifconfig.
Detailed kern_poll.c changes:
- Remove polling handler flags, introduced in 1.21. The are not
needed now.
- Forget and do not check if_flags, if_capenable and if_drv_flags.
- Call all registered polling handlers unconditionally.
- Do not drop poll_mtx, when entering polling handlers.
- In ether_poll() NET_LOCK_GIANT prior to locking poll_mtx.
- In netisr_poll() axe the block, where polling code asks drivers
to unregister.
- In netisr_poll() and ether_poll() do polling always, if any
handlers are present.
- In ether_poll_[de]register() remove a lot of error hiding code. Assert
that arguments are correct, instead.
- In ether_poll_[de]register() use standard return values in case of
error or success.
- Introduce poll_switch() that is a sysctl handler for kern.polling.enable.
poll_switch() goes through interface list and enabled/disables polling.
A message that kern.polling.enable is deprecated is printed.
Detailed driver changes:
- On attach driver announces IFCAP_POLLING in if_capabilities, but
not in if_capenable.
- On detach driver calls ether_poll_deregister() if polling is enabled.
- In polling handler driver obtains its lock and checks IFF_DRV_RUNNING
flag. If there is no, then unlocks and returns.
- In ioctl handler driver checks for IFCAP_POLLING flag requested to
be set or cleared. Driver first calls ether_poll_[de]register(), then
obtains driver lock and [dis/en]ables interrupts.
- In interrupt handler driver checks IFCAP_POLLING flag in if_capenable.
If present, then returns.This is important to protect from spurious
interrupts.
Reviewed by: ru, sam, jhb
2005-10-01 18:56:19 +00:00
|
|
|
/* 0x10000 */
|
2005-08-09 12:56:20 +00:00
|
|
|
#define IFF_PPROMISC 0x20000 /* (n) user-requested promisc mode */
|
|
|
|
#define IFF_MONITOR 0x40000 /* (n) user-requested monitor mode */
|
|
|
|
#define IFF_STATICARP 0x80000 /* (n) static ARP */
|
|
|
|
#define IFF_NEEDSGIANT 0x100000 /* (i) hold Giant over if_start calls */
|
Device Polling code for -current.
Non-SMP, i386-only, no polling in the idle loop at the moment.
To use this code you must compile a kernel with
options DEVICE_POLLING
and at runtime enable polling with
sysctl kern.polling.enable=1
The percentage of CPU reserved to userland can be set with
sysctl kern.polling.user_frac=NN (default is 50)
while the remainder is used by polling device drivers and netisr's.
These are the only two variables that you should need to touch. There
are a few more parameters in kern.polling but the default values
are adequate for all purposes. See the code in kern_poll.c for
more details on them.
Polling in the idle loop will be implemented shortly by introducing
a kernel thread which does the job. Until then, the amount of CPU
dedicated to polling will never exceed (100-user_frac).
The equivalent (actually, better) code for -stable is at
http://info.iet.unipi.it/~luigi/polling/
and also supports polling in the idle loop.
NOTE to Alpha developers:
There is really nothing in this code that is i386-specific.
If you move the 2 lines supporting the new option from
sys/conf/{files,options}.i386 to sys/conf/{files,options} I am
pretty sure that this should work on the Alpha as well, just that
I do not have a suitable test box to try it. If someone feels like
trying it, I would appreciate it.
NOTE to other developers:
sure some things could be done better, and as always I am open to
constructive criticism, which a few of you have already given and
I greatly appreciated.
However, before proposing radical architectural changes, please
take some time to possibly try out this code, or at the very least
read the comments in kern_poll.c, especially re. the reason why I
am using a soft netisr and cannot (I believe) replace it with a
simple timeout.
Quick description of files touched by this commit:
sys/conf/files.i386
new file kern/kern_poll.c
sys/conf/options.i386
new option
sys/i386/i386/trap.c
poll in trap (disabled by default)
sys/kern/kern_clock.c
initialization and hardclock hooks.
sys/kern/kern_intr.c
minor swi_net changes
sys/kern/kern_poll.c
the bulk of the code.
sys/net/if.h
new flag
sys/net/if_var.h
declaration for functions used in device drivers.
sys/net/netisr.h
NETISR_POLL
sys/dev/fxp/if_fxp.c
sys/dev/fxp/if_fxpvar.h
sys/pci/if_dc.c
sys/pci/if_dcreg.h
sys/pci/if_sis.c
sys/pci/if_sisreg.h
device driver modifications
2001-12-14 17:56:12 +00:00
|
|
|
|
Rename IFF_RUNNING to IFF_DRV_RUNNING, IFF_OACTIVE to IFF_DRV_OACTIVE,
and move both flags from ifnet.if_flags to ifnet.if_drv_flags, making
and documenting the locking of these flags the responsibility of the
device driver, not the network stack. The flags for these two fields
will be mutually exclusive so that they can be exposed to user space as
though they were stored in the same variable.
Provide #defines to provide the old names #ifndef _KERNEL, so that user
applications (such as ifconfig) can use the old flag names. Using the
old names in a device driver will result in a compile error in order to
help device driver writers adopt the new model.
When exposing the interface flags to user space, via interface ioctls
or routing sockets, or the two fields together. Since the driver flags
cannot currently be set for user space, no new logic is currently
required to handle this case.
Add some assertions that general purpose network stack routines, such
as if_setflags(), are not improperly used on driver-owned flags.
With this change, a large number of very minor network stack races are
closed, subject to correct device driver locking. Most were likely
never triggered.
Driver sweep to follow; many thanks to pjd and bz for the line-by-line
review they gave this patch.
Reviewed by: pjd, bz
MFC after: 7 days
2005-08-09 10:16:17 +00:00
|
|
|
/*
|
|
|
|
* Old names for driver flags so that user space tools can continue to use
|
2005-08-09 12:56:20 +00:00
|
|
|
* the old (portable) names.
|
Rename IFF_RUNNING to IFF_DRV_RUNNING, IFF_OACTIVE to IFF_DRV_OACTIVE,
and move both flags from ifnet.if_flags to ifnet.if_drv_flags, making
and documenting the locking of these flags the responsibility of the
device driver, not the network stack. The flags for these two fields
will be mutually exclusive so that they can be exposed to user space as
though they were stored in the same variable.
Provide #defines to provide the old names #ifndef _KERNEL, so that user
applications (such as ifconfig) can use the old flag names. Using the
old names in a device driver will result in a compile error in order to
help device driver writers adopt the new model.
When exposing the interface flags to user space, via interface ioctls
or routing sockets, or the two fields together. Since the driver flags
cannot currently be set for user space, no new logic is currently
required to handle this case.
Add some assertions that general purpose network stack routines, such
as if_setflags(), are not improperly used on driver-owned flags.
With this change, a large number of very minor network stack races are
closed, subject to correct device driver locking. Most were likely
never triggered.
Driver sweep to follow; many thanks to pjd and bz for the line-by-line
review they gave this patch.
Reviewed by: pjd, bz
MFC after: 7 days
2005-08-09 10:16:17 +00:00
|
|
|
*/
|
|
|
|
#ifndef _KERNEL
|
|
|
|
#define IFF_RUNNING IFF_DRV_RUNNING
|
|
|
|
#define IFF_OACTIVE IFF_DRV_OACTIVE
|
|
|
|
#endif
|
|
|
|
|
1994-05-24 10:09:53 +00:00
|
|
|
/* flags set internally only: */
|
|
|
|
#define IFF_CANTCHANGE \
|
Rename IFF_RUNNING to IFF_DRV_RUNNING, IFF_OACTIVE to IFF_DRV_OACTIVE,
and move both flags from ifnet.if_flags to ifnet.if_drv_flags, making
and documenting the locking of these flags the responsibility of the
device driver, not the network stack. The flags for these two fields
will be mutually exclusive so that they can be exposed to user space as
though they were stored in the same variable.
Provide #defines to provide the old names #ifndef _KERNEL, so that user
applications (such as ifconfig) can use the old flag names. Using the
old names in a device driver will result in a compile error in order to
help device driver writers adopt the new model.
When exposing the interface flags to user space, via interface ioctls
or routing sockets, or the two fields together. Since the driver flags
cannot currently be set for user space, no new logic is currently
required to handle this case.
Add some assertions that general purpose network stack routines, such
as if_setflags(), are not improperly used on driver-owned flags.
With this change, a large number of very minor network stack races are
closed, subject to correct device driver locking. Most were likely
never triggered.
Driver sweep to follow; many thanks to pjd and bz for the line-by-line
review they gave this patch.
Reviewed by: pjd, bz
MFC after: 7 days
2005-08-09 10:16:17 +00:00
|
|
|
(IFF_BROADCAST|IFF_POINTOPOINT|IFF_DRV_RUNNING|IFF_DRV_OACTIVE|\
|
Big polling(4) cleanup.
o Axe poll in trap.
o Axe IFF_POLLING flag from if_flags.
o Rework revision 1.21 (Giant removal), in such a way that
poll_mtx is not dropped during call to polling handler.
This fixes problem with idle polling.
o Make registration and deregistration from polling in a
functional way, insted of next tick/interrupt.
o Obsolete kern.polling.enable. Polling is turned on/off
with ifconfig.
Detailed kern_poll.c changes:
- Remove polling handler flags, introduced in 1.21. The are not
needed now.
- Forget and do not check if_flags, if_capenable and if_drv_flags.
- Call all registered polling handlers unconditionally.
- Do not drop poll_mtx, when entering polling handlers.
- In ether_poll() NET_LOCK_GIANT prior to locking poll_mtx.
- In netisr_poll() axe the block, where polling code asks drivers
to unregister.
- In netisr_poll() and ether_poll() do polling always, if any
handlers are present.
- In ether_poll_[de]register() remove a lot of error hiding code. Assert
that arguments are correct, instead.
- In ether_poll_[de]register() use standard return values in case of
error or success.
- Introduce poll_switch() that is a sysctl handler for kern.polling.enable.
poll_switch() goes through interface list and enabled/disables polling.
A message that kern.polling.enable is deprecated is printed.
Detailed driver changes:
- On attach driver announces IFCAP_POLLING in if_capabilities, but
not in if_capenable.
- On detach driver calls ether_poll_deregister() if polling is enabled.
- In polling handler driver obtains its lock and checks IFF_DRV_RUNNING
flag. If there is no, then unlocks and returns.
- In ioctl handler driver checks for IFCAP_POLLING flag requested to
be set or cleared. Driver first calls ether_poll_[de]register(), then
obtains driver lock and [dis/en]ables interrupts.
- In interrupt handler driver checks IFCAP_POLLING flag in if_capenable.
If present, then returns.This is important to protect from spurious
interrupts.
Reviewed by: ru, sam, jhb
2005-10-01 18:56:19 +00:00
|
|
|
IFF_SIMPLEX|IFF_MULTICAST|IFF_ALLMULTI|IFF_SMART|IFF_PROMISC)
|
1994-05-24 10:09:53 +00:00
|
|
|
|
2004-05-03 13:48:35 +00:00
|
|
|
/*
|
|
|
|
* Values for if_link_state.
|
|
|
|
*/
|
|
|
|
#define LINK_STATE_UNKNOWN 0 /* link invalid/unknown */
|
|
|
|
#define LINK_STATE_DOWN 1 /* link is down */
|
|
|
|
#define LINK_STATE_UP 2 /* link is up */
|
|
|
|
|
2002-11-14 23:16:18 +00:00
|
|
|
/*
|
|
|
|
* Some convenience macros used for setting ifi_baudrate.
|
|
|
|
* XXX 1000 vs. 1024? --thorpej@netbsd.org
|
|
|
|
*/
|
|
|
|
#define IF_Kbps(x) ((x) * 1000) /* kilobits/sec. */
|
|
|
|
#define IF_Mbps(x) (IF_Kbps((x) * 1000)) /* megabits/sec. */
|
|
|
|
#define IF_Gbps(x) (IF_Mbps((x) * 1000)) /* gigabits/sec. */
|
|
|
|
|
2001-09-18 17:41:42 +00:00
|
|
|
/* Capabilities that interfaces can advertise. */
|
2001-09-18 20:13:03 +00:00
|
|
|
#define IFCAP_RXCSUM 0x0001 /* can offload checksum on RX */
|
|
|
|
#define IFCAP_TXCSUM 0x0002 /* can offload checksum on TX */
|
|
|
|
#define IFCAP_NETCONS 0x0004 /* can be a network console */
|
2002-11-14 23:16:18 +00:00
|
|
|
#define IFCAP_VLAN_MTU 0x0008 /* VLAN-compatible MTU */
|
|
|
|
#define IFCAP_VLAN_HWTAGGING 0x0010 /* hardware VLAN tag support */
|
|
|
|
#define IFCAP_JUMBO_MTU 0x0020 /* 9000 byte MTU supported */
|
2004-04-11 13:36:52 +00:00
|
|
|
#define IFCAP_POLLING 0x0040 /* driver supports polling */
|
Merge the //depot/user/yar/vlan branch into CVS. It contains some collective
work by yar, thompsa and myself. The checksum offloading part also involves
work done by Mihail Balikov.
The most important changes:
o Instead of global linked list of all vlan softc use a per-trunk
hash. The size of hash is dynamically adjusted, depending on
number of entries. This changes struct ifnet, replacing counter
of vlans with a pointer to trunk structure. This change is an
improvement for setups with big number of VLANs, several interfaces
and several CPUs. It is a small regression for a setup with a single
VLAN interface.
An alternative to dynamic hash is a per-trunk static array with
4096 entries, which is a compile time option - VLAN_ARRAY. In my
experiments the array is not an improvement, probably because such
a big trunk structure doesn't fit into CPU cache.
o Introduce an UMA zone for VLAN tags. Since drivers depend on it,
the zone is declared in kern_mbuf.c, not in optional vlan(4) driver.
This change is a big improvement for any setup utilizing vlan(4).
o Use rwlock(9) instead of mutex(9) for locking. We are the first
ones to do this! :)
o Some drivers can do hardware VLAN tagging + hardware checksum
offloading. Add an infrastructure for this. Whenever vlan(4) is
attached to a parent or parent configuration is changed, the flags
on vlan(4) interface are updated.
In collaboration with: yar, thompsa
In collaboration with: Mihail Balikov <mihail.balikov interbgc.com>
2006-01-30 13:45:15 +00:00
|
|
|
#define IFCAP_VLAN_HWCSUM 0x0080 /* can do IFCAP_HWCSUM on VLANs */
|
2001-09-18 20:13:03 +00:00
|
|
|
|
|
|
|
#define IFCAP_HWCSUM (IFCAP_RXCSUM | IFCAP_TXCSUM)
|
2001-09-18 17:41:42 +00:00
|
|
|
|
1994-05-24 10:09:53 +00:00
|
|
|
#define IFQ_MAXLEN 50
|
|
|
|
#define IFNET_SLOWHZ 1 /* granularity is 1 second */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Message format for use in obtaining information about interfaces
|
|
|
|
* from getkerninfo and the routing socket
|
|
|
|
*/
|
|
|
|
struct if_msghdr {
|
|
|
|
u_short ifm_msglen; /* to skip over non-understood messages */
|
2001-02-06 12:05:58 +00:00
|
|
|
u_char ifm_version; /* future binary compatibility */
|
1994-05-24 10:09:53 +00:00
|
|
|
u_char ifm_type; /* message type */
|
|
|
|
int ifm_addrs; /* like rtm_addrs */
|
|
|
|
int ifm_flags; /* value of if_flags */
|
|
|
|
u_short ifm_index; /* index for associated ifp */
|
|
|
|
struct if_data ifm_data;/* statistics and other data about if */
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Message format for use in obtaining information about interface addresses
|
|
|
|
* from getkerninfo and the routing socket
|
|
|
|
*/
|
|
|
|
struct ifa_msghdr {
|
|
|
|
u_short ifam_msglen; /* to skip over non-understood messages */
|
2001-02-06 12:05:58 +00:00
|
|
|
u_char ifam_version; /* future binary compatibility */
|
1994-05-24 10:09:53 +00:00
|
|
|
u_char ifam_type; /* message type */
|
|
|
|
int ifam_addrs; /* like rtm_addrs */
|
|
|
|
int ifam_flags; /* value of ifa_flags */
|
|
|
|
u_short ifam_index; /* index for associated ifp */
|
|
|
|
int ifam_metric; /* value of ifa_metric */
|
|
|
|
};
|
|
|
|
|
1997-01-13 21:26:53 +00:00
|
|
|
/*
|
|
|
|
* Message format for use in obtaining information about multicast addresses
|
|
|
|
* from the routing socket
|
|
|
|
*/
|
|
|
|
struct ifma_msghdr {
|
|
|
|
u_short ifmam_msglen; /* to skip over non-understood messages */
|
2001-02-06 12:05:58 +00:00
|
|
|
u_char ifmam_version; /* future binary compatibility */
|
1997-01-13 21:26:53 +00:00
|
|
|
u_char ifmam_type; /* message type */
|
|
|
|
int ifmam_addrs; /* like rtm_addrs */
|
|
|
|
int ifmam_flags; /* value of ifa_flags */
|
|
|
|
u_short ifmam_index; /* index for associated ifp */
|
|
|
|
};
|
|
|
|
|
2002-01-18 14:33:04 +00:00
|
|
|
/*
|
|
|
|
* Message format announcing the arrival or departure of a network interface.
|
|
|
|
*/
|
|
|
|
struct if_announcemsghdr {
|
|
|
|
u_short ifan_msglen; /* to skip over non-understood messages */
|
|
|
|
u_char ifan_version; /* future binary compatibility */
|
|
|
|
u_char ifan_type; /* message type */
|
|
|
|
u_short ifan_index; /* index for associated ifp */
|
|
|
|
char ifan_name[IFNAMSIZ]; /* if name, e.g. "en0" */
|
|
|
|
u_short ifan_what; /* what type of announcement */
|
|
|
|
};
|
|
|
|
|
|
|
|
#define IFAN_ARRIVAL 0 /* interface arrival */
|
|
|
|
#define IFAN_DEPARTURE 1 /* interface departure */
|
|
|
|
|
1994-05-24 10:09:53 +00:00
|
|
|
/*
|
|
|
|
* Interface request structure used for socket
|
|
|
|
* ioctl's. All interface ioctl's must have parameter
|
|
|
|
* definitions which begin with ifr_name. The
|
|
|
|
* remainder may be interface specific.
|
|
|
|
*/
|
|
|
|
struct ifreq {
|
|
|
|
char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */
|
|
|
|
union {
|
|
|
|
struct sockaddr ifru_addr;
|
|
|
|
struct sockaddr ifru_dstaddr;
|
|
|
|
struct sockaddr ifru_broadaddr;
|
1999-02-19 13:41:35 +00:00
|
|
|
short ifru_flags[2];
|
2001-10-17 19:40:44 +00:00
|
|
|
short ifru_index;
|
1994-05-24 10:09:53 +00:00
|
|
|
int ifru_metric;
|
1994-08-08 10:49:26 +00:00
|
|
|
int ifru_mtu;
|
1994-12-21 22:57:05 +00:00
|
|
|
int ifru_phys;
|
1997-05-03 21:07:13 +00:00
|
|
|
int ifru_media;
|
1994-05-24 10:09:53 +00:00
|
|
|
caddr_t ifru_data;
|
2001-09-18 17:41:42 +00:00
|
|
|
int ifru_cap[2];
|
1994-05-24 10:09:53 +00:00
|
|
|
} ifr_ifru;
|
|
|
|
#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 */
|
2002-08-18 07:05:00 +00:00
|
|
|
#define ifr_flags ifr_ifru.ifru_flags[0] /* flags (low 16 bits) */
|
|
|
|
#define ifr_flagshigh ifr_ifru.ifru_flags[1] /* flags (high 16 bits) */
|
1994-05-24 10:09:53 +00:00
|
|
|
#define ifr_metric ifr_ifru.ifru_metric /* metric */
|
1994-08-08 10:49:26 +00:00
|
|
|
#define ifr_mtu ifr_ifru.ifru_mtu /* mtu */
|
1994-12-22 07:20:03 +00:00
|
|
|
#define ifr_phys ifr_ifru.ifru_phys /* physical wire */
|
1997-05-03 21:07:13 +00:00
|
|
|
#define ifr_media ifr_ifru.ifru_media /* physical media */
|
1994-05-24 10:09:53 +00:00
|
|
|
#define ifr_data ifr_ifru.ifru_data /* for use by interface */
|
2001-09-18 17:41:42 +00:00
|
|
|
#define ifr_reqcap ifr_ifru.ifru_cap[0] /* requested capabilities */
|
|
|
|
#define ifr_curcap ifr_ifru.ifru_cap[1] /* current capabilities */
|
2001-10-17 19:40:44 +00:00
|
|
|
#define ifr_index ifr_ifru.ifru_index /* interface index */
|
1994-05-24 10:09:53 +00:00
|
|
|
};
|
|
|
|
|
1998-01-13 02:56:21 +00:00
|
|
|
#define _SIZEOF_ADDR_IFREQ(ifr) \
|
|
|
|
((ifr).ifr_addr.sa_len > sizeof(struct sockaddr) ? \
|
|
|
|
(sizeof(struct ifreq) - sizeof(struct sockaddr) + \
|
|
|
|
(ifr).ifr_addr.sa_len) : sizeof(struct ifreq))
|
|
|
|
|
1994-05-24 10:09:53 +00:00
|
|
|
struct ifaliasreq {
|
|
|
|
char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */
|
|
|
|
struct sockaddr ifra_addr;
|
|
|
|
struct sockaddr ifra_broadaddr;
|
|
|
|
struct sockaddr ifra_mask;
|
|
|
|
};
|
|
|
|
|
1997-05-03 21:07:13 +00:00
|
|
|
struct ifmediareq {
|
|
|
|
char ifm_name[IFNAMSIZ]; /* if name, e.g. "en0" */
|
|
|
|
int ifm_current; /* current media options */
|
|
|
|
int ifm_mask; /* don't care mask */
|
|
|
|
int ifm_status; /* media status */
|
|
|
|
int ifm_active; /* active options */
|
|
|
|
int ifm_count; /* # entries in ifm_ulist array */
|
|
|
|
int *ifm_ulist; /* media words */
|
|
|
|
};
|
1999-06-19 18:42:31 +00:00
|
|
|
|
2005-06-05 03:13:13 +00:00
|
|
|
struct ifdrv {
|
|
|
|
char ifd_name[IFNAMSIZ]; /* if name, e.g. "en0" */
|
|
|
|
unsigned long ifd_cmd;
|
|
|
|
size_t ifd_len;
|
|
|
|
void *ifd_data;
|
|
|
|
};
|
|
|
|
|
1999-06-19 18:42:31 +00:00
|
|
|
/*
|
|
|
|
* Structure used to retrieve aux status data from interfaces.
|
1999-07-05 12:00:05 +00:00
|
|
|
* Kernel suppliers to this interface should respect the formatting
|
1999-06-19 18:42:31 +00:00
|
|
|
* needed by ifconfig(8): each line starts with a TAB and ends with
|
1999-07-05 12:00:05 +00:00
|
|
|
* a newline. The canonical example to copy and paste is in if_tun.c.
|
1999-06-19 18:42:31 +00:00
|
|
|
*/
|
|
|
|
|
1999-07-05 12:00:05 +00:00
|
|
|
#define IFSTATMAX 800 /* 10 lines of text */
|
1999-06-19 18:42:31 +00:00
|
|
|
struct ifstat {
|
1999-07-05 12:00:05 +00:00
|
|
|
char ifs_name[IFNAMSIZ]; /* if name, e.g. "en0" */
|
|
|
|
char ascii[IFSTATMAX + 1];
|
1999-06-19 18:42:31 +00:00
|
|
|
};
|
|
|
|
|
1994-05-24 10:09:53 +00:00
|
|
|
/*
|
|
|
|
* Structure used in SIOCGIFCONF request.
|
|
|
|
* Used to retrieve interface configuration
|
|
|
|
* for machine (useful for programs which
|
|
|
|
* must know all networks accessible).
|
|
|
|
*/
|
|
|
|
struct ifconf {
|
|
|
|
int ifc_len; /* size of associated buffer */
|
|
|
|
union {
|
|
|
|
caddr_t ifcu_buf;
|
|
|
|
struct ifreq *ifcu_req;
|
|
|
|
} ifc_ifcu;
|
|
|
|
#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */
|
|
|
|
#define ifc_req ifc_ifcu.ifcu_req /* array of structures returned */
|
|
|
|
};
|
|
|
|
|
2006-02-02 19:58:37 +00:00
|
|
|
#if defined (__amd64__) || defined (COMPAT_32BIT)
|
|
|
|
struct ifconf32 {
|
|
|
|
int ifc_len; /* size of associated buffer */
|
|
|
|
union {
|
|
|
|
u_int ifcu_buf;
|
|
|
|
u_int ifcu_req;
|
|
|
|
} ifc_ifcu;
|
|
|
|
};
|
|
|
|
#endif
|
1999-11-05 14:41:39 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Structure for SIOC[AGD]LIFADDR
|
|
|
|
*/
|
|
|
|
struct if_laddrreq {
|
|
|
|
char iflr_name[IFNAMSIZ];
|
|
|
|
u_int flags;
|
|
|
|
#define IFLR_PREFIX 0x8000 /* in: prefix given out: kernel fills id */
|
|
|
|
u_int prefixlen; /* in/out */
|
|
|
|
struct sockaddr_storage addr; /* in/out */
|
|
|
|
struct sockaddr_storage dstaddr; /* out */
|
|
|
|
};
|
|
|
|
|
2002-10-02 07:44:50 +00:00
|
|
|
#endif /* __BSD_VISIBLE */
|
|
|
|
|
1999-12-29 04:46:21 +00:00
|
|
|
#ifdef _KERNEL
|
1997-10-12 20:26:33 +00:00
|
|
|
#ifdef MALLOC_DECLARE
|
|
|
|
MALLOC_DECLARE(M_IFADDR);
|
|
|
|
MALLOC_DECLARE(M_IFMADDR);
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
1999-12-29 04:46:21 +00:00
|
|
|
#ifndef _KERNEL
|
1999-11-05 14:41:39 +00:00
|
|
|
struct if_nameindex {
|
2002-10-02 07:44:50 +00:00
|
|
|
unsigned int if_index; /* 1, 2, ... */
|
2002-10-02 07:55:33 +00:00
|
|
|
char *if_name; /* null terminated name: "le0", ... */
|
1999-11-05 14:41:39 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
__BEGIN_DECLS
|
2002-10-02 07:55:33 +00:00
|
|
|
void if_freenameindex(struct if_nameindex *);
|
|
|
|
char *if_indextoname(unsigned int, char *);
|
|
|
|
struct if_nameindex *if_nameindex(void);
|
|
|
|
unsigned int if_nametoindex(const char *);
|
1999-11-05 14:41:39 +00:00
|
|
|
__END_DECLS
|
|
|
|
#endif
|
|
|
|
|
1999-12-29 04:46:21 +00:00
|
|
|
#ifdef _KERNEL
|
2001-09-12 08:38:13 +00:00
|
|
|
struct thread;
|
1999-07-05 12:00:05 +00:00
|
|
|
|
|
|
|
/* XXX - this should go away soon. */
|
1997-01-03 19:50:26 +00:00
|
|
|
#include <net/if_var.h>
|
1994-05-24 10:09:53 +00:00
|
|
|
#endif
|
1994-08-21 05:11:48 +00:00
|
|
|
|
1994-11-15 14:41:38 +00:00
|
|
|
#endif /* !_NET_IF_H_ */
|