LINUX.ORG.RU

Отваливается netif_rx при передаче sk_buff от netlink socket.

 , , ,


1

2

Создал соединение между 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);

        ......................................................

}


netif_rx() обычно используется в контексте обработчика прерывания.

Непонятно какой велосипед ты изобретаешь. Хочешь имитировать прием wifi-пакета?

Ядро при этом виснет намертво, а логи просто обрываются.

Ну так включи sys.kernel.panic, sys.kernel.panic_on_oops, sys.kernel.panic_on_io_nmi, sys.kernel.panic_on_unrecovered_nmi и настрой ramoops или kexec.

Как минимум консоль в текстовый режим переведи.

vel ★★★★★
()

А dev для skb_out->dev = dev у тебя откуда родился?

Короче, смотри как сделано в drivers/net/tun.c.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.