创建VLAN的程序代码

来源:互联网 发布:张大奕淘宝店铺 编辑:程序博客网 时间:2024/04/30 09:09

1,本来打算是用NETLINK 套接口机制实现创建/添加VLAN 的,但是没有成功。NETLINK帮组文档中:RTM_NEWLINK - Create a new network interface说得很清楚是可以创建新的网络接口的,但是本人水品有限,对代码修改了很多遍尝试很多可能,花了大量时间最终没有成功,真失败呀,不知哪里出了问题,有高人了解指点下感激不尽。最后考虑用ioctl来实现,如此简单,真是得来全部费功夫。

2,哈哈,废话不多说看代码。

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <linux/if_vlan.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <linux/sockios.h>


int main(int argc ,char **argv){
        int fd;
        struct vlan_ioctl_args if_request;  //定义vlan参数的结构体变量,这结构体包括接口名,vlan ID等参数
        char *if_name;
        int vid;
        if(argc!=4){
                printf("usage:%s add eth* vlanID\n",argv[0]);
                exit(1);
        }
        if_name=argv[2];
        strcpy(if_request.device1,if_name);   //把if_name的值拷贝到device1中
        if_request.u.VID=atoi(argv[3]);
        vid=if_request.u.VID;
        if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {             //创建socket获得socket ID
                fprintf(stderr, "FATAL:  Couldn't open a socket..go figure!\n");
                exit(2);
        }
        if(strcmp(argv[1],"add")==0){
                if_request.cmd=ADD_VLAN_CMD;      //vlan 动作,ADD_VLAN_CMD代表添加一个vlan
                if (ioctl(fd, SIOCSIFVLAN, &if_request) < 0) {
                        fprintf(stderr,"ERROR: trying to add VLAN #%u to IF -:%s:- error: %s\n",vid, if_name,strerror(errno));
                        exit(3);
                }
                else {
                        fprintf(stdout,"Added VLAN with VID == %u to IF -:%s:-\n",vid, if_name);
                        if (vid == 1) {
                                fprintf(stdout, "WARNING:  VLAN 1 does not work with many switches,\nconsider another number if you have problems.\n");
                        }
                }
        }

}

3,程序运行后的效果

tom@net-tom:~/route$ ifconfig
eth1      Link encap:以太网  硬件地址 00:0c:29:d8:8f:5a  
          inet 地址:10.168.50.27  广播:10.168.50.255  掩码:255.255.255.0
          inet6 地址: fe80::20c:29ff:fed8:8f5a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1
          接收数据包:610 错误:0 丢弃:0 过载:0 帧数:0
          发送数据包:686 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:1000
          接收字节:482136 (482.1 KB)  发送字节:174180 (174.1 KB)
          中断:18 基本地址:0x1400

lo        Link encap:本地环回  
          inet 地址:127.0.0.1  掩码:255.0.0.0
          inet6 地址: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  跃点数:1
          接收数据包:4 错误:0 丢弃:0 过载:0 帧数:0
          发送数据包:4 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:0
          接收字节:240 (240.0 B)  发送字节:240 (240.0 B)

tom@net-tom:~/route$ sudo ./add_vlan add eth1 2
Added VLAN with VID == 2 to IF -:eth1:-
tom@net-tom:~/route$ ifconfig -a
eth1      Link encap:以太网  硬件地址 00:0c:29:d8:8f:5a  
          inet 地址:10.168.50.27  广播:10.168.50.255  掩码:255.255.255.0
          inet6 地址: fe80::20c:29ff:fed8:8f5a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1
          接收数据包:636 错误:0 丢弃:0 过载:0 帧数:0
          发送数据包:706 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:1000
          接收字节:492544 (492.5 KB)  发送字节:181060 (181.0 KB)
          中断:18 基本地址:0x1400

eth1.2    Link encap:以太网  硬件地址 00:0c:29:d8:8f:5a  
          BROADCAST MULTICAST  MTU:1500  跃点数:1
          接收数据包:0 错误:0 丢弃:0 过载:0 帧数:0
          发送数据包:0 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:0
          接收字节:0 (0.0 B)  发送字节:0 (0.0 B)

lo        Link encap:本地环回  
          inet 地址:127.0.0.1  掩码:255.0.0.0
          inet6 地址: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  跃点数:1
          接收数据包:4 错误:0 丢弃:0 过载:0 帧数:0
          发送数据包:4 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:0

          接收字节:240 (240.0 B)  发送字节:240 (240.0 B)



原创粉丝点击