dev_getbyhwaddr(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’… dev_getbyhwaddr(9) πŸŽ€

okay bestie so this is a page out of the Kernel API Manual, section 9, and it's about one little function that goes hunting for a network device by its hardware address. short page, but it's giving "know exactly what you're doing or the lock will come for you" energy. let's go ✨


🌸 NAME 🌸

dev_getbyhwaddr β€” literally: find a device by its hardware address πŸ•΅οΈβ€β™€οΈ


✨ SYNOPSIS ✨

struct net_device * dev_getbyhwaddr (struct net *net , unsigned short
type , const char *ha );

that's the whole vibe, no cap. πŸ’…


πŸ¦‹ ARGUMENTS πŸ¦‹

  • net β€” the applicable net namespace. yes, the namespace, the one that actually applies. 🫢
  • type β€” media type of device.
  • ha β€” hardware address. the actual address you're searching for, bestie. πŸ‘€

πŸ’– DESCRIPTION πŸ’–

so it's similar to dev_getbyhwaddr_rcu, except β€” and this is the main character plot twist β€” the owner needs to hold rtnl_lock. that's it, that's the whole description. iconic brevity. πŸ”₯


πŸ”’ CONTEXT πŸ”’

rtnl_lock must be held.

like, MUST must. not "probably should", not "if you feel like it". held. periodt. πŸ’€

πŸŽ€ RETURN πŸŽ€

a pointer to the net_device, or NULL if it's not found. so like, either you get your device or you get nothing and you gotta deal with it. 😭


🌈 SEE ALSO 🌈

kernel file ./net/core/dev.c β€” go read it, iykyk 🧚

and here's the whole entourage, the full squad, nobody left out:

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), 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), 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)

like. that is a lot of friends. main character energy by association honestly. πŸ‘‘


ok tiny recap before you go: hold rtnl_lock, pass your net, your type, your ha, and get either a struct net_device * or a NULL. that's the whole thing. slay. πŸ’œ

source: ./net/core  Β·  version: October 2026 β€” mwah, that's a wrap bestie, go free your devices πŸ¦‹πŸ’–πŸŽ€

πŸ“¦ where this page comes from