Lines Matching full:link
8 * @defgroup link Links (Interfaces)
11 * @route_doc{route_link, Link Documentation}
23 #include <netlink/route/link.h>
24 #include <netlink-private/route/link/api.h>
25 #include <netlink-private/route/link/sriov.h>
77 cache = __nl_cache_mngt_require("route/link"); in link_lookup()
85 static struct rtnl_link_af_ops *af_lookup_and_alloc(struct rtnl_link *link, in af_lookup_and_alloc() argument
94 if (!rtnl_link_af_alloc(link, af_ops)) { in af_lookup_and_alloc()
102 static int af_free(struct rtnl_link *link, struct rtnl_link_af_ops *ops, in af_free() argument
106 ops->ao_free(link, data); in af_free()
124 static int af_clone(struct rtnl_link *link, struct rtnl_link_af_ops *ops, in af_clone() argument
136 static int af_fill(struct rtnl_link *link, struct rtnl_link_af_ops *ops, in af_fill() argument
150 if ((err = ops->ao_fill_af(link, arg, data)) < 0) in af_fill()
159 static int af_fill_pi(struct rtnl_link *link, struct rtnl_link_af_ops *ops, in af_fill_pi() argument
175 if ((err = ops->ao_fill_pi(link, arg, data)) < 0) in af_fill_pi()
183 static int af_dump_line(struct rtnl_link *link, struct rtnl_link_af_ops *ops, in af_dump_line() argument
189 ops->ao_dump[NL_DUMP_LINE](link, p, data); in af_dump_line()
194 static int af_dump_details(struct rtnl_link *link, struct rtnl_link_af_ops *ops, in af_dump_details() argument
200 ops->ao_dump[NL_DUMP_DETAILS](link, p, data); in af_dump_details()
205 static int af_dump_stats(struct rtnl_link *link, struct rtnl_link_af_ops *ops, in af_dump_stats() argument
211 ops->ao_dump[NL_DUMP_STATS](link, p, data); in af_dump_stats()
216 static int do_foreach_af(struct rtnl_link *link, in do_foreach_af() argument
224 if (link->l_af_data[i]) { in do_foreach_af()
230 err = cb(link, ops, link->l_af_data[i], arg); in do_foreach_af()
239 static void release_link_info(struct rtnl_link *link) in release_link_info() argument
241 struct rtnl_link_info_ops *io = link->l_info_ops; in release_link_info()
245 io->io_free(link); in release_link_info()
248 BUG_ON(link->l_info); in release_link_info()
251 link->l_info_ops = NULL; in release_link_info()
257 struct rtnl_link *link = nl_object_priv(c); in link_free_data() local
259 if (link) { in link_free_data()
260 release_link_info(link); in link_free_data()
263 rtnl_link_af_ops_put(link->l_af_ops); in link_free_data()
265 nl_addr_put(link->l_addr); in link_free_data()
266 nl_addr_put(link->l_bcast); in link_free_data()
268 free(link->l_ifalias); in link_free_data()
269 free(link->l_info_kind); in link_free_data()
270 free(link->l_info_slave_kind); in link_free_data()
272 do_foreach_af(link, af_free, NULL); in link_free_data()
274 nl_data_free(link->l_phys_port_id); in link_free_data()
275 nl_data_free(link->l_phys_switch_id); in link_free_data()
277 if (link->ce_mask & LINK_ATTR_VF_LIST) in link_free_data()
278 rtnl_link_sriov_free_data(link); in link_free_data()
395 int rtnl_link_info_parse(struct rtnl_link *link, struct nlattr **tb) in rtnl_link_info_parse() argument
400 nla_strlcpy(link->l_name, tb[IFLA_IFNAME], IFNAMSIZ); in rtnl_link_info_parse()
401 link->ce_mask |= LINK_ATTR_IFNAME; in rtnl_link_info_parse()
406 link->l_stats[RTNL_LINK_RX_PACKETS] = st->rx_packets; in rtnl_link_info_parse()
407 link->l_stats[RTNL_LINK_TX_PACKETS] = st->tx_packets; in rtnl_link_info_parse()
408 link->l_stats[RTNL_LINK_RX_BYTES] = st->rx_bytes; in rtnl_link_info_parse()
409 link->l_stats[RTNL_LINK_TX_BYTES] = st->tx_bytes; in rtnl_link_info_parse()
410 link->l_stats[RTNL_LINK_RX_ERRORS] = st->rx_errors; in rtnl_link_info_parse()
411 link->l_stats[RTNL_LINK_TX_ERRORS] = st->tx_errors; in rtnl_link_info_parse()
412 link->l_stats[RTNL_LINK_RX_DROPPED] = st->rx_dropped; in rtnl_link_info_parse()
413 link->l_stats[RTNL_LINK_TX_DROPPED] = st->tx_dropped; in rtnl_link_info_parse()
414 link->l_stats[RTNL_LINK_MULTICAST] = st->multicast; in rtnl_link_info_parse()
415 link->l_stats[RTNL_LINK_COLLISIONS] = st->collisions; in rtnl_link_info_parse()
417 link->l_stats[RTNL_LINK_RX_LEN_ERR] = st->rx_length_errors; in rtnl_link_info_parse()
418 link->l_stats[RTNL_LINK_RX_OVER_ERR] = st->rx_over_errors; in rtnl_link_info_parse()
419 link->l_stats[RTNL_LINK_RX_CRC_ERR] = st->rx_crc_errors; in rtnl_link_info_parse()
420 link->l_stats[RTNL_LINK_RX_FRAME_ERR] = st->rx_frame_errors; in rtnl_link_info_parse()
421 link->l_stats[RTNL_LINK_RX_FIFO_ERR] = st->rx_fifo_errors; in rtnl_link_info_parse()
422 link->l_stats[RTNL_LINK_RX_MISSED_ERR] = st->rx_missed_errors; in rtnl_link_info_parse()
424 link->l_stats[RTNL_LINK_TX_ABORT_ERR] = st->tx_aborted_errors; in rtnl_link_info_parse()
425 link->l_stats[RTNL_LINK_TX_CARRIER_ERR] = st->tx_carrier_errors; in rtnl_link_info_parse()
426 link->l_stats[RTNL_LINK_TX_FIFO_ERR] = st->tx_fifo_errors; in rtnl_link_info_parse()
427 link->l_stats[RTNL_LINK_TX_HBEAT_ERR] = st->tx_heartbeat_errors; in rtnl_link_info_parse()
428 link->l_stats[RTNL_LINK_TX_WIN_ERR] = st->tx_window_errors; in rtnl_link_info_parse()
430 link->l_stats[RTNL_LINK_RX_COMPRESSED] = st->rx_compressed; in rtnl_link_info_parse()
431 link->l_stats[RTNL_LINK_TX_COMPRESSED] = st->tx_compressed; in rtnl_link_info_parse()
437 link->l_stats[RTNL_LINK_RX_NOHANDLER] = st->rx_nohandler; in rtnl_link_info_parse()
439 link->l_stats[RTNL_LINK_RX_NOHANDLER] = 0; in rtnl_link_info_parse()
441 link->ce_mask |= LINK_ATTR_STATS; in rtnl_link_info_parse()
456 link->l_stats[RTNL_LINK_RX_PACKETS] = st.rx_packets; in rtnl_link_info_parse()
457 link->l_stats[RTNL_LINK_TX_PACKETS] = st.tx_packets; in rtnl_link_info_parse()
458 link->l_stats[RTNL_LINK_RX_BYTES] = st.rx_bytes; in rtnl_link_info_parse()
459 link->l_stats[RTNL_LINK_TX_BYTES] = st.tx_bytes; in rtnl_link_info_parse()
460 link->l_stats[RTNL_LINK_RX_ERRORS] = st.rx_errors; in rtnl_link_info_parse()
461 link->l_stats[RTNL_LINK_TX_ERRORS] = st.tx_errors; in rtnl_link_info_parse()
462 link->l_stats[RTNL_LINK_RX_DROPPED] = st.rx_dropped; in rtnl_link_info_parse()
463 link->l_stats[RTNL_LINK_TX_DROPPED] = st.tx_dropped; in rtnl_link_info_parse()
464 link->l_stats[RTNL_LINK_MULTICAST] = st.multicast; in rtnl_link_info_parse()
465 link->l_stats[RTNL_LINK_COLLISIONS] = st.collisions; in rtnl_link_info_parse()
467 link->l_stats[RTNL_LINK_RX_LEN_ERR] = st.rx_length_errors; in rtnl_link_info_parse()
468 link->l_stats[RTNL_LINK_RX_OVER_ERR] = st.rx_over_errors; in rtnl_link_info_parse()
469 link->l_stats[RTNL_LINK_RX_CRC_ERR] = st.rx_crc_errors; in rtnl_link_info_parse()
470 link->l_stats[RTNL_LINK_RX_FRAME_ERR] = st.rx_frame_errors; in rtnl_link_info_parse()
471 link->l_stats[RTNL_LINK_RX_FIFO_ERR] = st.rx_fifo_errors; in rtnl_link_info_parse()
472 link->l_stats[RTNL_LINK_RX_MISSED_ERR] = st.rx_missed_errors; in rtnl_link_info_parse()
474 link->l_stats[RTNL_LINK_TX_ABORT_ERR] = st.tx_aborted_errors; in rtnl_link_info_parse()
475 link->l_stats[RTNL_LINK_TX_CARRIER_ERR] = st.tx_carrier_errors; in rtnl_link_info_parse()
476 link->l_stats[RTNL_LINK_TX_FIFO_ERR] = st.tx_fifo_errors; in rtnl_link_info_parse()
477 link->l_stats[RTNL_LINK_TX_HBEAT_ERR] = st.tx_heartbeat_errors; in rtnl_link_info_parse()
478 link->l_stats[RTNL_LINK_TX_WIN_ERR] = st.tx_window_errors; in rtnl_link_info_parse()
480 link->l_stats[RTNL_LINK_RX_COMPRESSED] = st.rx_compressed; in rtnl_link_info_parse()
481 link->l_stats[RTNL_LINK_TX_COMPRESSED] = st.tx_compressed; in rtnl_link_info_parse()
486 link->l_stats[RTNL_LINK_RX_NOHANDLER] = st.rx_nohandler; in rtnl_link_info_parse()
488 link->ce_mask |= LINK_ATTR_STATS; in rtnl_link_info_parse()
492 link->l_txqlen = nla_get_u32(tb[IFLA_TXQLEN]); in rtnl_link_info_parse()
493 link->ce_mask |= LINK_ATTR_TXQLEN; in rtnl_link_info_parse()
497 link->l_mtu = nla_get_u32(tb[IFLA_MTU]); in rtnl_link_info_parse()
498 link->ce_mask |= LINK_ATTR_MTU; in rtnl_link_info_parse()
502 link->l_addr = nl_addr_alloc_attr(tb[IFLA_ADDRESS], AF_UNSPEC); in rtnl_link_info_parse()
503 if (link->l_addr == NULL) in rtnl_link_info_parse()
505 nl_addr_set_family(link->l_addr, in rtnl_link_info_parse()
506 nl_addr_guess_family(link->l_addr)); in rtnl_link_info_parse()
507 link->ce_mask |= LINK_ATTR_ADDR; in rtnl_link_info_parse()
511 link->l_bcast = nl_addr_alloc_attr(tb[IFLA_BROADCAST], in rtnl_link_info_parse()
513 if (link->l_bcast == NULL) in rtnl_link_info_parse()
515 nl_addr_set_family(link->l_bcast, in rtnl_link_info_parse()
516 nl_addr_guess_family(link->l_bcast)); in rtnl_link_info_parse()
517 link->ce_mask |= LINK_ATTR_BRD; in rtnl_link_info_parse()
521 link->l_link = nla_get_u32(tb[IFLA_LINK]); in rtnl_link_info_parse()
522 link->ce_mask |= LINK_ATTR_LINK; in rtnl_link_info_parse()
526 link->l_link_netnsid = nla_get_s32(tb[IFLA_LINK_NETNSID]); in rtnl_link_info_parse()
527 link->ce_mask |= LINK_ATTR_LINK_NETNSID; in rtnl_link_info_parse()
531 link->l_weight = nla_get_u32(tb[IFLA_WEIGHT]); in rtnl_link_info_parse()
532 link->ce_mask |= LINK_ATTR_WEIGHT; in rtnl_link_info_parse()
536 nla_strlcpy(link->l_qdisc, tb[IFLA_QDISC], IFQDISCSIZ); in rtnl_link_info_parse()
537 link->ce_mask |= LINK_ATTR_QDISC; in rtnl_link_info_parse()
541 nla_memcpy(&link->l_map, tb[IFLA_MAP], in rtnl_link_info_parse()
543 link->ce_mask |= LINK_ATTR_MAP; in rtnl_link_info_parse()
547 link->l_master = nla_get_u32(tb[IFLA_MASTER]); in rtnl_link_info_parse()
548 link->ce_mask |= LINK_ATTR_MASTER; in rtnl_link_info_parse()
552 link->l_carrier = nla_get_u8(tb[IFLA_CARRIER]); in rtnl_link_info_parse()
553 link->ce_mask |= LINK_ATTR_CARRIER; in rtnl_link_info_parse()
557 link->l_carrier_changes = nla_get_u32(tb[IFLA_CARRIER_CHANGES]); in rtnl_link_info_parse()
558 link->ce_mask |= LINK_ATTR_CARRIER_CHANGES; in rtnl_link_info_parse()
562 link->l_operstate = nla_get_u8(tb[IFLA_OPERSTATE]); in rtnl_link_info_parse()
563 link->ce_mask |= LINK_ATTR_OPERSTATE; in rtnl_link_info_parse()
567 link->l_linkmode = nla_get_u8(tb[IFLA_LINKMODE]); in rtnl_link_info_parse()
568 link->ce_mask |= LINK_ATTR_LINKMODE; in rtnl_link_info_parse()
572 link->l_ifalias = nla_strdup(tb[IFLA_IFALIAS]); in rtnl_link_info_parse()
573 if (link->l_ifalias == NULL) in rtnl_link_info_parse()
575 link->ce_mask |= LINK_ATTR_IFALIAS; in rtnl_link_info_parse()
579 link->l_ns_fd = nla_get_u32(tb[IFLA_NET_NS_FD]); in rtnl_link_info_parse()
580 link->ce_mask |= LINK_ATTR_NS_FD; in rtnl_link_info_parse()
584 link->l_ns_pid = nla_get_u32(tb[IFLA_NET_NS_PID]); in rtnl_link_info_parse()
585 link->ce_mask |= LINK_ATTR_NS_PID; in rtnl_link_info_parse()
594 _nl_auto_rtnl_link struct rtnl_link *link = NULL; in link_msg_parser() local
602 link = rtnl_link_alloc(); in link_msg_parser()
603 if (link == NULL) in link_msg_parser()
606 link->ce_msgtype = n->nlmsg_type; in link_msg_parser()
612 link->l_family = family = ifi->ifi_family; in link_msg_parser()
613 link->l_arptype = ifi->ifi_type; in link_msg_parser()
614 link->l_index = ifi->ifi_index; in link_msg_parser()
615 link->l_flags = ifi->ifi_flags; in link_msg_parser()
616 link->l_change = ifi->ifi_change; in link_msg_parser()
617 link->ce_mask = (LINK_ATTR_FAMILY | in link_msg_parser()
621 if ((link->l_af_ops = af_lookup_and_alloc(link, family))) { in link_msg_parser()
622 if (link->l_af_ops->ao_protinfo_policy) { in link_msg_parser()
626 link->l_af_ops->ao_protinfo_policy, in link_msg_parser()
632 af_ops_family = link->l_af_ops; in link_msg_parser()
638 err = rtnl_link_info_parse(link, tb); in link_msg_parser()
643 link->l_num_vf = nla_get_u32(tb[IFLA_NUM_VF]); in link_msg_parser()
644 link->ce_mask |= LINK_ATTR_NUM_VF; in link_msg_parser()
645 if (link->l_num_vf && tb[IFLA_VFINFO_LIST]) { in link_msg_parser()
646 if ((err = rtnl_link_sriov_parse_vflist(link, tb)) < 0) in link_msg_parser()
648 link->ce_mask |= LINK_ATTR_VF_LIST; in link_msg_parser()
665 err = rtnl_link_set_type(link, kind); in link_msg_parser()
670 && !link->l_af_ops in link_msg_parser()
671 && (link->l_af_ops = af_lookup_and_alloc(link, af))) { in link_msg_parser()
672 link->l_family = af; in link_msg_parser()
673 if (link->l_af_ops->ao_protinfo_policy) in link_msg_parser()
674 tb[IFLA_PROTINFO] = (struct nlattr *)link->l_af_ops->ao_protinfo_policy; in link_msg_parser()
677 if (link->l_info_ops) in link_msg_parser()
678 release_link_info(link); in link_msg_parser()
681 link->l_info_ops = ops; in link_msg_parser()
686 err = ops->io_parse(link, li[IFLA_INFO_DATA], in link_msg_parser()
695 link->ce_mask |= LINK_ATTR_LINKINFO; in link_msg_parser()
701 err = rtnl_link_set_slave_type(link, kind); in link_msg_parser()
705 link->ce_mask |= LINK_ATTR_LINKINFO_SLAVE_KIND; in link_msg_parser()
710 && link->l_af_ops in link_msg_parser()
711 && link->l_af_ops->ao_parse_protinfo) { in link_msg_parser()
712 err = link->l_af_ops->ao_parse_protinfo(link, tb[IFLA_PROTINFO], in link_msg_parser()
713 link->l_af_data[link->l_family]); in link_msg_parser()
716 link->ce_mask |= LINK_ATTR_PROTINFO; in link_msg_parser()
725 err = af_ops_family->ao_parse_af_full(link, in link_msg_parser()
727 link->l_af_data[af_ops_family->ao_family]); in link_msg_parser()
730 link->ce_mask |= LINK_ATTR_AF_SPEC; in link_msg_parser()
738 af_ops = af_lookup_and_alloc(link, nla_type(af_attr)); in link_msg_parser()
740 char *af_data = link->l_af_data[nla_type(af_attr)]; in link_msg_parser()
742 err = af_ops->ao_parse_af(link, af_attr, af_data); in link_msg_parser()
747 link->ce_mask |= LINK_ATTR_AF_SPEC; in link_msg_parser()
755 link->l_promiscuity = nla_get_u32(tb[IFLA_PROMISCUITY]); in link_msg_parser()
756 link->ce_mask |= LINK_ATTR_PROMISCUITY; in link_msg_parser()
760 link->l_num_tx_queues = nla_get_u32(tb[IFLA_NUM_TX_QUEUES]); in link_msg_parser()
761 link->ce_mask |= LINK_ATTR_NUM_TX_QUEUES; in link_msg_parser()
765 link->l_num_rx_queues = nla_get_u32(tb[IFLA_NUM_RX_QUEUES]); in link_msg_parser()
766 link->ce_mask |= LINK_ATTR_NUM_RX_QUEUES; in link_msg_parser()
770 link->l_gso_max_segs = nla_get_u32(tb[IFLA_GSO_MAX_SEGS]); in link_msg_parser()
771 link->ce_mask |= LINK_ATTR_GSO_MAX_SEGS; in link_msg_parser()
775 link->l_gso_max_size = nla_get_u32(tb[IFLA_GSO_MAX_SIZE]); in link_msg_parser()
776 link->ce_mask |= LINK_ATTR_GSO_MAX_SIZE; in link_msg_parser()
780 link->l_group = nla_get_u32(tb[IFLA_GROUP]); in link_msg_parser()
781 link->ce_mask |= LINK_ATTR_GROUP; in link_msg_parser()
785 link->l_phys_port_id = nl_data_alloc_attr(tb[IFLA_PHYS_PORT_ID]); in link_msg_parser()
786 if (link->l_phys_port_id == NULL) in link_msg_parser()
788 link->ce_mask |= LINK_ATTR_PHYS_PORT_ID; in link_msg_parser()
792 nla_strlcpy(link->l_phys_port_name, tb[IFLA_PHYS_PORT_NAME], IFNAMSIZ); in link_msg_parser()
793 link->ce_mask |= LINK_ATTR_PHYS_PORT_NAME; in link_msg_parser()
797 link->l_phys_switch_id = nl_data_alloc_attr(tb[IFLA_PHYS_SWITCH_ID]); in link_msg_parser()
798 if (link->l_phys_switch_id == NULL) in link_msg_parser()
800 link->ce_mask |= LINK_ATTR_PHYS_SWITCH_ID; in link_msg_parser()
803 return pp->pp_cb((struct nl_object *) link, pp); in link_msg_parser()
846 struct rtnl_link *link = (struct rtnl_link *) obj; in link_dump_line() local
850 cache = nl_cache_mngt_require_safe("route/link"); in link_dump_line()
854 if (link->l_family != AF_UNSPEC) in link_dump_line()
855 nl_dump_line(p, "%s ", nl_af2str(link->l_family, buf, sizeof(buf))); in link_dump_line()
857 nl_dump_line(p, "%s %s ", link->l_name, in link_dump_line()
858 nl_llproto2str(link->l_arptype, buf, sizeof(buf))); in link_dump_line()
860 if (link->l_addr && !nl_addr_iszero(link->l_addr)) in link_dump_line()
861 nl_dump(p, "%s ", nl_addr2str(link->l_addr, buf, sizeof(buf))); in link_dump_line()
863 if (link->ce_mask & LINK_ATTR_MASTER) { in link_dump_line()
865 _nl_auto_rtnl_link struct rtnl_link *master = rtnl_link_get(cache, link->l_master); in link_dump_line()
869 nl_dump(p, "master %d ", link->l_master); in link_dump_line()
872 rtnl_link_flags2str(link->l_flags, buf, sizeof(buf)); in link_dump_line()
876 if (link->ce_mask & LINK_ATTR_LINK) { in link_dump_line()
878 && !(link->ce_mask & LINK_ATTR_LINK_NETNSID)) { in link_dump_line()
879 _nl_auto_rtnl_link struct rtnl_link *ll = rtnl_link_get(cache, link->l_link); in link_dump_line()
883 nl_dump(p, "slave-of %d ", link->l_link); in link_dump_line()
885 if (link->ce_mask & LINK_ATTR_LINK_NETNSID) in link_dump_line()
886 nl_dump(p, "link-netnsid %d ", link->l_link_netnsid); in link_dump_line()
888 if (link->ce_mask & LINK_ATTR_GROUP) in link_dump_line()
889 nl_dump(p, "group %u ", link->l_group); in link_dump_line()
891 if (link->l_info_ops && link->l_info_ops->io_dump[NL_DUMP_LINE]) in link_dump_line()
892 link->l_info_ops->io_dump[NL_DUMP_LINE](link, p); in link_dump_line()
894 do_foreach_af(link, af_dump_line, p); in link_dump_line()
904 struct rtnl_link *link = (struct rtnl_link *) obj; in link_dump_details() local
909 nl_dump_line(p, " mtu %u ", link->l_mtu); in link_dump_details()
910 nl_dump(p, "txqlen %u weight %u ", link->l_txqlen, link->l_weight); in link_dump_details()
912 if (link->ce_mask & LINK_ATTR_QDISC) in link_dump_details()
913 nl_dump(p, "qdisc %s ", link->l_qdisc); in link_dump_details()
915 if (link->ce_mask & LINK_ATTR_MAP && link->l_map.lm_irq) in link_dump_details()
916 nl_dump(p, "irq %u ", link->l_map.lm_irq); in link_dump_details()
918 if (link->ce_mask & LINK_ATTR_IFINDEX) in link_dump_details()
919 nl_dump(p, "index %u ", link->l_index); in link_dump_details()
921 if (link->ce_mask & LINK_ATTR_PROMISCUITY && link->l_promiscuity > 0) in link_dump_details()
922 nl_dump(p, "promisc-mode (%u users) ", link->l_promiscuity); in link_dump_details()
926 if (link->ce_mask & LINK_ATTR_IFALIAS) in link_dump_details()
927 nl_dump_line(p, " alias %s\n", link->l_ifalias); in link_dump_details()
931 if (link->ce_mask & LINK_ATTR_NUM_TX_QUEUES) in link_dump_details()
932 nl_dump(p, "txq %u ", link->l_num_tx_queues); in link_dump_details()
934 if (link->ce_mask & LINK_ATTR_NUM_RX_QUEUES) in link_dump_details()
935 nl_dump(p, "rxq %u ", link->l_num_rx_queues); in link_dump_details()
937 if (link->ce_mask & LINK_ATTR_BRD) in link_dump_details()
938 nl_dump(p, "brd %s ", nl_addr2str(link->l_bcast, buf, in link_dump_details()
941 if ((link->ce_mask & LINK_ATTR_OPERSTATE) && in link_dump_details()
942 link->l_operstate != IF_OPER_UNKNOWN) { in link_dump_details()
943 rtnl_link_operstate2str(link->l_operstate, buf, sizeof(buf)); in link_dump_details()
947 if (link->ce_mask & LINK_ATTR_NUM_VF) in link_dump_details()
948 nl_dump(p, "num-vf %u ", link->l_num_vf); in link_dump_details()
951 rtnl_link_mode2str(link->l_linkmode, buf, sizeof(buf))); in link_dump_details()
954 rtnl_link_carrier2str(link->l_carrier, buf, sizeof(buf))); in link_dump_details()
956 if (link->ce_mask & LINK_ATTR_CARRIER_CHANGES) in link_dump_details()
957 nl_dump(p, " carrier-changes %u", link->l_carrier_changes); in link_dump_details()
961 if (link->l_info_ops && link->l_info_ops->io_dump[NL_DUMP_DETAILS]) in link_dump_details()
962 link->l_info_ops->io_dump[NL_DUMP_DETAILS](link, p); in link_dump_details()
964 do_foreach_af(link, af_dump_details, p); in link_dump_details()
966 if (link->ce_mask & LINK_ATTR_VF_LIST) in link_dump_details()
967 rtnl_link_sriov_dump_details(link, p); in link_dump_details()
972 struct rtnl_link *link = (struct rtnl_link *) obj; in link_dump_stats() local
981 res = nl_cancel_down_bytes(link->l_stats[RTNL_LINK_RX_BYTES], &unit); in link_dump_stats()
987 link->l_stats[RTNL_LINK_RX_PACKETS], in link_dump_stats()
988 link->l_stats[RTNL_LINK_RX_ERRORS], in link_dump_stats()
989 link->l_stats[RTNL_LINK_RX_DROPPED], in link_dump_stats()
990 link->l_stats[RTNL_LINK_RX_FIFO_ERR], in link_dump_stats()
991 link->l_stats[RTNL_LINK_RX_COMPRESSED]); in link_dump_stats()
993 res = nl_cancel_down_bytes(link->l_stats[RTNL_LINK_TX_BYTES], &unit); in link_dump_stats()
999 link->l_stats[RTNL_LINK_TX_PACKETS], in link_dump_stats()
1000 link->l_stats[RTNL_LINK_TX_ERRORS], in link_dump_stats()
1001 link->l_stats[RTNL_LINK_TX_DROPPED], in link_dump_stats()
1002 link->l_stats[RTNL_LINK_TX_FIFO_ERR], in link_dump_stats()
1003 link->l_stats[RTNL_LINK_TX_COMPRESSED]); in link_dump_stats()
1011 link->l_stats[RTNL_LINK_RX_LEN_ERR], in link_dump_stats()
1012 link->l_stats[RTNL_LINK_RX_OVER_ERR], in link_dump_stats()
1013 link->l_stats[RTNL_LINK_RX_CRC_ERR], in link_dump_stats()
1014 link->l_stats[RTNL_LINK_RX_FRAME_ERR], in link_dump_stats()
1015 link->l_stats[RTNL_LINK_RX_MISSED_ERR], in link_dump_stats()
1016 link->l_stats[RTNL_LINK_MULTICAST]); in link_dump_stats()
1023 link->l_stats[RTNL_LINK_TX_ABORT_ERR], in link_dump_stats()
1024 link->l_stats[RTNL_LINK_TX_CARRIER_ERR], in link_dump_stats()
1025 link->l_stats[RTNL_LINK_TX_HBEAT_ERR], in link_dump_stats()
1026 link->l_stats[RTNL_LINK_TX_WIN_ERR], in link_dump_stats()
1027 link->l_stats[RTNL_LINK_COLLISIONS]); in link_dump_stats()
1029 if (link->l_info_ops && link->l_info_ops->io_dump[NL_DUMP_STATS]) in link_dump_stats()
1030 link->l_info_ops->io_dump[NL_DUMP_STATS](link, p); in link_dump_stats()
1032 do_foreach_af(link, af_dump_stats, p); in link_dump_stats()
1034 if (link->ce_mask & LINK_ATTR_VF_LIST) in link_dump_stats()
1035 rtnl_link_sriov_dump_stats(link, p); in link_dump_stats()
1066 dp_dump_line(p, line++, "link %s changed state to %s.\n",
1071 dp_dump(p, "link %s %s promiscuous mode.\n",
1076 dp_dump_line(p, line++, "link %s sent unknown event.\n",
1088 struct rtnl_link *link = (struct rtnl_link *) obj; in link_keygen() local
1096 lkey.l_index = link->l_index; in link_keygen()
1097 lkey.l_family = link->l_family; in link_keygen()
1101 NL_DBG(5, "link %p key (dev %d fam %d) keysz %d, hash 0x%x\n", in link_keygen()
1102 link, lkey.l_index, lkey.l_family, lkey_sz, *hashkey); in link_keygen()
1118 diff |= LINK_DIFF(LINK, a->l_link != b->l_link); in link_compare()
1164 __ADD(LINK_ATTR_LINK, link),
1212 * Allocate link cache and fill in all configured links.
1214 * @arg family Link address family or AF_UNSPEC
1216 * @arg flags Flags to set in link cache before filling
1218 * Allocates and initializes a new link cache. If \c sk is valid, a netlink
1221 * the operation succeeds, the resulting cache will contain a link object for
1222 * each link configured in the kernel. If \c sk is NULL, returns 0 but the
1261 * Allocate link cache and fill in all configured links.
1263 * @arg family Link address family or AF_UNSPEC
1266 * Allocates and initializes a new link cache. If \c sk is valid, a netlink
1269 * the operation succeeds, the resulting cache will contain a link object for
1270 * each link configured in the kernel. If \c sk is NULL, returns 0 but the
1291 * Lookup link in cache by interface index
1292 * @arg cache Link cache
1295 * Searches through the provided cache looking for a link with matching
1298 * @attention The reference counter of the returned link object will be
1303 * @return Link object or NULL if no match was found.
1307 struct rtnl_link *link; in rtnl_link_get() local
1312 nl_list_for_each_entry(link, &cache->c_items, ce_list) { in rtnl_link_get()
1313 if (link->l_index == ifindex) { in rtnl_link_get()
1314 nl_object_get((struct nl_object *) link); in rtnl_link_get()
1315 return link; in rtnl_link_get()
1323 * Lookup link in cache by link name
1324 * @arg cache Link cache
1325 * @arg name Name of link
1327 * Searches through the provided cache looking for a link with matching
1328 * link name
1330 * @attention The reference counter of the returned link object will be
1335 * @return Link object or NULL if no match was found.
1340 struct rtnl_link *link; in rtnl_link_get_by_name() local
1345 nl_list_for_each_entry(link, &cache->c_items, ce_list) { in rtnl_link_get_by_name()
1346 if (!strcmp(name, link->l_name)) { in rtnl_link_get_by_name()
1347 nl_object_get((struct nl_object *) link); in rtnl_link_get_by_name()
1348 return link; in rtnl_link_get_by_name()
1358 * @arg name Name of link
1401 * Get a link object directly from kernel
1404 * @arg name Name of link
1405 * @arg result Pointer to store resulting link object
1408 * a specific link directly from the kernel. The returned answer is
1410 * pointer or -NLE_OBJ_NOTFOUND is returned if no matching link was
1418 * @route_doc{link_direct_lookup, Lookup Single Link (Direct Lookup)}
1424 _nl_auto_rtnl_link struct rtnl_link *link = NULL; in rtnl_link_get_kernel() local
1436 err = nl_pickup_keep_syserr(sk, link_msg_parser, (struct nl_object **) &link, &syserr); in rtnl_link_get_kernel()
1452 if (err == 0 && link) in rtnl_link_get_kernel()
1455 *result = _nl_steal_pointer(&link); in rtnl_link_get_kernel()
1460 * Translate interface index to corresponding link name
1461 * @arg cache Link cache
1467 * link name and stores the name in the destination string.
1469 * @route_doc{link_translate_ifindex, Translating interface index to link name}
1471 * @return Name of link or NULL if no match was found.
1476 _nl_auto_rtnl_link struct rtnl_link *link = NULL; in rtnl_link_i2name() local
1478 link = rtnl_link_get(cache, ifindex); in rtnl_link_i2name()
1479 if (link) { in rtnl_link_i2name()
1480 _nl_strncpy_trunc(dst, link->l_name, len); in rtnl_link_i2name()
1488 * Translate link name to corresponding interface index
1489 * @arg cache Link cache
1490 * @arg name Name of link
1492 * @route_doc{link_translate_ifindex, Translating interface index to link name}
1498 _nl_auto_rtnl_link struct rtnl_link *link = NULL; in rtnl_link_name2i() local
1500 link = rtnl_link_get_by_name(cache, name); in rtnl_link_name2i()
1501 if (link) in rtnl_link_name2i()
1502 return link->l_index; in rtnl_link_name2i()
1509 int rtnl_link_fill_info(struct nl_msg *msg, struct rtnl_link *link) in rtnl_link_fill_info() argument
1511 if (link->ce_mask & LINK_ATTR_ADDR) in rtnl_link_fill_info()
1512 NLA_PUT_ADDR(msg, IFLA_ADDRESS, link->l_addr); in rtnl_link_fill_info()
1514 if (link->ce_mask & LINK_ATTR_BRD) in rtnl_link_fill_info()
1515 NLA_PUT_ADDR(msg, IFLA_BROADCAST, link->l_bcast); in rtnl_link_fill_info()
1517 if (link->ce_mask & LINK_ATTR_MTU) in rtnl_link_fill_info()
1518 NLA_PUT_U32(msg, IFLA_MTU, link->l_mtu); in rtnl_link_fill_info()
1520 if (link->ce_mask & LINK_ATTR_TXQLEN) in rtnl_link_fill_info()
1521 NLA_PUT_U32(msg, IFLA_TXQLEN, link->l_txqlen); in rtnl_link_fill_info()
1523 if (link->ce_mask & LINK_ATTR_WEIGHT) in rtnl_link_fill_info()
1524 NLA_PUT_U32(msg, IFLA_WEIGHT, link->l_weight); in rtnl_link_fill_info()
1526 if (link->ce_mask & LINK_ATTR_IFNAME) in rtnl_link_fill_info()
1527 NLA_PUT_STRING(msg, IFLA_IFNAME, link->l_name); in rtnl_link_fill_info()
1529 if (link->ce_mask & LINK_ATTR_OPERSTATE) in rtnl_link_fill_info()
1530 NLA_PUT_U8(msg, IFLA_OPERSTATE, link->l_operstate); in rtnl_link_fill_info()
1532 if (link->ce_mask & LINK_ATTR_CARRIER) in rtnl_link_fill_info()
1533 NLA_PUT_U8(msg, IFLA_CARRIER, link->l_carrier); in rtnl_link_fill_info()
1535 if (link->ce_mask & LINK_ATTR_LINKMODE) in rtnl_link_fill_info()
1536 NLA_PUT_U8(msg, IFLA_LINKMODE, link->l_linkmode); in rtnl_link_fill_info()
1538 if (link->ce_mask & LINK_ATTR_IFALIAS) in rtnl_link_fill_info()
1539 NLA_PUT_STRING(msg, IFLA_IFALIAS, link->l_ifalias); in rtnl_link_fill_info()
1541 if (link->ce_mask & LINK_ATTR_LINK) in rtnl_link_fill_info()
1542 NLA_PUT_U32(msg, IFLA_LINK, link->l_link); in rtnl_link_fill_info()
1544 if (link->ce_mask & LINK_ATTR_LINK_NETNSID) in rtnl_link_fill_info()
1545 NLA_PUT_S32(msg, IFLA_LINK_NETNSID, link->l_link_netnsid); in rtnl_link_fill_info()
1547 if (link->ce_mask & LINK_ATTR_MASTER) in rtnl_link_fill_info()
1548 NLA_PUT_U32(msg, IFLA_MASTER, link->l_master); in rtnl_link_fill_info()
1550 if (link->ce_mask & LINK_ATTR_NUM_TX_QUEUES) in rtnl_link_fill_info()
1551 NLA_PUT_U32(msg, IFLA_NUM_TX_QUEUES, link->l_num_tx_queues); in rtnl_link_fill_info()
1553 if (link->ce_mask & LINK_ATTR_NUM_RX_QUEUES) in rtnl_link_fill_info()
1554 NLA_PUT_U32(msg, IFLA_NUM_RX_QUEUES, link->l_num_rx_queues); in rtnl_link_fill_info()
1556 if (link->ce_mask & LINK_ATTR_NS_FD) in rtnl_link_fill_info()
1557 NLA_PUT_U32(msg, IFLA_NET_NS_FD, link->l_ns_fd); in rtnl_link_fill_info()
1559 if (link->ce_mask & LINK_ATTR_NS_PID) in rtnl_link_fill_info()
1560 NLA_PUT_U32(msg, IFLA_NET_NS_PID, link->l_ns_pid); in rtnl_link_fill_info()
1569 struct rtnl_link *link, int flags, struct nl_msg **result) in build_link_msg() argument
1581 if (rtnl_link_fill_info(msg, link)) in build_link_msg()
1584 if (link->ce_mask & LINK_ATTR_GROUP) in build_link_msg()
1585 NLA_PUT_U32(msg, IFLA_GROUP, link->l_group); in build_link_msg()
1587 if (link->ce_mask & (LINK_ATTR_LINKINFO|LINK_ATTR_LINKINFO_SLAVE_KIND)) { in build_link_msg()
1593 if (link->ce_mask & LINK_ATTR_LINKINFO) { in build_link_msg()
1594 NLA_PUT_STRING(msg, IFLA_INFO_KIND, link->l_info_kind); in build_link_msg()
1596 if (link->l_info_ops) { in build_link_msg()
1597 if (link->l_info_ops->io_put_attrs && in build_link_msg()
1598 link->l_info_ops->io_put_attrs(msg, link) < 0) in build_link_msg()
1603 if (link->ce_mask & LINK_ATTR_LINKINFO_SLAVE_KIND) { in build_link_msg()
1604 NLA_PUT_STRING(msg, IFLA_INFO_SLAVE_KIND, link->l_info_slave_kind); in build_link_msg()
1610 if (link->ce_mask & LINK_ATTR_VF_LIST) { in build_link_msg()
1611 if (rtnl_link_sriov_fill_vflist(msg, link) < 0) in build_link_msg()
1615 if (do_foreach_af(link, af_fill_pi, msg) < 0) in build_link_msg()
1621 if (do_foreach_af(link, af_fill, msg) < 0) in build_link_msg()
1639 * Build a netlink message requesting the addition of new virtual link
1640 * @arg link new link to add
1654 int rtnl_link_build_add_request(struct rtnl_link *link, int flags, in rtnl_link_build_add_request() argument
1658 .ifi_family = link->l_family, in rtnl_link_build_add_request()
1659 .ifi_index = link->l_index, in rtnl_link_build_add_request()
1660 .ifi_flags = link->l_flags, in rtnl_link_build_add_request()
1661 .ifi_change = link->l_flag_mask, in rtnl_link_build_add_request()
1664 return build_link_msg(RTM_NEWLINK, &ifi, link, flags, result); in rtnl_link_build_add_request()
1668 * Add virtual link
1670 * @arg link new link to add
1674 * a new virtual link.
1684 int rtnl_link_add(struct nl_sock *sk, struct rtnl_link *link, int flags) in rtnl_link_add() argument
1689 err = rtnl_link_build_add_request(link, flags, &msg); in rtnl_link_add()
1697 * Build a netlink message requesting the modification of link
1698 * @arg orig original link to change
1699 * @arg changes link containing the changes to be made
1711 * to RTM_SETLINK (does not allow changing link info attributes) to
1733 APPBUG("link change: family is immutable"); in rtnl_link_build_change_request()
1753 * Change link
1755 * @arg orig original link to be changed
1756 * @arg changes link containing the changes to be made
1760 * a network link. If -EOPNOTSUPP is returned by the kernel, the
1764 * The link to be changed is looked up based on the interface index
1765 * supplied in the \p orig link. Optionaly the link name is used but
1767 * link name will result in the link name being changed.
1769 * If no matching link exists, the function will return
1778 * @note The link name can only be changed if the link has been put
1825 * Build a netlink message requesting the deletion of a link
1826 * @arg link Link to delete
1837 int rtnl_link_build_delete_request(const struct rtnl_link *link, in rtnl_link_build_delete_request() argument
1842 .ifi_index = link->l_index, in rtnl_link_build_delete_request()
1845 if (!(link->ce_mask & (LINK_ATTR_IFINDEX | LINK_ATTR_IFNAME))) { in rtnl_link_build_delete_request()
1855 if (link->ce_mask & LINK_ATTR_IFNAME) in rtnl_link_build_delete_request()
1856 _NL_RETURN_ON_PUT_ERR(nla_put_string(msg, IFLA_IFNAME, link->l_name)); in rtnl_link_build_delete_request()
1863 * Delete link
1865 * @arg link Link to delete
1868 * a network link which has been previously added to the kernel and
1871 * If no matching link exists, the function will return
1886 int rtnl_link_delete(struct nl_sock *sk, const struct rtnl_link *link) in rtnl_link_delete() argument
1891 if ((err = rtnl_link_build_delete_request(link, &msg)) < 0) in rtnl_link_delete()
1900 * @name Link Object
1905 * Allocate link object
1908 * @return New link object or NULL if allocation failed
1916 * Return a link object reference
1917 * @arg link Link object
1919 void rtnl_link_put(struct rtnl_link *link) in rtnl_link_put() argument
1921 nl_object_put((struct nl_object *) link); in rtnl_link_put()
1925 * Set name of link object
1926 * @arg link Link object
1929 * @note To change the name of a link in the kernel, set the interface
1930 * index to the link you wish to change, modify the link name using
1931 * this function and pass the link object to rtnl_link_change() or
1934 * @route_doc{link_attr_name, Link Name}
1938 void rtnl_link_set_name(struct rtnl_link *link, const char *name) in rtnl_link_set_name() argument
1940 _nl_strncpy_trunc(link->l_name, name, sizeof(link->l_name)); in rtnl_link_set_name()
1941 link->ce_mask |= LINK_ATTR_IFNAME; in rtnl_link_set_name()
1945 * Return name of link object
1946 * @arg link Link object
1948 * @route_doc{link_attr_name, Link Name}
1950 * @return Link name or NULL if name is not specified
1952 char *rtnl_link_get_name(struct rtnl_link *link) in rtnl_link_get_name() argument
1954 return link->ce_mask & LINK_ATTR_IFNAME ? link->l_name : NULL; in rtnl_link_get_name()
1958 * Set the group identifier of a link object
1959 * @arg link Link object
1962 void rtnl_link_set_group(struct rtnl_link *link, uint32_t group) in rtnl_link_set_group() argument
1964 link->l_group = group; in rtnl_link_set_group()
1965 link->ce_mask |= LINK_ATTR_GROUP; in rtnl_link_set_group()
1969 * Return the group identifier of link object
1970 * @arg link Link object
1974 uint32_t rtnl_link_get_group(struct rtnl_link *link) in rtnl_link_get_group() argument
1976 return link->l_group; in rtnl_link_get_group()
1979 static inline void __assign_addr(struct rtnl_link *link, struct nl_addr **pos, in __assign_addr() argument
1988 link->ce_mask |= flag; in __assign_addr()
1992 * Set link layer address of link object
1993 * @arg link Link object
1994 * @arg addr New link layer address
1997 * and overwrites any existing link layer address previously assigned.
1999 * @route_doc{link_attr_address, Link layer address}
2002 void rtnl_link_set_addr(struct rtnl_link *link, struct nl_addr *addr) in rtnl_link_set_addr() argument
2004 __assign_addr(link, &link->l_addr, addr, LINK_ATTR_ADDR); in rtnl_link_set_addr()
2008 * Return link layer address of link object
2009 * @arg link Link object
2012 * @route_doc{link_attr_address, Link Layer Address}
2014 * @return Link layer address or NULL if not set.
2016 struct nl_addr *rtnl_link_get_addr(struct rtnl_link *link) in rtnl_link_get_addr() argument
2018 return link->ce_mask & LINK_ATTR_ADDR ? link->l_addr : NULL; in rtnl_link_get_addr()
2022 * Set link layer broadcast address of link object
2023 * @arg link Link object
2027 * and overwrites any existing link layer broadcast address previously
2030 * @route_doc{link_attr_broadcast, Link Layer Broadcast Address}
2033 void rtnl_link_set_broadcast(struct rtnl_link *link, struct nl_addr *addr) in rtnl_link_set_broadcast() argument
2035 __assign_addr(link, &link->l_bcast, addr, LINK_ATTR_BRD); in rtnl_link_set_broadcast()
2039 * Return link layer broadcast address of link object
2040 * @arg link Link object
2043 * @route_doc{link_attr_address, Link Layer Address}
2045 * @return Link layer address or NULL if not set.
2047 struct nl_addr *rtnl_link_get_broadcast(struct rtnl_link *link) in rtnl_link_get_broadcast() argument
2049 return link->ce_mask & LINK_ATTR_BRD ? link->l_bcast : NULL; in rtnl_link_get_broadcast()
2053 * Set flags of link object
2054 * @arg link Link object
2060 void rtnl_link_set_flags(struct rtnl_link *link, unsigned int flags) in rtnl_link_set_flags() argument
2062 link->l_flag_mask |= flags; in rtnl_link_set_flags()
2063 link->l_flags |= flags; in rtnl_link_set_flags()
2064 link->ce_mask |= LINK_ATTR_FLAGS; in rtnl_link_set_flags()
2068 * Unset flags of link object
2069 * @arg link Link object
2075 void rtnl_link_unset_flags(struct rtnl_link *link, unsigned int flags) in rtnl_link_unset_flags() argument
2077 link->l_flag_mask |= flags; in rtnl_link_unset_flags()
2078 link->l_flags &= ~flags; in rtnl_link_unset_flags()
2079 link->ce_mask |= LINK_ATTR_FLAGS; in rtnl_link_unset_flags()
2083 * Return flags of link object
2084 * @arg link Link object
2086 * @route_doc{link_attr_flags, Link Flags}
2089 * @return Link flags or 0 if none have been set.
2091 unsigned int rtnl_link_get_flags(struct rtnl_link *link) in rtnl_link_get_flags() argument
2093 return link->l_flags; in rtnl_link_get_flags()
2097 * Set address family of link object
2101 void rtnl_link_set_family(struct rtnl_link *link, int family) in rtnl_link_set_family() argument
2103 link->l_family = family; in rtnl_link_set_family()
2104 link->ce_mask |= LINK_ATTR_FAMILY; in rtnl_link_set_family()
2106 if (link->l_af_ops) { in rtnl_link_set_family()
2107 int ao_family = link->l_af_ops->ao_family; in rtnl_link_set_family()
2109 af_free(link, link->l_af_ops, link->l_af_data[ao_family], NULL); in rtnl_link_set_family()
2110 link->l_af_data[ao_family] = NULL; in rtnl_link_set_family()
2113 link->l_af_ops = af_lookup_and_alloc(link, family); in rtnl_link_set_family()
2117 * Return address family of link object
2118 * @arg link Link object
2123 int rtnl_link_get_family(struct rtnl_link *link) in rtnl_link_get_family() argument
2125 return link->ce_mask & LINK_ATTR_FAMILY ? link->l_family : AF_UNSPEC; in rtnl_link_get_family()
2129 * Set hardware type of link object
2130 * @arg link Link object
2137 void rtnl_link_set_arptype(struct rtnl_link *link, unsigned int arptype) in rtnl_link_set_arptype() argument
2139 link->l_arptype = arptype; in rtnl_link_set_arptype()
2140 link->ce_mask |= LINK_ATTR_ARPTYPE; in rtnl_link_set_arptype()
2144 * Get hardware type of link object
2145 * @arg link Link object
2151 unsigned int rtnl_link_get_arptype(struct rtnl_link *link) in rtnl_link_get_arptype() argument
2153 if (link->ce_mask & LINK_ATTR_ARPTYPE) in rtnl_link_get_arptype()
2154 return link->l_arptype; in rtnl_link_get_arptype()
2160 * Set interface index of link object
2161 * @arg link Link object
2167 void rtnl_link_set_ifindex(struct rtnl_link *link, int ifindex) in rtnl_link_set_ifindex() argument
2169 link->l_index = ifindex; in rtnl_link_set_ifindex()
2170 link->ce_mask |= LINK_ATTR_IFINDEX; in rtnl_link_set_ifindex()
2175 * Return interface index of link object
2176 * @arg link Link object
2182 int rtnl_link_get_ifindex(struct rtnl_link *link) in rtnl_link_get_ifindex() argument
2184 return link->l_index; in rtnl_link_get_ifindex()
2188 * Set Maximum Transmission Unit of link object
2189 * @arg link Link object
2195 void rtnl_link_set_mtu(struct rtnl_link *link, unsigned int mtu) in rtnl_link_set_mtu() argument
2197 link->l_mtu = mtu; in rtnl_link_set_mtu()
2198 link->ce_mask |= LINK_ATTR_MTU; in rtnl_link_set_mtu()
2202 * Return maximum transmission unit of link object
2203 * @arg link Link object
2209 unsigned int rtnl_link_get_mtu(struct rtnl_link *link) in rtnl_link_get_mtu() argument
2211 return link->l_mtu; in rtnl_link_get_mtu()
2216 * @arg link Link object
2219 * The unit is dependant on the link type. The most common units is number
2224 void rtnl_link_set_txqlen(struct rtnl_link *link, unsigned int txqlen) in rtnl_link_set_txqlen() argument
2226 link->l_txqlen = txqlen; in rtnl_link_set_txqlen()
2227 link->ce_mask |= LINK_ATTR_TXQLEN; in rtnl_link_set_txqlen()
2232 * @arg link Link object
2234 * The unit is dependant on the link type. The most common units is number
2240 unsigned int rtnl_link_get_txqlen(struct rtnl_link *link) in rtnl_link_get_txqlen() argument
2242 return link->ce_mask & LINK_ATTR_TXQLEN ? link->l_txqlen : 0; in rtnl_link_get_txqlen()
2245 void rtnl_link_set_link(struct rtnl_link *link, int ifindex) in rtnl_link_set_link() argument
2247 link->l_link = ifindex; in rtnl_link_set_link()
2248 link->ce_mask |= LINK_ATTR_LINK; in rtnl_link_set_link()
2251 int rtnl_link_get_link(struct rtnl_link *link) in rtnl_link_get_link() argument
2253 return link->l_link; in rtnl_link_get_link()
2257 * Set the netnsid of the link
2258 * @arg link Link object
2261 * Sets the IFLA_LINK_NETNSID attribute of the link
2264 int rtnl_link_set_link_netnsid(struct rtnl_link *link, int32_t link_netnsid) in rtnl_link_set_link_netnsid() argument
2266 link->l_link_netnsid = link_netnsid; in rtnl_link_set_link_netnsid()
2267 link->ce_mask |= LINK_ATTR_LINK_NETNSID; in rtnl_link_set_link_netnsid()
2272 * Get the netnsid of the link
2273 * @arg link Link object
2276 * Gets the IFLA_LINK_NETNSID attribute of the link
2281 int rtnl_link_get_link_netnsid(const struct rtnl_link *link, int32_t *out_link_netnsid) in rtnl_link_get_link_netnsid() argument
2283 if (!(link->ce_mask & LINK_ATTR_LINK_NETNSID)) in rtnl_link_get_link_netnsid()
2286 *out_link_netnsid = link->l_link_netnsid; in rtnl_link_get_link_netnsid()
2291 * Set master link of link object
2292 * @arg link Link object
2293 * @arg ifindex Interface index of master link
2297 void rtnl_link_set_master(struct rtnl_link *link, int ifindex) in rtnl_link_set_master() argument
2299 link->l_master = ifindex; in rtnl_link_set_master()
2300 link->ce_mask |= LINK_ATTR_MASTER; in rtnl_link_set_master()
2304 * Return master link of link object
2305 * @arg link Link object
2308 * @return Interface index of master link or 0 if not specified
2310 int rtnl_link_get_master(struct rtnl_link *link) in rtnl_link_get_master() argument
2312 return link->l_master; in rtnl_link_get_master()
2316 * Set carrier of link object
2317 * @arg link Link object
2322 void rtnl_link_set_carrier(struct rtnl_link *link, uint8_t status) in rtnl_link_set_carrier() argument
2324 link->l_carrier = status; in rtnl_link_set_carrier()
2325 link->ce_mask |= LINK_ATTR_CARRIER; in rtnl_link_set_carrier()
2329 * Return carrier status of link object
2330 * @arg link Link object
2335 uint8_t rtnl_link_get_carrier(struct rtnl_link *link) in rtnl_link_get_carrier() argument
2337 return link->l_carrier; in rtnl_link_get_carrier()
2341 * Return carrier on/off changes of link object
2342 * @arg link Link object
2347 int rtnl_link_get_carrier_changes(struct rtnl_link *link, uint32_t *carrier_changes) in rtnl_link_get_carrier_changes() argument
2349 if (!(link->ce_mask & LINK_ATTR_CARRIER_CHANGES)) in rtnl_link_get_carrier_changes()
2353 *carrier_changes = link->l_carrier_changes; in rtnl_link_get_carrier_changes()
2359 * Set operational status of link object
2360 * @arg link Link object
2366 void rtnl_link_set_operstate(struct rtnl_link *link, uint8_t status) in rtnl_link_set_operstate() argument
2368 link->l_operstate = status; in rtnl_link_set_operstate()
2369 link->ce_mask |= LINK_ATTR_OPERSTATE; in rtnl_link_set_operstate()
2373 * Return operational status of link object
2374 * @arg link Link object
2380 uint8_t rtnl_link_get_operstate(struct rtnl_link *link) in rtnl_link_get_operstate() argument
2382 return link->l_operstate; in rtnl_link_get_operstate()
2386 * Set link mode of link object
2387 * @arg link Link object
2388 * @arg mode New link mode
2393 void rtnl_link_set_linkmode(struct rtnl_link *link, uint8_t mode) in rtnl_link_set_linkmode() argument
2395 link->l_linkmode = mode; in rtnl_link_set_linkmode()
2396 link->ce_mask |= LINK_ATTR_LINKMODE; in rtnl_link_set_linkmode()
2400 * Return link mode of link object
2401 * @arg link Link object
2405 * @return Link mode or \c IF_LINK_MODE_DEFAULT
2407 uint8_t rtnl_link_get_linkmode(struct rtnl_link *link) in rtnl_link_get_linkmode() argument
2409 return link->l_linkmode; in rtnl_link_get_linkmode()
2413 * Return alias name of link object (SNMP IfAlias)
2414 * @arg link Link object
2420 const char *rtnl_link_get_ifalias(struct rtnl_link *link) in rtnl_link_get_ifalias() argument
2422 return link->l_ifalias; in rtnl_link_get_ifalias()
2426 * Set alias name of link object (SNMP IfAlias)
2427 * @arg link Link object
2430 * Sets the alias name of the link to the specified name. The alias
2437 void rtnl_link_set_ifalias(struct rtnl_link *link, const char *alias) in rtnl_link_set_ifalias() argument
2439 free(link->l_ifalias); in rtnl_link_set_ifalias()
2442 link->l_ifalias = strdup(alias); in rtnl_link_set_ifalias()
2443 link->ce_mask |= LINK_ATTR_IFALIAS; in rtnl_link_set_ifalias()
2445 link->l_ifalias = NULL; in rtnl_link_set_ifalias()
2446 link->ce_mask &= ~LINK_ATTR_IFALIAS; in rtnl_link_set_ifalias()
2451 * Set queueing discipline name of link object
2452 * @arg link Link object
2457 * For more information on how to modify the qdisc of a link, see section
2463 void rtnl_link_set_qdisc(struct rtnl_link *link, const char *name) in rtnl_link_set_qdisc() argument
2465 _nl_strncpy_trunc(link->l_qdisc, name, sizeof(link->l_qdisc)); in rtnl_link_set_qdisc()
2466 link->ce_mask |= LINK_ATTR_QDISC; in rtnl_link_set_qdisc()
2470 * Return name of queueing discipline of link object
2471 * @arg link Link object
2477 char *rtnl_link_get_qdisc(struct rtnl_link *link) in rtnl_link_get_qdisc() argument
2479 return link->ce_mask & LINK_ATTR_QDISC ? link->l_qdisc : NULL; in rtnl_link_get_qdisc()
2484 * Return number of PCI virtual functions of link object
2485 * @arg link Link object
2490 int rtnl_link_get_num_vf(struct rtnl_link *link, uint32_t *num_vf) in rtnl_link_get_num_vf() argument
2492 if (link->ce_mask & LINK_ATTR_NUM_VF) { in rtnl_link_get_num_vf()
2493 *num_vf = link->l_num_vf; in rtnl_link_get_num_vf()
2500 * Return value of link statistics counter
2501 * @arg link Link object
2506 uint64_t rtnl_link_get_stat(struct rtnl_link *link, rtnl_link_stat_id_t id) in rtnl_link_get_stat() argument
2511 return link->l_stats[id]; in rtnl_link_get_stat()
2515 * Set value of link statistics counter
2516 * @arg link Link object
2525 int rtnl_link_set_stat(struct rtnl_link *link, rtnl_link_stat_id_t id, in rtnl_link_set_stat() argument
2531 link->l_stats[id] = value; in rtnl_link_set_stat()
2537 * Set type of link object
2538 * @arg link Link object
2539 * @arg type Name of link type
2541 * Looks up the link type module and prepares the link to store type
2543 * be released with all link type specific attributes lost.
2545 * @route_doc{link_modules, Link Modules}
2548 int rtnl_link_set_type(struct rtnl_link *link, const char *type) in rtnl_link_set_type() argument
2554 free(link->l_info_kind); in rtnl_link_set_type()
2555 link->ce_mask &= ~LINK_ATTR_LINKINFO; in rtnl_link_set_type()
2556 release_link_info(link); in rtnl_link_set_type()
2567 if (io->io_alloc && (err = io->io_alloc(link)) < 0) { in rtnl_link_set_type()
2572 link->l_info_ops = io; in rtnl_link_set_type()
2575 link->l_info_kind = _nl_steal_pointer(&kind); in rtnl_link_set_type()
2576 link->ce_mask |= LINK_ATTR_LINKINFO; in rtnl_link_set_type()
2582 * Return type of link
2583 * @arg link Link object
2585 * @route_doc{link_modules, Link Modules}
2586 * @return Name of link type or NULL if not specified.
2588 char *rtnl_link_get_type(struct rtnl_link *link) in rtnl_link_get_type() argument
2590 return link->l_info_kind; in rtnl_link_get_type()
2594 * Set type of slave link object
2595 * @arg link Link object (slave)
2596 * @arg type Name of link type
2600 * @route_doc{link_modules, Link Modules}
2603 int rtnl_link_set_slave_type(struct rtnl_link *link, const char *type) in rtnl_link_set_slave_type() argument
2613 free(link->l_info_slave_kind); in rtnl_link_set_slave_type()
2614 link->l_info_slave_kind = kind; in rtnl_link_set_slave_type()
2617 link->ce_mask |= LINK_ATTR_LINKINFO_SLAVE_KIND; in rtnl_link_set_slave_type()
2619 link->ce_mask &= ~LINK_ATTR_LINKINFO_SLAVE_KIND; in rtnl_link_set_slave_type()
2624 * Return type of enslaved link
2625 * @arg link Link object
2627 * @route_doc{link_modules, Link Modules}
2628 * @return Name of enslaved link type or NULL if not specified.
2630 const char *rtnl_link_get_slave_type(const struct rtnl_link *link) in rtnl_link_get_slave_type() argument
2632 return link->l_info_slave_kind; in rtnl_link_get_slave_type()
2637 * Set link promiscuity count
2638 * @arg link Link object
2645 void rtnl_link_set_promiscuity(struct rtnl_link *link, uint32_t count) in rtnl_link_set_promiscuity() argument
2647 link->l_promiscuity = count; in rtnl_link_set_promiscuity()
2648 link->ce_mask |= LINK_ATTR_PROMISCUITY; in rtnl_link_set_promiscuity()
2652 * Return link promiscuity count
2653 * @arg link Link object
2656 * @return Link promiscuity count or 0
2658 uint32_t rtnl_link_get_promiscuity(struct rtnl_link *link) in rtnl_link_get_promiscuity() argument
2660 return link->l_promiscuity; in rtnl_link_get_promiscuity()
2665 * @arg link Link object
2668 * Sets the number of TX queues of the link object. The value is considered
2673 * combination with rtnl_link_add() or if the link object is used as a filter.
2677 void rtnl_link_set_num_tx_queues(struct rtnl_link *link, uint32_t nqueues) in rtnl_link_set_num_tx_queues() argument
2679 link->l_num_tx_queues = nqueues; in rtnl_link_set_num_tx_queues()
2680 link->ce_mask |= LINK_ATTR_NUM_TX_QUEUES; in rtnl_link_set_num_tx_queues()
2685 * @arg link Link object
2689 uint32_t rtnl_link_get_num_tx_queues(struct rtnl_link *link) in rtnl_link_get_num_tx_queues() argument
2691 return link->l_num_tx_queues; in rtnl_link_get_num_tx_queues()
2696 * @arg link Link object
2699 * Sets the number of RX queues of the link object. The value is considered
2704 * combination with rtnl_link_add() or if the link object is used as a filter.
2708 void rtnl_link_set_num_rx_queues(struct rtnl_link *link, uint32_t nqueues) in rtnl_link_set_num_rx_queues() argument
2710 link->l_num_rx_queues = nqueues; in rtnl_link_set_num_rx_queues()
2711 link->ce_mask |= LINK_ATTR_NUM_RX_QUEUES; in rtnl_link_set_num_rx_queues()
2716 * @arg link Link object
2720 uint32_t rtnl_link_get_num_rx_queues(struct rtnl_link *link) in rtnl_link_get_num_rx_queues() argument
2722 return link->l_num_rx_queues; in rtnl_link_get_num_rx_queues()
2727 * @arg link Link object
2732 int rtnl_link_get_gso_max_segs(struct rtnl_link *link, uint32_t *gso_max_segs) in rtnl_link_get_gso_max_segs() argument
2734 if (!(link->ce_mask & LINK_ATTR_GSO_MAX_SEGS)) in rtnl_link_get_gso_max_segs()
2738 *gso_max_segs = link->l_gso_max_segs; in rtnl_link_get_gso_max_segs()
2745 * @arg link Link object
2750 int rtnl_link_get_gso_max_size(struct rtnl_link *link, uint32_t *gso_max_size) in rtnl_link_get_gso_max_size() argument
2752 if (!(link->ce_mask & LINK_ATTR_GSO_MAX_SIZE)) in rtnl_link_get_gso_max_size()
2756 *gso_max_size = link->l_gso_max_size; in rtnl_link_get_gso_max_size()
2762 * Return physical port id of link object
2763 * @arg link Link object
2767 struct nl_data *rtnl_link_get_phys_port_id(struct rtnl_link *link) in rtnl_link_get_phys_port_id() argument
2769 return link->l_phys_port_id; in rtnl_link_get_phys_port_id()
2773 * Return physical port name of link object
2774 * @arg link Link object
2778 char *rtnl_link_get_phys_port_name(struct rtnl_link *link) in rtnl_link_get_phys_port_name() argument
2780 return link->l_phys_port_name; in rtnl_link_get_phys_port_name()
2784 * Return physical switch id of link object
2785 * @arg link Link object
2789 struct nl_data *rtnl_link_get_phys_switch_id(struct rtnl_link *link) in rtnl_link_get_phys_switch_id() argument
2791 return link->l_phys_switch_id; in rtnl_link_get_phys_switch_id()
2794 void rtnl_link_set_ns_fd(struct rtnl_link *link, int fd) in rtnl_link_set_ns_fd() argument
2796 link->l_ns_fd = fd; in rtnl_link_set_ns_fd()
2797 link->ce_mask |= LINK_ATTR_NS_FD; in rtnl_link_set_ns_fd()
2800 int rtnl_link_get_ns_fd(struct rtnl_link *link) in rtnl_link_get_ns_fd() argument
2802 return link->l_ns_fd; in rtnl_link_get_ns_fd()
2805 void rtnl_link_set_ns_pid(struct rtnl_link *link, pid_t pid) in rtnl_link_set_ns_pid() argument
2807 link->l_ns_pid = pid; in rtnl_link_set_ns_pid()
2808 link->ce_mask |= LINK_ATTR_NS_PID; in rtnl_link_set_ns_pid()
2811 pid_t rtnl_link_get_ns_pid(struct rtnl_link *link) in rtnl_link_get_ns_pid() argument
2813 return link->l_ns_pid; in rtnl_link_get_ns_pid()
2824 * Enslave slave link to master link
2826 * @arg master ifindex of master link
2827 * @arg slave ifindex of slave link
2838 _nl_auto_rtnl_link struct rtnl_link *link = NULL; in rtnl_link_enslave_ifindex() local
2841 if (!(link = rtnl_link_alloc())) in rtnl_link_enslave_ifindex()
2844 rtnl_link_set_ifindex(link, slave); in rtnl_link_enslave_ifindex()
2845 rtnl_link_set_master(link, master); in rtnl_link_enslave_ifindex()
2847 if ((err = rtnl_link_change(sock, link, link, 0)) < 0) in rtnl_link_enslave_ifindex()
2850 _nl_clear_pointer(&link, rtnl_link_put); in rtnl_link_enslave_ifindex()
2859 if ((err = rtnl_link_get_kernel(sock, slave, NULL, &link)) < 0) in rtnl_link_enslave_ifindex()
2862 if (rtnl_link_get_master(link) != master) in rtnl_link_enslave_ifindex()
2869 * Enslave slave link to master link
2871 * @arg master master link
2872 * @arg slave slave link
2896 * Release slave link from its master
2898 * @arg slave slave link
2913 * Release slave link from its master
2915 * @arg slave slave link
3107 int rtnl_link_has_vf_list(struct rtnl_link *link) { in rtnl_link_has_vf_list() argument
3108 if (link->ce_mask & LINK_ATTR_VF_LIST) in rtnl_link_has_vf_list()
3114 void rtnl_link_set_vf_list(struct rtnl_link *link) in rtnl_link_set_vf_list() argument
3116 if (!rtnl_link_has_vf_list(link)) in rtnl_link_set_vf_list()
3117 link->ce_mask |= LINK_ATTR_VF_LIST; in rtnl_link_set_vf_list()
3120 void rtnl_link_unset_vf_list(struct rtnl_link *link) in rtnl_link_unset_vf_list() argument
3122 if (rtnl_link_has_vf_list(link)) in rtnl_link_unset_vf_list()
3123 link->ce_mask &= ~LINK_ATTR_VF_LIST; in rtnl_link_unset_vf_list()
3135 int rtnl_link_set_info_type(struct rtnl_link *link, const char *type) in rtnl_link_set_info_type() argument
3137 return rtnl_link_set_type(link, type); in rtnl_link_set_info_type()
3143 char *rtnl_link_get_info_type(struct rtnl_link *link) in rtnl_link_get_info_type() argument
3145 return rtnl_link_get_type(link); in rtnl_link_get_info_type()
3151 void rtnl_link_set_weight(struct rtnl_link *link, unsigned int weight) in rtnl_link_set_weight() argument
3153 link->l_weight = weight; in rtnl_link_set_weight()
3154 link->ce_mask |= LINK_ATTR_WEIGHT; in rtnl_link_set_weight()
3160 unsigned int rtnl_link_get_weight(struct rtnl_link *link) in rtnl_link_get_weight() argument
3162 return link->l_weight; in rtnl_link_get_weight()
3168 .oo_name = "route/link",
3191 .co_name = "route/link",