Приветствую,
есть код драйвера ethernet свитча, который необходимо сопровождать (комментариев и документации нет, ниже русские комментарии мои). Там есть следующий фрагмент в bottom-half обработчика прерываний, который мне не до конца понятен:
struct sk_buff *skb;
/* pktbuf это указатель на собственную структуру, описывающую
хранимый в буферной памяти свитча пришедший фрейм */
struct pkt_buffer *pktbuf;
/* здесь берем пакет посредством DMA */
pktbuf = dmaGetPacket(...);
while (pktbuf) {
pkt_type = classifyPacket(pktbuf);
skb = dev_alloc_skb(pkt_len + 2);
skb_reserve(skb, 2); /* align IP in 16 byte */
memcpy(skb_put(skb, pkt_len), pktbuf->eth[2], pkt_len);
/* т.е. теперь skb содержит принятый фрейм:
ethernet заголовок + поле тип пакета + payload */
switch (pkt_type) {
case (DHCP): pktProcess_dhcp(skb, ...); break;
case (IGMP): pktProcess_igmp(skb, ...); break;
/* pktProcess_*() определяют на какие порты форвардить фреймы и вообще что с ними делать */
...
default:
skb->protocol = eth_type_trans(skb, netdev);
netif_rx(SKB);
netdev->last_rx = jiffies;
}
...
pktbuf = dmaGetNext(...);
}
Все выглядит стройно, кроме того, что в ряде некоторых случаев, в зависимости от типа пакета, создается копия skb и уже эта копия передается в pktProcess_*(). Непонятно — с какой целью это делается, ведь выше по стеку, как я понимаю, отловленные пакеты не уходят (кроме тех, что попадают в ветку default).