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