ifvlan.c revision 83888
150397Sobrien/*
272562Sobrien * Copyright (c) 1999
390075Sobrien *	Bill Paul <wpaul@ctr.columbia.edu>.  All rights reserved.
450397Sobrien *
550397Sobrien * Redistribution and use in source and binary forms, with or without
650397Sobrien * modification, are permitted provided that the following conditions
750397Sobrien * are met:
850397Sobrien * 1. Redistributions of source code must retain the above copyright
950397Sobrien *    notice, this list of conditions and the following disclaimer.
1050397Sobrien * 2. Redistributions in binary form must reproduce the above copyright
1150397Sobrien *    notice, this list of conditions and the following disclaimer in the
1250397Sobrien *    documentation and/or other materials provided with the distribution.
1350397Sobrien * 3. All advertising materials mentioning features or use of this software
1450397Sobrien *    must display the following acknowledgement:
1550397Sobrien *	This product includes software developed by Bill Paul.
1650397Sobrien * 4. Neither the name of the author nor the names of any co-contributors
1750397Sobrien *    may be used to endorse or promote products derived from this software
1850397Sobrien *    without specific prior written permission.
1950397Sobrien *
2050397Sobrien * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
2150397Sobrien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2250397Sobrien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2350397Sobrien * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
2450397Sobrien * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2550397Sobrien * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2650397Sobrien * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2750397Sobrien * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2850397Sobrien * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2950397Sobrien * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
3050397Sobrien * THE POSSIBILITY OF SUCH DAMAGE.
3150397Sobrien */
3250397Sobrien
3350397Sobrien#include <sys/param.h>
3450397Sobrien#include <sys/ioctl.h>
3550397Sobrien#include <sys/socket.h>
3650397Sobrien#include <sys/sockio.h>
3790075Sobrien
3850397Sobrien#include <stdlib.h>
3990075Sobrien#include <unistd.h>
4090075Sobrien
4150397Sobrien#include <net/ethernet.h>
4250397Sobrien#include <net/if.h>
4390075Sobrien#include <net/if_var.h>
4490075Sobrien#include <net/if_vlan_var.h>
4590075Sobrien#include <net/route.h>
4690075Sobrien
4790075Sobrien#include <ctype.h>
4850397Sobrien#include <stdio.h>
4950397Sobrien#include <string.h>
5050397Sobrien#include <stdlib.h>
5150397Sobrien#include <unistd.h>
5250397Sobrien#include <err.h>
5350397Sobrien#include <errno.h>
5450397Sobrien
5550397Sobrien#include "ifconfig.h"
5650397Sobrien
5750397Sobrien#ifndef lint
5850397Sobrienstatic const char rcsid[] =
5950397Sobrien  "$FreeBSD: head/sbin/ifconfig/ifvlan.c 83888 2001-09-24 15:00:16Z rwatson $";
6050397Sobrien#endif
6150397Sobrienstatic int			__tag = 0;
6250397Sobrienstatic int			__have_tag = 0;
6350397Sobrien
6450397Sobrienvoid vlan_status(s, info)
6550397Sobrien	int			s;
6650397Sobrien	struct rt_addrinfo *info __unused;
6750397Sobrien{
6850397Sobrien	struct vlanreq		vreq;
6950397Sobrien
7050397Sobrien	bzero((char *)&vreq, sizeof(struct vlanreq));
7196263Sobrien	ifr.ifr_data = (caddr_t)&vreq;
7296263Sobrien
7390075Sobrien	if (ioctl(s, SIOCGETVLAN, (caddr_t)&ifr) == -1)
7490075Sobrien		return;
7550397Sobrien
7650397Sobrien	printf("\tvlan: %d parent interface: %s\n",
7750397Sobrien	    vreq.vlr_tag, vreq.vlr_parent[0] == '\0' ?
7850397Sobrien	    "<none>" : vreq.vlr_parent);
7996263Sobrien
8096263Sobrien	return;
8196263Sobrien}
8250397Sobrien
8350397Sobrienvoid setvlantag(val, d, s, afp)
8450397Sobrien	const char		*val;
8596263Sobrien	int			d, s;
8696263Sobrien	const struct afswtch	*afp;
8796263Sobrien{
8896263Sobrien	u_int16_t		tag;
8950397Sobrien	struct vlanreq		vreq;
9050397Sobrien
9150397Sobrien	__tag = tag = atoi(val);
9250397Sobrien	__have_tag = 1;
9350397Sobrien
9450397Sobrien	bzero((char *)&vreq, sizeof(struct vlanreq));
9550397Sobrien	ifr.ifr_data = (caddr_t)&vreq;
9650397Sobrien
9750397Sobrien	if (ioctl(s, SIOCGETVLAN, (caddr_t)&ifr) == -1)
9850397Sobrien		err(1, "SIOCGETVLAN");
9950397Sobrien
10050397Sobrien	vreq.vlr_tag = tag;
10150397Sobrien
10250397Sobrien	if (ioctl(s, SIOCSETVLAN, (caddr_t)&ifr) == -1)
10350397Sobrien		err(1, "SIOCSETVLAN");
10490075Sobrien
10590075Sobrien	return;
10690075Sobrien}
10790075Sobrien
10890075Sobrienvoid setvlandev(val, d, s, afp)
10990075Sobrien	const char		*val;
11090075Sobrien	int			d, s;
11190075Sobrien	const struct afswtch	*afp;
11290075Sobrien{
11390075Sobrien	struct vlanreq		vreq;
11490075Sobrien
11590075Sobrien	if (!__have_tag)
11690075Sobrien		errx(1, "must specify both vlan tag and device");
11790075Sobrien
11890075Sobrien	bzero((char *)&vreq, sizeof(struct vlanreq));
11990075Sobrien	ifr.ifr_data = (caddr_t)&vreq;
12090075Sobrien
12190075Sobrien	if (ioctl(s, SIOCGETVLAN, (caddr_t)&ifr) == -1)
12250397Sobrien		err(1, "SIOCGETVLAN");
12350397Sobrien
12450397Sobrien	strncpy(vreq.vlr_parent, val, sizeof(vreq.vlr_parent));
12550397Sobrien	vreq.vlr_tag = __tag;
12650397Sobrien
12750397Sobrien	if (ioctl(s, SIOCSETVLAN, (caddr_t)&ifr) == -1)
12850397Sobrien		err(1, "SIOCSETVLAN");
12952284Sobrien
13050397Sobrien	return;
13150397Sobrien}
13290075Sobrien
13390075Sobrienvoid unsetvlandev(val, d, s, afp)
13450397Sobrien	const char		*val;
13590075Sobrien	int			d, s;
13690075Sobrien	const struct afswtch	*afp;
13790075Sobrien{
13850397Sobrien	struct vlanreq		vreq;
13950397Sobrien
14050397Sobrien	bzero((char *)&vreq, sizeof(struct vlanreq));
14190075Sobrien	ifr.ifr_data = (caddr_t)&vreq;
14290075Sobrien
14390075Sobrien	if (ioctl(s, SIOCGETVLAN, (caddr_t)&ifr) == -1)
14452284Sobrien		err(1, "SIOCGETVLAN");
14590075Sobrien
14690075Sobrien	bzero((char *)&vreq.vlr_parent, sizeof(vreq.vlr_parent));
14790075Sobrien	vreq.vlr_tag = 0;
14890075Sobrien
14990075Sobrien	if (ioctl(s, SIOCSETVLAN, (caddr_t)&ifr) == -1)
15090075Sobrien		err(1, "SIOCSETVLAN");
15190075Sobrien
15290075Sobrien	return;
15390075Sobrien}
15490075Sobrien