Создание заголовка кадра Ethernet II? - PullRequest
1 голос
/ 30 декабря 2011

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

Ответы [ 2 ]

2 голосов
/ 30 декабря 2011

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

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

Таким образом, у нас do есть поле 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 голосов
/ 03 января 2012

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

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

...