2013-10-08 37 views
0

我想设置一个C套接字,以便我可以为将通过它发送的UDP数据包添加802.1Q优先级标记。这是我在做什么:在C套接字上设置VLAN,在另一端接收它

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,我可以看到它很好,但是我看不到任何对Wireshark有影响的SO_PRIORITY指示。

+0

802.1Q标签不具有任何与UDP设置确认。这些标签适用于_some_第二层LAN协议,例如以太网,但UDP是第4层协议,并且它对第2层非常幸福。另外,除非您的以太网交换机配置为使用标签并且在接口上配置了中继,否则优先级没有任何意义,并且它们在第3层(例如路由器)上被剥离。 –

回答

2

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

一个,你可以使用这个内部优先做的事情是将其与vconfigset_egress_map命令

+0

谢谢。那么我有权利使用SO_BINDTODEVICE吗?这是否意味着vlan标签“10”(按照我的示例)将被添加到以太网帧中? –

+0

我猜不。您需要在vlan接口上配置IP地址/子网掩码,如果您将流量发送到该子网上的某些内容,则linux会将其路由出vlan接口(使用vlan标记)。如果你发送的东西不在vlan接口的子网中,你需要设置路由表,使数据包通过你的vlan接口路由(而不是其他地方,例如另一个接口上的默认网关) – nos

0

你可以通过SIOCSIFVLAN设置优先级映射到一个VLAN优先级。

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); 

然后可以,如果出口优先权是通过检查 猫/proc/net/vlan/eth0.10