kit_D, ваши примеры все писались на основе вот этого старого примера: http://ar.linux.it/docs/vinter/insane.tar.gz, или даже, если точнее, более поздней реализации: http://netlab-mn.unipv.it/insane/insane_2.6.31.tar.gzkit_D писал(а):Note: тут еще проблемка. netdev_rx_handler_register() относительно новый хук и появился он в 2.6.36, а мне надо чтобы модуль был также совместим с 2.6.35. Наверняка там есть какой-то аналог этой функции - надо копать
Я сейчас как-раз стал с ними разбираться. Так вот, они написаны ещё для ядер 2.4 и 2.6.31 соответственно.
И, как я понял, используется в нашей любимой struct net_device поле dev->header_ops (которое в "спокойном" состоянии, подозреваю NULL), на которое вешается структура (операций):
Код: Выделить всё
/* --------------------------------------------------------------------------
* create default header_ops struct
*/
static const struct header_ops insane_header_ops = {
.create = insane_create_header,
.rebuild = insane_rebuild_header,
.cache = NULL, /* disable caching */
};
И сами операции, чтоб было понятно о чём речь:
Код: Выделить всё
/* --------------------------------------------------------------------------
* header stuff: fall back on the slave interface to deal with this stuff
*/
static int insane_create_header(struct sk_buff *skb, struct net_device *dev,
unsigned short type, const void *daddr, const void *saddr, unsigned len)
{
struct insane_private *priv = netdev_priv(insane_dev);
int retval;
skb->dev = priv->priv_device;
retval = skb->dev->header_ops->create(skb, skb->dev, type,
daddr, saddr, len);
skb->dev = dev;
return retval;
}
static int insane_rebuild_header(struct sk_buff *skb)
{
struct insane_private *priv = netdev_priv(insane_dev);
int retval;
skb->dev = priv->priv_device;
retval = skb->dev->header_ops->rebuild(skb);
skb->dev = insane_dev;
return retval;
}
Нужно только разобраться в его деталях.