2013-10-08 42 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