0

我想设置一个 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());
}

wlan0.10 是我使用以下设置的虚拟网络:

vconfig add wlan0 10
ip addr add 10.0.0.1/24 dev wlan0.10

现在,我不知道它是否有效。我尝试在流的源端和目标端都使用 Wireshark,但我看不到它(在源端收听时,我在 wlan0 和 wlan0.10 上都收听了,没有运气)。如果我删除上面的 SO_BINDTODEVICE,我可以看到它很好,但是我也看不到 SO_PRIORITY 对 Wireshark 有任何影响的任何迹象。

4

2 回答 2

2

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

您可以使用此内部优先级执行的一项操作是使用vconfig set_egress_map命令将其映射到 vlan 优先级

于 2013-10-08T21:25:39.770 回答
0

您可以通过 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 来确认是否设置了出口优先级

于 2018-01-12T13:11:10.297 回答