我想设置一个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_优先级对Wireshark有任何影响的任何迹象。

最佳答案

setsockopt(mSocket, SOL_SOCKET, SO_PRIORITY将为内核IP堆栈中的数据包设置内部sk U优先级,而不是vlan优先级。
使用此内部优先级可以做的一件事是使用vconfigset_egress_map命令将其映射到vlan优先级

关于c - 在C套接字上设置VLAN,在另一端接收它,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19254834/

10-13 03:33