亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 12434 | 回復: 12
打印 上一主題 下一主題

Linux bridge 對802.1q包的處理 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2011-07-17 18:42 |只看該作者 |倒序瀏覽
在一款switch設置如下:
vconfig add eth0 1
vconfig add eth0 2

brctl addbr br0

brctl addif br0 eth0.1
brctl addif br0 eth0.2

從eth0.1設備上來的數(shù)據包都是打上Tag的,那么在bridge中將包從eth0.1轉發(fā)到eth0.2時,包中的TAG是如何變化的呢?
從源代碼來看:
從eth0.1收到的帶TAG的數(shù)據包,經過br0之后,最后調用eth0.2的vlan_dev_hard_start_xmit()將包從eth0.2真正的物理設備即eth0發(fā)送出去。

vlan_dev_hard_start_xmit()中會根據FLAG來判斷是否將包打上自己的TAG即VLAN ID為2.
那么我有個疑問就是:
1. 從eth0.1上來的包經br0轉發(fā)到eth0.2時是否還帶了其自己的VLAN ID即1(進入vlan_dev_hard_start_xmit之前)
2. 如果eth0.2強制加上自己的VLAN TAG,那么是否從eth0.2上出來的數(shù)據包會生成兩層VLAN TAG(即VLAN TAG1和VLAN TAG2)

請大牛幫忙解惑一下?

論壇徽章:
7
丑牛
日期:2013-10-18 14:43:21技術圖書徽章
日期:2013-11-03 09:58:03辰龍
日期:2014-01-15 22:57:50午馬
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亞洲杯之伊朗
日期:2015-03-16 10:24:352015亞冠之城南
日期:2015-05-31 09:52:32
2 [報告]
發(fā)表于 2011-07-17 19:32 |只看該作者
1  不會。ETH0.1設備只負責2個功能,接收從EHT0設備上的帶TAG1的包,去TAG.從上層發(fā)送的包加TAG.加TAG去TAG的功能實際稱呼好象叫VLAN隧道. VLAN的詳細確切概念可以看 PERLMAN的 網絡互連 一書
2 橋只管按MAC地址,帶TAG的叫隧道包,他不能做分辨. 所以問題與橋沒關系,只是VLAN虛擬設備設計的問題.
代碼顯示,不會加而是直接透傳發(fā)送.


int vlan_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
        struct net_device_stats *stats = vlan_dev_get_stats(dev);
        struct vlan_ethhdr *veth = (struct vlan_ethhdr *)(skb->data);

        /* Handle non-VLAN frames if they are sent to us, for example by DHCP.
         *
         * NOTE: THIS ASSUMES DIX ETHERNET, SPECIFICALLY NOT SUPPORTING
         * OTHER THINGS LIKE FDDI/TokenRing/802.3 SNAPs...
         */

        if (veth->h_vlan_proto != __constant_htons(ETH_P_8021Q)) {
                int orig_headroom = skb_headroom(skb);
                unsigned short veth_TCI;

論壇徽章:
0
3 [報告]
發(fā)表于 2011-07-17 20:07 |只看該作者
1. 包是從eth0上收上來的,從驅動來看,這個包是帶TAG的,驅動收包后調用netif_receive_skb()將包交給協(xié)議棧,這是會調用handle_bridge()進入bridge的處理,所以說進入bridge之后包還是帶TAG的,具體不知道到何處會將TAG去掉?
2. vlan dev在初始化時,默認的flag為 VLAN_FLAG_REORDER_HDR,從代碼中可以看出,會打上TAG
static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb,
                                            struct net_device *dev)
{
        int i = skb_get_queue_mapping(skb);
        struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
        struct vlan_ethhdr *veth = (struct vlan_ethhdr *)(skb->data);
        unsigned int len;
        int ret;

        /* Handle non-VLAN frames if they are sent to us, for example by DHCP.
         *
         * NOTE: THIS ASSUMES DIX ETHERNET, SPECIFICALLY NOT SUPPORTING
         * OTHER THINGS LIKE FDDI/TokenRing/802.3 SNAPs...
         */
        if (veth->h_vlan_proto != htons(ETH_P_8021Q) ||
            vlan_dev_info(dev)->flags & VLAN_FLAG_REORDER_HDR) {
                unsigned int orig_headroom = skb_headroom(skb);
                u16 vlan_tci;

                vlan_dev_info(dev)->cnt_encap_on_xmit++;

                vlan_tci = vlan_dev_info(dev)->vlan_id;
                vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb);
                skb = __vlan_put_tag(skb, vlan_tci);
                if (!skb) {
                        txq->tx_dropped++;
                        return NETDEV_TX_OK;
                }

                if (orig_headroom < VLAN_HLEN)
                        vlan_dev_info(dev)->cnt_inc_headroom_on_tx++;
        }

