Grrr... botched remote commit. Let's try this again: vlan updates,
take two.
This commit is contained in:
parent
f731f10490
commit
97ed1257f9
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=44764
@ -1,5 +1,5 @@
|
|||||||
# From: @(#)Makefile 8.1 (Berkeley) 6/5/93
|
# From: @(#)Makefile 8.1 (Berkeley) 6/5/93
|
||||||
# $Id: Makefile,v 1.9 1997/02/22 14:32:32 peter Exp $
|
# $Id: Makefile,v 1.10 1997/05/04 06:27:45 peter Exp $
|
||||||
|
|
||||||
PROG= ifconfig
|
PROG= ifconfig
|
||||||
SRCS= ifconfig.c
|
SRCS= ifconfig.c
|
||||||
@ -8,10 +8,14 @@ SRCS= ifconfig.c
|
|||||||
SRCS+= ifmedia.c
|
SRCS+= ifmedia.c
|
||||||
CFLAGS+=-DUSE_IF_MEDIA
|
CFLAGS+=-DUSE_IF_MEDIA
|
||||||
|
|
||||||
|
#comment out to exclude SIOC[GS]ETVLAN support
|
||||||
|
SRCS+= ifvlan.c
|
||||||
|
CFLAGS+=-DUSE_VLANS
|
||||||
|
|
||||||
MAN8= ifconfig.8
|
MAN8= ifconfig.8
|
||||||
DPADD= ${LIBIPX}
|
DPADD= ${LIBIPX}
|
||||||
LDADD= -lipx
|
LDADD= -lipx
|
||||||
COPTS= -DNS -Wall -Wmissing-prototypes -Wcast-qual -Wwrite-strings \
|
COPTS= -DNS -Wall -Wmissing-prototypes -Wcast-qual -Wwrite-strings \
|
||||||
-Wnested-externs
|
-Wnested-externs -I..
|
||||||
|
|
||||||
.include <bsd.prog.mk>
|
.include <bsd.prog.mk>
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
.\" SUCH DAMAGE.
|
.\" SUCH DAMAGE.
|
||||||
.\"
|
.\"
|
||||||
.\" From: @(#)ifconfig.8 8.3 (Berkeley) 1/5/94
|
.\" From: @(#)ifconfig.8 8.3 (Berkeley) 1/5/94
|
||||||
.\" $Id: ifconfig.8,v 1.17 1998/06/08 02:00:45 danny Exp $
|
.\" $Id: ifconfig.8,v 1.18 1998/07/06 06:53:42 charnier Exp $
|
||||||
.\"
|
.\"
|
||||||
.Dd February 13, 1996
|
.Dd February 13, 1996
|
||||||
.Dt IFCONFIG 8
|
.Dt IFCONFIG 8
|
||||||
@ -200,6 +200,49 @@ list of available options.
|
|||||||
.It Fl mediaopt Ar opts
|
.It Fl mediaopt Ar opts
|
||||||
If the driver supports the media selection system, disable the
|
If the driver supports the media selection system, disable the
|
||||||
specified media options on the interface.
|
specified media options on the interface.
|
||||||
|
.It Cm vlan Ar vlan_tag
|
||||||
|
If the interface is a vlan pseudo interface, set the vlan tag value
|
||||||
|
to
|
||||||
|
.Ar vlan_tag .
|
||||||
|
This value is a 16-bit number which is used to create an 802.1Q
|
||||||
|
vlan header for packets sent from the vlan interface. Note that
|
||||||
|
.Cm vlan
|
||||||
|
and
|
||||||
|
.Cm vlandev
|
||||||
|
must both be set at the same time.
|
||||||
|
.It Cm vlandev Ar iface
|
||||||
|
If the interface is a vlan pseudo device, associate physical interface
|
||||||
|
.Ar iface
|
||||||
|
with it. Packets transmitted through the vlan interface will be
|
||||||
|
diverted to the specified physical interface
|
||||||
|
.Ar iface
|
||||||
|
with 802.1Q vlan encapsulation. Packets with 802.1Q encapsulation received
|
||||||
|
by the parent interface with the correct vlan tag will be diverted to
|
||||||
|
the associated vlan pseudo-interface. The vlan interface is assigned a
|
||||||
|
copy of the parent interface's flags and the parent's ethernet address.
|
||||||
|
The
|
||||||
|
.Cm vlandev
|
||||||
|
and
|
||||||
|
.Cm vlan
|
||||||
|
must both be set at the same time. If the vlan interface already has
|
||||||
|
a physical interface associated with it, this command will fail. To
|
||||||
|
change the association to another physical interface, the existing
|
||||||
|
association must be cleared first.
|
||||||
|
.Pp
|
||||||
|
Note: if the
|
||||||
|
.Ar link0
|
||||||
|
flag is set on the vlan interface, the vlan pseudo
|
||||||
|
interface's behavior changes: the
|
||||||
|
.Ar link0
|
||||||
|
tells the vlan interface that the
|
||||||
|
parent interface supports insertion and extraction of vlan tags on its
|
||||||
|
own (usually in firmware) and that it should pass packets to and from
|
||||||
|
the parent unaltered.
|
||||||
|
.It Fl vlandev Ar iface
|
||||||
|
If the driver is a vlan pseudo device, disassociate the physical interface
|
||||||
|
.Ar iface
|
||||||
|
from it. This breaks the link between the vlan interface and its parent,
|
||||||
|
clears its vlan tag, flags and its link address and shuts the interface down.
|
||||||
.It Cm metric Ar n
|
.It Cm metric Ar n
|
||||||
Set the routing metric of the interface to
|
Set the routing metric of the interface to
|
||||||
.Ar n ,
|
.Ar n ,
|
||||||
|
@ -42,7 +42,7 @@ static const char copyright[] =
|
|||||||
static char sccsid[] = "@(#)ifconfig.c 8.2 (Berkeley) 2/16/94";
|
static char sccsid[] = "@(#)ifconfig.c 8.2 (Berkeley) 2/16/94";
|
||||||
#endif
|
#endif
|
||||||
static const char rcsid[] =
|
static const char rcsid[] =
|
||||||
"$Id: ifconfig.c,v 1.37 1998/07/06 19:54:39 bde Exp $";
|
"$Id: ifconfig.c,v 1.38 1998/08/07 06:36:53 phk Exp $";
|
||||||
#endif /* not lint */
|
#endif /* not lint */
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
@ -165,6 +165,11 @@ struct cmd {
|
|||||||
{ "media", NEXTARG, setmedia },
|
{ "media", NEXTARG, setmedia },
|
||||||
{ "mediaopt", NEXTARG, setmediaopt },
|
{ "mediaopt", NEXTARG, setmediaopt },
|
||||||
{ "-mediaopt", NEXTARG, unsetmediaopt },
|
{ "-mediaopt", NEXTARG, unsetmediaopt },
|
||||||
|
#endif
|
||||||
|
#ifdef USE_VLANS
|
||||||
|
{ "vlan", NEXTARG, setvlantag },
|
||||||
|
{ "vlandev", NEXTARG, setvlandev },
|
||||||
|
{ "-vlandev", NEXTARG, unsetvlandev },
|
||||||
#endif
|
#endif
|
||||||
{ "normal", -IFF_LINK0, setifflags },
|
{ "normal", -IFF_LINK0, setifflags },
|
||||||
{ "compress", IFF_LINK0, setifflags },
|
{ "compress", IFF_LINK0, setifflags },
|
||||||
@ -217,6 +222,9 @@ struct afswtch {
|
|||||||
#ifdef USE_IF_MEDIA
|
#ifdef USE_IF_MEDIA
|
||||||
{ "media", AF_INET, media_status, NULL }, /* XXX not real!! */
|
{ "media", AF_INET, media_status, NULL }, /* XXX not real!! */
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef USE_VLANS
|
||||||
|
{ "vlan", AF_INET, media_status, NULL }, /* XXX not real!! */
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
{ 0, 0, 0, 0 }
|
{ 0, 0, 0, 0 }
|
||||||
};
|
};
|
||||||
@ -632,6 +640,11 @@ setifdstaddr(addr, param, s, afp)
|
|||||||
(*afp->af_getaddr)(addr, DSTADDR);
|
(*afp->af_getaddr)(addr, DSTADDR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note: doing an SIOCIGIFFLAGS scribbles on the union portion
|
||||||
|
* of the ifreq structure, which may confuse other parts of ifconfig.
|
||||||
|
* Make a private copy so we can avoid that.
|
||||||
|
*/
|
||||||
void
|
void
|
||||||
setifflags(vname, value, s, afp)
|
setifflags(vname, value, s, afp)
|
||||||
const char *vname;
|
const char *vname;
|
||||||
@ -639,20 +652,24 @@ setifflags(vname, value, s, afp)
|
|||||||
int s;
|
int s;
|
||||||
const struct afswtch *afp;
|
const struct afswtch *afp;
|
||||||
{
|
{
|
||||||
if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) {
|
struct ifreq my_ifr;
|
||||||
|
|
||||||
|
bcopy((char *)&ifr, (char *)&my_ifr, sizeof(struct ifreq));
|
||||||
|
|
||||||
|
if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&my_ifr) < 0) {
|
||||||
Perror("ioctl (SIOCGIFFLAGS)");
|
Perror("ioctl (SIOCGIFFLAGS)");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
|
strncpy(my_ifr.ifr_name, name, sizeof (my_ifr.ifr_name));
|
||||||
flags = ifr.ifr_flags;
|
flags = my_ifr.ifr_flags;
|
||||||
|
|
||||||
if (value < 0) {
|
if (value < 0) {
|
||||||
value = -value;
|
value = -value;
|
||||||
flags &= ~value;
|
flags &= ~value;
|
||||||
} else
|
} else
|
||||||
flags |= value;
|
flags |= value;
|
||||||
ifr.ifr_flags = flags;
|
my_ifr.ifr_flags = flags;
|
||||||
if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&ifr) < 0)
|
if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&my_ifr) < 0)
|
||||||
Perror(vname);
|
Perror(vname);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -752,6 +769,9 @@ status(afp, addrcount, sdl, ifm, ifam)
|
|||||||
if (afp->af_af == info.rti_info[RTAX_IFA]->sa_family &&
|
if (afp->af_af == info.rti_info[RTAX_IFA]->sa_family &&
|
||||||
#ifdef USE_IF_MEDIA
|
#ifdef USE_IF_MEDIA
|
||||||
afp->af_status != media_status &&
|
afp->af_status != media_status &&
|
||||||
|
#endif
|
||||||
|
#ifdef USE_VLANS
|
||||||
|
afp->af_status != vlan_status &&
|
||||||
#endif
|
#endif
|
||||||
afp->af_status != ether_status) {
|
afp->af_status != ether_status) {
|
||||||
p = afp;
|
p = afp;
|
||||||
@ -761,6 +781,9 @@ status(afp, addrcount, sdl, ifm, ifam)
|
|||||||
if (p->af_af == info.rti_info[RTAX_IFA]->sa_family &&
|
if (p->af_af == info.rti_info[RTAX_IFA]->sa_family &&
|
||||||
#ifdef USE_IF_MEDIA
|
#ifdef USE_IF_MEDIA
|
||||||
p->af_status != media_status &&
|
p->af_status != media_status &&
|
||||||
|
#endif
|
||||||
|
#ifdef USE_VLANS
|
||||||
|
p->af_status != vlan_status &&
|
||||||
#endif
|
#endif
|
||||||
p->af_status != ether_status)
|
p->af_status != ether_status)
|
||||||
(*p->af_status)(s, &info);
|
(*p->af_status)(s, &info);
|
||||||
@ -773,9 +796,13 @@ status(afp, addrcount, sdl, ifm, ifam)
|
|||||||
#ifdef USE_IF_MEDIA
|
#ifdef USE_IF_MEDIA
|
||||||
if (allfamilies || afp->af_status == media_status)
|
if (allfamilies || afp->af_status == media_status)
|
||||||
media_status(s, NULL);
|
media_status(s, NULL);
|
||||||
|
#endif
|
||||||
|
#ifdef USE_VLANS
|
||||||
|
if (allfamilies || afp->af_status == vlan_status)
|
||||||
|
vlan_status(s, NULL);
|
||||||
#endif
|
#endif
|
||||||
if (!allfamilies && !p && afp->af_status != media_status &&
|
if (!allfamilies && !p && afp->af_status != media_status &&
|
||||||
afp->af_status != ether_status)
|
afp->af_status != ether_status && afp->af_status != vlan_status)
|
||||||
warnx("%s has no %s interface address!", name, afp->af_name);
|
warnx("%s has no %s interface address!", name, afp->af_name);
|
||||||
|
|
||||||
close(s);
|
close(s);
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
*
|
*
|
||||||
* so there!
|
* so there!
|
||||||
*
|
*
|
||||||
* $Id: ifconfig.h,v 1.2 1997/05/10 14:47:35 peter Exp $
|
* $Id: ifconfig.h,v 1.3 1997/05/10 17:14:53 peter Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern struct ifreq ifr;
|
extern struct ifreq ifr;
|
||||||
@ -44,3 +44,8 @@ extern void setmedia(const char *, int, int, const struct afswtch *rafp);
|
|||||||
extern void setmediaopt(const char *, int, int, const struct afswtch *rafp);
|
extern void setmediaopt(const char *, int, int, const struct afswtch *rafp);
|
||||||
extern void unsetmediaopt(const char *, int, int, const struct afswtch *rafp);
|
extern void unsetmediaopt(const char *, int, int, const struct afswtch *rafp);
|
||||||
extern void media_status(int s, struct rt_addrinfo *);
|
extern void media_status(int s, struct rt_addrinfo *);
|
||||||
|
|
||||||
|
extern void setvlantag(const char *, int, int, const struct afswtch *rafp);
|
||||||
|
extern void setvlandev(const char *, int, int, const struct afswtch *rafp);
|
||||||
|
extern void unsetvlandev(const char *, int, int, const struct afswtch *rafp);
|
||||||
|
extern void vlan_status(int s, struct rt_addrinfo *);
|
||||||
|
156
sbin/ifconfig/ifvlan.c
Normal file
156
sbin/ifconfig/ifvlan.c
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1999
|
||||||
|
* Bill Paul <wpaul@ctr.columbia.edu>. 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.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by Bill Paul.
|
||||||
|
* 4. Neither the name of the author nor the names of any co-contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY Bill Paul 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 Bill Paul OR THE VOICES IN HIS HEAD
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/sockio.h>
|
||||||
|
#include <sys/mbuf.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <net/ethernet.h>
|
||||||
|
#include <net/if.h>
|
||||||
|
#include <net/if_var.h>
|
||||||
|
#include <net/if_vlan_var.h>
|
||||||
|
#include <net/route.h>
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <err.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "ifconfig.h"
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
static const char rcsid[] =
|
||||||
|
"$Id$";
|
||||||
|
#endif
|
||||||
|
static int __tag = 0;
|
||||||
|
static int __have_tag = 0;
|
||||||
|
|
||||||
|
void vlan_status(s, info)
|
||||||
|
int s;
|
||||||
|
struct rt_addrinfo *info __unused;
|
||||||
|
{
|
||||||
|
struct vlanreq vreq;
|
||||||
|
|
||||||
|
bzero((char *)&vreq, sizeof(struct vlanreq));
|
||||||
|
ifr.ifr_data = (caddr_t)&vreq;
|
||||||
|
|
||||||
|
if (ioctl(s, SIOCGETVLAN, (caddr_t)&ifr) == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
printf("\tvlan: %d parent interface: %s\n",
|
||||||
|
vreq.vlr_tag, vreq.vlr_parent[0] == '\0' ?
|
||||||
|
"<none>" : vreq.vlr_parent);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setvlantag(val, d, s, afp)
|
||||||
|
const char *val;
|
||||||
|
int d, s;
|
||||||
|
const struct afswtch *afp;
|
||||||
|
{
|
||||||
|
u_int16_t tag;
|
||||||
|
struct vlanreq vreq;
|
||||||
|
|
||||||
|
__tag = tag = atoi(val);
|
||||||
|
__have_tag = 1;
|
||||||
|
|
||||||
|
bzero((char *)&vreq, sizeof(struct vlanreq));
|
||||||
|
ifr.ifr_data = (caddr_t)&vreq;
|
||||||
|
|
||||||
|
if (ioctl(s, SIOCGETVLAN, (caddr_t)&ifr) == -1)
|
||||||
|
err(1, "SIOCGETVLAN");
|
||||||
|
|
||||||
|
vreq.vlr_tag = tag;
|
||||||
|
|
||||||
|
if (ioctl(s, SIOCSETVLAN, (caddr_t)&ifr) == -1)
|
||||||
|
err(1, "SIOCSETVLAN");
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setvlandev(val, d, s, afp)
|
||||||
|
const char *val;
|
||||||
|
int d, s;
|
||||||
|
const struct afswtch *afp;
|
||||||
|
{
|
||||||
|
struct vlanreq vreq;
|
||||||
|
|
||||||
|
if (!__have_tag)
|
||||||
|
errx(1, "must specify both vlan tag and device");
|
||||||
|
|
||||||
|
bzero((char *)&vreq, sizeof(struct vlanreq));
|
||||||
|
ifr.ifr_data = (caddr_t)&vreq;
|
||||||
|
|
||||||
|
if (ioctl(s, SIOCGETVLAN, (caddr_t)&ifr) == -1)
|
||||||
|
err(1, "SIOCGETVLAN");
|
||||||
|
|
||||||
|
strncpy(vreq.vlr_parent, val, sizeof(vreq.vlr_parent));
|
||||||
|
vreq.vlr_tag = __tag;
|
||||||
|
|
||||||
|
if (ioctl(s, SIOCSETVLAN, (caddr_t)&ifr) == -1)
|
||||||
|
err(1, "SIOCSETVLAN");
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void unsetvlandev(val, d, s, afp)
|
||||||
|
const char *val;
|
||||||
|
int d, s;
|
||||||
|
const struct afswtch *afp;
|
||||||
|
{
|
||||||
|
struct vlanreq vreq;
|
||||||
|
|
||||||
|
bzero((char *)&vreq, sizeof(struct vlanreq));
|
||||||
|
ifr.ifr_data = (caddr_t)&vreq;
|
||||||
|
|
||||||
|
if (ioctl(s, SIOCGETVLAN, (caddr_t)&ifr) == -1)
|
||||||
|
err(1, "SIOCGETVLAN");
|
||||||
|
|
||||||
|
bzero((char *)&vreq.vlr_parent, sizeof(vreq.vlr_parent));
|
||||||
|
vreq.vlr_tag = 0;
|
||||||
|
|
||||||
|
if (ioctl(s, SIOCSETVLAN, (caddr_t)&ifr) == -1)
|
||||||
|
err(1, "SIOCSETVLAN");
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
@ -26,7 +26,7 @@
|
|||||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id: if_vlan.c,v 1.9 1999/03/15 00:33:02 wpaul Exp $
|
* $Id: if_vlan.c,v 1.5 1999/03/15 01:17:26 wpaul Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -40,6 +40,7 @@
|
|||||||
* if_start(), rewrite them for use by the real outgoing interface,
|
* if_start(), rewrite them for use by the real outgoing interface,
|
||||||
* and ask it to send them.
|
* and ask it to send them.
|
||||||
*
|
*
|
||||||
|
*
|
||||||
* XXX It's incorrect to assume that we must always kludge up
|
* XXX It's incorrect to assume that we must always kludge up
|
||||||
* headers on the physical device's behalf: some devices support
|
* headers on the physical device's behalf: some devices support
|
||||||
* VLAN tag insersion and extraction in firmware. For these cases,
|
* VLAN tag insersion and extraction in firmware. For these cases,
|
||||||
|
@ -26,13 +26,18 @@
|
|||||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id: if_vlan_var.h,v 1.3 1999/03/15 00:33:02 wpaul Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _NET_IF_VLAN_VAR_H_
|
#ifndef _NET_IF_VLAN_VAR_H_
|
||||||
#define _NET_IF_VLAN_VAR_H_ 1
|
#define _NET_IF_VLAN_VAR_H_ 1
|
||||||
|
|
||||||
#ifdef KERNEL
|
#ifdef KERNEL
|
||||||
|
struct vlan_mc_entry {
|
||||||
|
struct ether_addr mc_addr;
|
||||||
|
SLIST_ENTRY(vlan_mc_entry) mc_entries;
|
||||||
|
};
|
||||||
|
|
||||||
struct ifvlan {
|
struct ifvlan {
|
||||||
struct arpcom ifv_ac; /* make this an interface */
|
struct arpcom ifv_ac; /* make this an interface */
|
||||||
struct ifnet *ifv_p; /* parent inteface of this vlan */
|
struct ifnet *ifv_p; /* parent inteface of this vlan */
|
||||||
@ -41,6 +46,7 @@ struct ifvlan {
|
|||||||
u_int16_t ifvm_proto; /* encapsulation ethertype */
|
u_int16_t ifvm_proto; /* encapsulation ethertype */
|
||||||
u_int16_t ifvm_tag; /* tag to apply on packets leaving if */
|
u_int16_t ifvm_tag; /* tag to apply on packets leaving if */
|
||||||
} ifv_mib;
|
} ifv_mib;
|
||||||
|
SLIST_HEAD(__vlan_mchead, vlan_mc_entry) vlan_mc_listhead;
|
||||||
};
|
};
|
||||||
#define ifv_if ifv_ac.ac_if
|
#define ifv_if ifv_ac.ac_if
|
||||||
#define ifv_tag ifv_mib.ifvm_tag
|
#define ifv_tag ifv_mib.ifvm_tag
|
||||||
@ -79,6 +85,8 @@ struct vlanreq {
|
|||||||
/* shared with if_ethersubr.c: */
|
/* shared with if_ethersubr.c: */
|
||||||
extern u_int vlan_proto;
|
extern u_int vlan_proto;
|
||||||
extern int vlan_input(struct ether_header *eh, struct mbuf *m);
|
extern int vlan_input(struct ether_header *eh, struct mbuf *m);
|
||||||
|
extern void vlan_input_tag(struct ether_header *eh,
|
||||||
|
struct mbuf *m, u_int16_t t);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _NET_IF_VLAN_VAR_H_ */
|
#endif /* _NET_IF_VLAN_VAR_H_ */
|
||||||
|
Loading…
Reference in New Issue
Block a user