2011-12-30 2 views
1

Как создать Ethernet II заголовок кадра в Linux? Заголовок кадра 802.3 может быть создан с использованием eth_header(), давая skbuffer и MAC и длину источника и назначения. Можно ли использовать ту же функцию для формата кадра Ethernet II, где мы используем поле типа вместо длины?Создание заголовка кадра Ethernet II?

ответ

2

(текущем) исходников ядра определяют метод в вопросе следующим образом:

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 (переданной функции) используются для инициализации заголовка кадра, который является то, что мы хотим для заголовков фреймов Ethernet II.

Заключение и ответ на вопрос: Да, можно использовать eth_header() для создания заголовка кадра Ethernet II.

+0

Спасибо за ответ. Скажем, например, у меня есть поле типа 8100 (vlan tagging), поэтому, когда я вызываю эту функцию, я должен передать ETH_P_802_2 для ввода типа и 8100 в поле len. Правильно ли это? – user1023527

+0

@ user1023527: Actullay это может работать (при использовании источников в источниках), но я бы рекомендовал передать 'ETH_P_8021Q' (из'/usr/src/linux/include/linux/if_ether.h') через 'type' и ничего не пропускать (' 0') через 'len'. – alk

+0

@ user1023527: * «Маркировка VLAN *» - это 802.1Q ('ETH_P_8021Q') и' ETH_P_8021Q', в свою очередь, '# define'ed будет' 8100'. – alk

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

Вы можете изменить количество байтов, выделенных и/или толкания в зависимости от того, что вы хотите добавить в пакет.

Смежные вопросы