здравствуйте!
пожаловал сюда, т.к. сам немного запутался и неосилил...
кто работал с сетью на уровне skbuff в ядре: подскажите, пожалуйста, как правильно отправлять пакет в loopback-интерфейсе.
есть код, хорошо работающий на девайсах eth, схематично:
skb = dev_alloc_skb(ip_sz + sizeof(struct tcphdr) + len);
... тут размечаем заголовки пакета, заполняем их поля
... (skb_reserve, skb_push, skb_put, skb_set_network_header
skb->dev = ... назначаем интерфейс
... считаем контрольную сумму (skb->csum, csum_partial,
... csum_tcpudp_magic/csum_ipv6_magic, ip_fast_csum)
skb->pkt_type = PACKET_OUTGOING; // пакет - на выход
res = dev_queue_xmit(skb); // посылаем в xmit
если посылаем в loopback (в ethhdr-заголовке: нулевые mac-адреса), wireshark не видит пакета, пока в h_dest eth-заголовка не поставить broadcast (FF:FF:FF:FF:FF:FF). теперь пакет видно в wireshark, но в сокет к адресату он все равно не попадает.
найденые решения:
- заполнять dst-entry (skb_dst_set() - заполняли с уже отловленого пакета), что безуспешно (даже иногда валит систему)
- использовать netif_rx_ni() для прямой доставки в стек:
что тоже безрезультатно
skb_reset_mac_header(skb); __skb_pull(skb, skb_network_offset(skb)); skb->pkt_type = PACKET_LOOPBACK; skb->ip_summed = CHECKSUM_UNNECESSARY; skb_dst_set(skb, dst); skb_dst_force(skb); netif_rx_ni(skb);
хорошо-бы кусочек кода с места отсылки, аналог
skb->pkt_type = PACKET_OUTGOING;
res = dev_queue_xmit(skb);
С ув., Тарас