0

同じネットワーク上でいくつかのマシンを実行しています。1つのノードは、そこに到達するトラフィックを他のノードに分散する制御ノードです。重要なのは、MACヘッダーとIP(またはその他の)ペイロードの間にカスタムプロトコルヘッダーを制御ノードに着信させたいということです。

制御ノードは、次のようなパケットを受信します。

------------------------------------------------
| Layer 2 | IP(or whatever protocol) | Payload |
------------------------------------------------

このパケットは、このように他のノードに配布する必要があります

----------------------------------------------------------------
| Layer 2 | Custom Header | IP(or whatever protocol) | Payload |
----------------------------------------------------------------

私はそのようなことをするためのいくつかの指示が欲しいです、私が使用できる現在の解決策はありますか、そして私はそれのためにカーネルを最初からハックする必要があります。同様のアプローチはL2TPを使用することですが、それはIP層上で実行されるため、私はそれを望んでいません。

また、この通信を、物理的なeth0インターフェースとは別に、tun0のようなLinuxの別個のインターフェースとして表示したいと思います。

どんな助けやアイデアも大歓迎です。

この質問がどのスタック交換ウェブサイトに属しているのかわからないので、ウェブサイトを修正するための指示もありがたいです。

4

1 に答える 1

2

あなたのケースはVLANに非常に似ており、VLANヘッダーもL2ヘッダーとIPヘッダーの間にあります。VLANコード、特にnet / 8021q/vlan_dev.cを確認できます。

ここで重要なのは、独自のL2ヘッダーを作成する必要があるため、VLANのように独自のheader_opsを登録する必要があることです。

static const struct header_ops vlan_header_ops = {
        .create  = vlan_dev_hard_header,
        .rebuild = vlan_dev_rebuild_header,
        .parse   = eth_header_parse,
};

初期化中に登録します。

dev->header_ops      = &vlan_header_ops;
dev->hard_header_len = real_dev->hard_header_len + VLAN_HLEN;

ここでの->create()関数ポインタは、カスタムヘッダーを作成するために使用されます。

static int vlan_dev_hard_header(struct sk_buff *skb, struct net_device *dev,
                unsigned short type,
                const void *daddr, const void *saddr,
                unsigned int len)
{
    struct vlan_hdr *vhdr;
    unsigned int vhdrlen = 0;
    u16 vlan_tci = 0;
    int rc;

    if (!(vlan_dev_priv(dev)->flags & VLAN_FLAG_REORDER_HDR)) {
        vhdr = (struct vlan_hdr *) skb_push(skb, VLAN_HLEN);

        vlan_tci = vlan_dev_priv(dev)->vlan_id;
        vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb);
        vhdr->h_vlan_TCI = htons(vlan_tci);

        /*
         *  Set the protocol type. For a packet of type ETH_P_802_3/2 we
         *  put the length in here instead.
         */
        if (type != ETH_P_802_3 && type != ETH_P_802_2)
            vhdr->h_vlan_encapsulated_proto = htons(type);
        else
            vhdr->h_vlan_encapsulated_proto = htons(len);

        skb->protocol = htons(ETH_P_8021Q);
        type = ETH_P_8021Q;
        vhdrlen = VLAN_HLEN;
    }

    /* Before delegating work to the lower layer, enter our MAC-address */
    if (saddr == NULL)
        saddr = dev->dev_addr;

    /* Now make the underlying real hard header */
    dev = vlan_dev_priv(dev)->real_dev;
    rc = dev_hard_header(skb, dev, type, daddr, saddr, len + vhdrlen);
    if (rc > 0)
        rc += vhdrlen;
    return rc;
}
于 2012-12-09T15:21:32.370 に答える