netif_rx(9)
π netif_rx π
okay so this is a page from the Kernel API Manual, bestie β and it's about netif_rx, which is literally the "hey network stack, i have a packet for u" function. β¨
πΈ SYNOPSIS πΈ
int netif_rx (struct sk_buff *skb );
(no cap, the spacing in there is exactly how the page has it, we do not touch it π )
π ARGUMENTS π
skbβ the buffer you're posting. that's it, that's the whole argument. one (1) buffer, hand it over π«Ά
π¦ DESCRIPTION π¦
so. what does this actually do. π
netif_rx receives a packet from a device driver and queues it up for the upper (protocol) levels to process, and it does this via the backlog NAPI device. that's the whole main character move of this function π
the big slay here: it always succeeds. like, it literally cannot fail, it's giving unbothered icon energy. β¨
but β and this is the part where u need to listen, bestie β the buffer may be dropped during processing, either for congestion control or by the protocol layers themselves. so "always succeeds" β "packet always makes it", iykyk. π
the network buffer is passed via the backlog NAPI device. π¦
lowkey important: a modern NIC driver should use NAPI and GRO instead. netif_rx is the old reliable, not the glow-up. ngl, if you're writing fresh driver code, look at NAPI + GRO first. π§
this function can be used from interrupt context and from process context. π
π¨ but a caller in process context must not disable interrupts before invoking this function. fr fr, don't do it. that's a whole vibe violation and the page is very clear about it. π
β return values β
NET_RX_SUCCESSβ no congestion πNET_RX_DROPβ the packet was dropped π
π SEE ALSO π
kernel file ./net/core/dev.c, plus the whole extended universe of friends:
dev_add_pack(9), __dev_remove_pack(9), dev_remove_pack(9), dev_get_iflink(9), dev_fill_metadata_dst(9), netdev_napi_by_id_lock(9), __dev_get_by_name(9), dev_get_by_name_rcu(9), netdev_get_by_name(9), __dev_get_by_index(9), dev_get_by_index_rcu(9), netdev_get_by_index(9), dev_get_by_napi_id(9), netdev_get_by_index_lock(9), netdev_get_name(9), dev_getbyhwaddr_rcu(9), dev_getbyhwaddr(9), netdev_get_by_flags_rcu(9), dev_valid_name(9),
__dev_alloc_name(9), dev_alloc_name(9), dev_get_alias(9), netdev_features_change(9), __netdev_notify_peers(9), netdev_notify_peers(9), dev_disable_gro_hw(9), register_netdevice_notifier(9), unregister_netdevice_notifier(9), register_netdevice_notifier_net(9), unregister_netdevice_notifier_net(9), call_netdevice_notifiers_info(9), call_netdevice_notifiers_info_robust(9), call_netdevice_notifiers(9), call_netdevice_notifiers_mtu(9), dev_forward_skb(9),
dev_nit_active_rcu(9), netif_setup_tc(9), netif_set_real_num_rx_queues(9), netif_set_real_num_queues(9), netif_set_tso_max_size(9), netif_set_tso_max_segs(9), netif_inherit_tso_max(9), netif_get_num_default_rss_queues(9), netif_device_detach(9), netif_device_attach(9), dev_loopback_xmit(9), __dev_queue_xmit(9), rps_flow_is_active(9), rps_may_expire_flow(9), __netif_rx(9),
netdev_is_rx_handler_busy(9), netdev_rx_handler_register(9), netdev_rx_handler_unregister(9), netif_receive_skb_core(9), netif_receive_skb(9), netif_receive_skb_list(9), __napi_schedule(9), napi_schedule_prep(9), __napi_schedule_irqoff(9), netif_threaded_enable(9), netif_queue_set_napi(9), napi_disable(9), napi_enable(9),
netdev_has_upper_dev(9), netdev_has_upper_dev_all_rcu(9), netdev_has_any_upper_dev(9), netdev_master_upper_dev_get(9), netdev_has_any_lower_dev(9), netdev_upper_get_next_dev_rcu(9), netdev_lower_get_next_private(9), netdev_lower_get_next_private_rcu(9), netdev_lower_get_next(9), netdev_lower_get_first_private_rcu(9), netdev_master_upper_dev_get_rcu(9), netdev_upper_dev_link(9), netdev_master_upper_dev_link(9), netdev_upper_dev_unlink(9), netdev_bonding_info_change(9), netdev_get_xmit_slave(9), netdev_sk_get_lowest_dev(9), netdev_lower_state_changed(9),
netif_get_flags(9), netif_set_mtu_ext(9), netif_pre_changeaddr_notify(9), dev_get_phys_port_id(9), dev_get_phys_port_name(9), netif_get_port_parent_id(9), netdev_port_same_parent_id(9), netdev_change_proto_down_reason_locked(9), dev_change_xdp_fd(9), dev_index_reserve(9), netdev_update_features(9), netdev_change_features(9), netif_stacked_transfer_operstate(9),
register_netdevice(9), register_netdev(9), netdev_wait_allrefs_any(9), dev_get_stats(9), dev_fetch_sw_netstats(9), dev_get_tstats64(9), netdev_sw_irq_coalesce_default_on(9), alloc_netdev_mqs(9), free_netdev(9), alloc_netdev_dummy(9), synchronize_net(9), unregister_netdevice_queue(9), unregister_netdevice_many(9), unregister_netdev(9), netdev_increment_features(9), netdev_compute_master_upper_features(9), netdev_drivername(9)
and that's the whole page, bestie π«Ά go forth and queue ur buffers responsibly β¨π
π§ cute little sign-off: this one lives in the source directory./net/core, dated October 2026, and it's pagenetif_rx(9). mwah π π
π¦ where this page comes from
- nixpkgs unstable: linux-manual 7.3.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms