1

Ethernet IILinux でフレームヘッダーを作成するには? 802.3 フレーム ヘッダーは、送信元と宛先の MAC と長さを指定しeth_header()て作成できます。長さの代わりにタイプフィールドを使用するフレームフォーマットにもskbuffer同じ関数を使用できますか?Ethernet II

4

2 に答える 2

1

(現在の) カーネル ソースは、問題のメソッドを次のように定義します。

int eth_header(struct sk_buff *skb, struct net_device *dev,
           unsigned short type,
           const void *daddr, const void *saddr, unsigned len);

だから私たちフィールドを持っていtypeます。ここまでは順調ですね。

typeの値が考慮されるかどうか、またどのように考慮されるか、メソッドの実装を見てみましょう。メソッドは次のように始まります。

{
    struct ethhdr *eth = ...

    if (type != ETH_P_802_3 && type != ETH_P_802_2)
            eth->h_proto = htons(type);
    else
            eth->h_proto = htons(len);
    ...

ご覧のとおり、802.2/3 以外のすべてのタイプで、type(関数に渡された) の値がフレーム ヘッダーの初期化に使用されます。これは、イーサネット II フレーム ヘッダーに必要なものです。

結論と質問への回答:はいeth_header()、イーサネット II フレーム ヘッダーの作成に使用できます。

于 2011-12-30T19:39:50.473 に答える
0

Cf. net/ipv6/netfilter/ip6t_REJECT.cおよびnet/ethernet/eth.c。:

nskb = skb_alloc(...);
...
struct ethhdr *eh = skb_push(nskb, sizeof(struct ethhdr));
eh->h_proto = htons(ETH_P_IPV6);

パケットに何を追加するかに応じて、割り当てられたバイト数やプッシュされたバイト数を変更できます。

于 2012-01-03T19:22:55.257 に答える