在C套接字上设置VLAN,在另一端接收它

在C套接字上设置VLAN,在另一端接收它,c,sockets,networking,network-programming,C,Sockets,Networking,Network Programming,我想设置一个C套接字,这样我就可以将802.1Q优先级标记添加到我将通过它发送的UDP数据包中。这就是我正在做的: struct ifreq ifr; memset(&ifr, 0, sizeof(ifr)); snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "wlan0.10"); ret = setsockopt(mSocket, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(if

我想设置一个C套接字,这样我就可以将802.1Q优先级标记添加到我将通过它发送的UDP数据包中。这就是我正在做的:

struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "wlan0.10");
ret = setsockopt(mSocket, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr));
if (ret < 0) {
    errorMsg << " Set socket options error: " << strerror(errno) << endl;
    log(errorMsg.str());
}

// this is only effective if the OS has VLAN enabled and VLAN is in use on the interface
const int VLAN_VOIP_PRIORITY = 5;
ret = setsockopt(mSocket, SOL_SOCKET, SO_PRIORITY, &VLAN_VOIP_PRIORITY, sizeof(VLAN_VOIP_PRIORITY));
if (ret < 0) {
    errorMsg << " Set socket options error: " << strerror(errno) << endl;
    log(errorMsg.str());
}
现在,我不知道它是否有效。我尝试在流的源端和目标端都使用Wireshark,但我看不到它(在源端监听时,我同时在wlan0和wlan0.10上监听,运气不好)。但是,如果我删除上面的SO_BINDTODEVICE,我可以很好地看到它,但是我也看不到SO_优先级对Wireshark有任何影响。

setsockopt(mSocket,SOL_SOCKET,SO_PRIORITY
将为内核IP堆栈中的数据包设置内部sk_优先级,而不是vlan优先级


使用此内部优先级可以做的一件事是使用
set\u exgress\u map
命令将其映射到vlan优先级。您可以通过SIOCSIFVLAN设置优先级

For eg) lets assume VLAN is eth0.10
Sample code as below

struct vlan_ioctl_args vlan_args;
setsockopt(sock_fd,SOL_SOCKET,SO_PRIORITY, &priority,sizeof(priority);
vlan_args.cmd=SET_VLAN_EGRESS_PRIORITY_CMD;
vlan_args.u.skb_priority=priority;
vlan_args.qos=qos;
vlan_args.u.name_type=VLAN_NAME_TYPE_RAW_PLUS_VID;
strcpy(vlan_args.device1,"eth0.10");

ioctl (sock_fd,SIOCSIFVLAN, &vlan_args);
然后,您可以通过检查来确认是否设置了出口优先级
cat/proc/net/vlan/eth0.10

谢谢。那么,我使用SO_BINDTODEVICE是否正确?这样做是否意味着vlan标记“10”(根据我的示例)是否将添加到以太网帧?我猜不会。您需要在vlan接口上配置IP地址/子网掩码,如果您向该子网上的某个对象发送流量,linux会将其路由到vlan接口(带有vlan标记)。如果要将内容发送到不在vlan接口子网上的对象,则需要设置路由表,以便通过vlan接口(而不是其他地方,例如,另一个接口上的默认网关)路由数据包802.1Q标记与UDP无关。这些标记适用于某些第2层LAN协议,例如以太网,但UDP是第4层协议,它完全不知道第2层。此外,除非您的以太网交换机配置为使用标记并在接口上配置中继,否则优先级毫无意义,并且在第3层剥离(例如路由器)。
For eg) lets assume VLAN is eth0.10
Sample code as below

struct vlan_ioctl_args vlan_args;
setsockopt(sock_fd,SOL_SOCKET,SO_PRIORITY, &priority,sizeof(priority);
vlan_args.cmd=SET_VLAN_EGRESS_PRIORITY_CMD;
vlan_args.u.skb_priority=priority;
vlan_args.qos=qos;
vlan_args.u.name_type=VLAN_NAME_TYPE_RAW_PLUS_VID;
strcpy(vlan_args.device1,"eth0.10");

ioctl (sock_fd,SIOCSIFVLAN, &vlan_args);