1. Мне так кажется, что модуль (драйвер) xxx реализующий виртуальный интерфейс yyy должен был бы а). получать параметром загрузки модуля имя родительского интерфейса (zzz), на который он должен подсесть и б). должен делать это подсаживание именно в инициализирующей части модуля.kit_D писал(а):Выкладываю новую версия кода.
Слегка изменилась архитектура. После загрузки модуля появляется новое устройство crypto, но оно пока не ассоциировано с реальным(подчиненным, slave) устройством. Для того чтобы сделать такую ассоциацию надо вызвать команду:
./crypto_us wlan0
Она назначает устройству crypto подчиненное устройство wlan0. Вероятно это будет работать если подчиненное устройство eth<N> - не знаю, не проверял.
2. Если же даже, в силу каких-то ТЗ условий, этот параметр нужно устанавливать позже, runtime, то я уж точно не делал бы это ioctl(): а). из-за безконтролькости ioctl(), а значит его опасности, б). это старый, отживающий механизм, в) если это так сильно надо, то сделать это чтением-записью через /proc или /sys: viewtopic.php?f=18&t=1617
3. После чего активизировать (подымать) новый интерфейс с IP в отдельной подсети... чтобы потоки данных yyy & zzz могли динамически различаться. И не исключено, что и MAC этому интерфейсу присвоить совершенно фиктивный.
4. Мне так кажется, что не нужно весь поток zzz (родителя) подменять потоком yyy.
5. На приёме это функция (в примере):
Код: Выделить всё
rx_handler_result_t handle_frame( struct sk_buff **pskb ) {
...
http://lxr.free-electrons.com/source/in ... ce.h?v=3.0
Код: Выделить всё
393 /*
394 * enum rx_handler_result - Possible return values for rx_handlers.
395 * @RX_HANDLER_CONSUMED: skb was consumed by rx_handler, do not process it
396 * further.
397 * @RX_HANDLER_ANOTHER: Do another round in receive path. This is indicated in
398 * case skb->dev was changed by rx_handler.
399 * @RX_HANDLER_EXACT: Force exact delivery, no wildcard.
400 * @RX_HANDLER_PASS: Do nothing, passe the skb as if no rx_handler was called.
401 *
402 * rx_handlers are functions called from inside __netif_receive_skb(), to do
403 * special processing of the skb, prior to delivery to protocol handlers.
404 *
405 * Currently, a net_device can only have a single rx_handler registered. Trying
406 * to register a second rx_handler will return -EBUSY.
407 *
408 * To register a rx_handler on a net_device, use netdev_rx_handler_register().
409 * To unregister a rx_handler on a net_device, use
410 * netdev_rx_handler_unregister().
411 *
412 * Upon return, rx_handler is expected to tell __netif_receive_skb() what to
413 * do with the skb.
414 *
415 * If the rx_handler consumed to skb in some way, it should return
416 * RX_HANDLER_CONSUMED. This is appropriate when the rx_handler arranged for
417 * the skb to be delivered in some other ways.
418 *
419 * If the rx_handler changed skb->dev, to divert the skb to another
420 * net_device, it should return RX_HANDLER_ANOTHER. The rx_handler for the
421 * new device will be called if it exists.
422 *
423 * If the rx_handler consider the skb should be ignored, it should return
424 * RX_HANDLER_EXACT. The skb will only be delivered to protocol handlers that
425 * are registred on exact device (ptype->dev == skb->dev).
426 *
427 * If the rx_handler didn't changed skb->dev, but want the skb to be normally
428 * delivered, it should return RX_HANDLER_PASS.
429 *
430 * A device without a registered rx_handler will behave as if rx_handler
431 * returned RX_HANDLER_PASS.
432 */
433
434 enum rx_handler_result {
435 RX_HANDLER_CONSUMED,
436 RX_HANDLER_ANOTHER,
437 RX_HANDLER_EXACT,
438 RX_HANDLER_PASS,
439 };
440 typedef enum rx_handler_result rx_handler_result_t;
441 typedef rx_handler_result_t rx_handler_func_t(struct sk_buff **pskb);
5. И то же самое на передаче, когда перенаправляются пакеты в zzz, в:
Код: Выделить всё
netdev_tx_t crypto_xmit( struct sk_buff *skb, struct net_device *dev ) {
P.S. я там, кстати, совсем не понял там:
Код: Выделить всё
skb->priority = 1;
6. Конечно, сначала это всё лучше отыгрывать на проводном eth0 или виртуальном p2p1. И только потом wlan0.
7. А чем вы смотрите "работает - не работает"?
Чтоб не строить здесь соображения на догадках.
Я так понимаю, что это нужно на физический интерфейс вешать tcpdump, и хоть это громоздко и противно - подбирать его фильтры и наблюдать выборочно свои потоки.
Вот это всё хочется попробовать.