論壇徽章:
0
4 [報告]
發(fā)表于 2011-07-26 01:51 |只看該作者
vlan_dev_hard_start_xmit()中會根據FLAG來判斷是否將包打上自己的TAG即VLAN ID為2.
那么我有個疑問就是:
1. 從eth0.1上來的包經br0轉發(fā)到eth0.2時是否還帶了其自己的VLAN ID即1(進入vlan_dev_hard_start_xmit之前)
2. 如果eth0.2強制加上自己的VLAN TAG,那么是否從eth0.2上出來的數(shù)據包會生成兩層VLAN TAG(即VLAN TAG1和VLAN TAG2)

請大牛幫忙解惑一下?



1,br0v轉發(fā)時沒有,但是,從eth0.2出去時會再次加上
2,只有一層vlan_Tag,因為eth0.1的包進網橋前會去掉vlan tag
在vlan_skb_recv這個函數(shù)里去除vlan

type = skb->protocol;
list_for_each_entry_rcu(ptype,
        &ptype_base[ntohs(type) & PTYPE_HASH_MASK], list) {
    if (ptype->type == type &&
        (ptype->dev == null_or_orig || ptype->dev == skb->dev ||
         ptype->dev == orig_dev)) {
        if (pt_prev)
            ret = deliver_skb(skb, pt_prev, orig_dev);
        pt_prev = ptype;
    }
中陷入vlan_skb_recv調用

論壇徽章:
0
5 [報告]
發(fā)表于 2011-09-18 18:35 |只看該作者
bridge模塊的處理在vlan之前,所以說根本不會進入到vlan_skb_dev這個函數(shù),所以其實在br處理時,skb中其實是帶TAG的。br在處理這個數(shù)據包時,會先將skb->data指針跳過vlan tag,而進行處理。

論壇徽章:
0
6 [報告]
發(fā)表于 2011-10-26 11:42 |只看該作者
幫頂!對于vlan包 先由bridge模塊處理后,怎么進入vlan_skb_dev 不清楚。如果是在bridge之前就把vlan tag去掉了的話,具體是在哪里去掉的呢?  vlan_skb_dev 是怎么被調用到的?

論壇徽章:
6
金牛座
日期:2013-10-08 10:19:10技術圖書徽章
日期:2013-10-14 16:24:09CU十二周年紀念徽章
日期:2013-10-24 15:41:34獅子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亞洲杯之阿聯(lián)酋
日期:2015-05-09 14:36:15
7 [報告]
發(fā)表于 2011-10-26 16:49 |只看該作者
本帖最后由 瀚海書香 于 2011-10-26 18:13 編輯

回復 6# d419192480
vlan函數(shù)的處理,跟其他協(xié)議是類似的,通過dev_add_pack將vlan的處理函數(shù)添加到ptype_base中。
在bridge下的vlan數(shù)據包的處理流程:(注意是到本地或者本地發(fā)出的數(shù)據包,轉發(fā)的數(shù)據包是不會進行tag處理的,只是進行簡單的指針加減后處理的。nf_bridge_pull_encap_header_rcsum)

netif_receive_skb--->bridge-->vlan-->netif_rx-->bridge

也就是說,vlan的數(shù)據包會兩次經過bridge。第一次為帶tag的vlan數(shù)據包,第二次為去掉tag的普通數(shù)據包。

論壇徽章:
0
8 [報告]
發(fā)表于 2011-10-26 17:15 |只看該作者
謝謝回復,可否細說一下
bridge--->vlan ? 這個過程 是在哪里發(fā)生的呢?
是在 br_handle_frame_finish 里面發(fā)生的嗎?
還是在 netif_receive_skb函數(shù)里面發(fā)生的?

根據你的回復,應該是在netif_receive_skb函數(shù)里面,bridge處理完成后發(fā)生的。但是bridge處理完成后不是直接goto out了嗎? bridge不是會直接轉發(fā)出去?

論壇徽章:
6
金牛座
日期:2013-10-08 10:19:10技術圖書徽章
日期:2013-10-14 16:24:09CU十二周年紀念徽章
日期:2013-10-24 15:41:34獅子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亞洲杯之阿聯(lián)酋
日期:2015-05-09 14:36:15
9 [報告]
發(fā)表于 2011-10-26 18:09 |只看該作者
回復 8# d419192480
bridge對于轉發(fā)的VLAN數(shù)據包是不做tag處理的。
對于到本地的數(shù)據包和從本地發(fā)出的數(shù)據包才會做tag的處理,需要虛擬設備的支持。
很久之前看的代碼了,大體上記得是這樣的流程?创a的時候需要注意:只有到本地或者本地發(fā)出的數(shù)據包才會處理tag,并且是需要虛擬設備支持的。

論壇徽章:
0
10 [報告]
發(fā)表于 2011-12-22 18:51 |只看該作者
這里面東西貌似都沒有討論清楚,樓主你郵箱是多少?有空探討一下?

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP