Создал соединение между user space и kernel space через netlink socket. В программе формирую raw-пакет и шлю его через netlink socket в модуль. В модуле принимаю его как sk_buff. Ядро при этом виснет намертво, а логи просто обрываются. Как все таки правильно отправить буффер в netif_rx?
Сам код:
static void nl_recv_msg(struct sk_buff *skb) {
char *msg = skb->data + 16;
int msg_size = skb->len - 16 - 3;
struct sk_buff *skb_out;
skb_out = dev_alloc_skb(msg_size);
if (skb_out) {
skb_put(skb_out, msg_size);
memcpy(skb_out->data, msg, msg_size);
skb_out->dev = dev;
skb_out->protocol = 0x0019; /* ETH_P_80211_RAW */
skb_out->ip_summed = CHECKSUM_UNNECESSARY;
netif_rx(skb_out);
} else {
pr_err("Allocation failure.\n");
}
}
Функция «nl_recv_msg» используется тут:
static int __init my_init( void ) {
struct netlink_kernel_cfg cfg = {
.input = nl_recv_msg,
};
......................................................
nl_sk = netlink_kernel_create(&init_net, MYPROTO, &cfg);
......................................................
}