Lines Matching full:link
3 * lib/route/link.c Links (Interfaces)
15 * @defgroup link Links (Interfaces)
18 * @route_doc{route_link, Link Documentation}
30 #include <netlink/route/link.h>
31 #include <netlink-private/route/link/api.h>
32 #include <netlink-private/route/link/sriov.h>
84 cache = __nl_cache_mngt_require("route/link"); in link_lookup()
92 static struct rtnl_link_af_ops *af_lookup_and_alloc(struct rtnl_link *link, in af_lookup_and_alloc() argument
102 if (!(data = rtnl_link_af_alloc(link, af_ops))) { in af_lookup_and_alloc()
110 static int af_free(struct rtnl_link *link, struct rtnl_link_af_ops *ops, in af_free() argument
114 ops->ao_free(link, data); in af_free()
132 static int af_clone(struct rtnl_link *link, struct rtnl_link_af_ops *ops, in af_clone() argument
144 static int af_fill(struct rtnl_link *link, struct rtnl_link_af_ops *ops, in af_fill() argument
158 if ((err = ops->ao_fill_af(link, arg, data)) < 0) in af_fill()
167 static int af_fill_pi(struct rtnl_link *link, struct rtnl_link_af_ops *ops, in af_fill_pi() argument
183 if ((err = ops->ao_fill_pi(link, arg, data)) < 0) in af_fill_pi()
191 static int af_dump_line(struct rtnl_link *link, struct rtnl_link_af_ops *ops, in af_dump_line() argument
197 ops->ao_dump[NL_DUMP_LINE](link, p, data); in af_dump_line()
202 static int af_dump_details(struct rtnl_link *link, struct rtnl_link_af_ops *ops, in af_dump_details() argument
208 ops->ao_dump[NL_DUMP_DETAILS](link, p, data); in af_dump_details()
213 static int af_dump_stats(struct rtnl_link *link, struct rtnl_link_af_ops *ops, in af_dump_stats() argument
219 ops->ao_dump[NL_DUMP_STATS](link, p, data); in af_dump_stats()
224 static int do_foreach_af(struct rtnl_link *link, in do_foreach_af() argument
232 if (link->l_af_data[i]) { in do_foreach_af()
238 err = cb(link, ops, link->l_af_data[i], arg); in do_foreach_af()
250 static void release_link_info(struct rtnl_link *link) in release_link_info() argument
252 struct rtnl_link_info_ops *io = link->l_info_ops; in release_link_info()
256 io->io_free(link); in release_link_info()
259 BUG_ON(link->l_info); in release_link_info()
262 link->l_info_ops = NULL; in release_link_info()
268 struct rtnl_link *link = nl_object_priv(c); in link_free_data() local
270 if (link) { in link_free_data()
271 release_link_info(link); in link_free_data()
274 rtnl_link_af_ops_put(link->l_af_ops); in link_free_data()
276 nl_addr_put(link->l_addr); in link_free_data()
277 nl_addr_put(link->l_bcast); in link_free_data()
279 free(link->l_ifalias); in link_free_data()
280 free(link->l_info_kind); in link_free_data()
281 free(link->l_info_slave_kind); in link_free_data()
283 do_foreach_af(link, af_free, NULL); in link_free_data()
285 nl_data_free(link->l_phys_port_id); in link_free_data()
286 nl_data_free(link->l_phys_switch_id); in link_free_data()
288 if (link->ce_mask & LINK_ATTR_VF_LIST) in link_free_data()
289 rtnl_link_sriov_free_data(link); in link_free_data()
384 int rtnl_link_info_parse(struct rtnl_link *link, struct nlattr **tb) in rtnl_link_info_parse() argument
389 nla_strlcpy(link->l_name, tb[IFLA_IFNAME], IFNAMSIZ); in rtnl_link_info_parse()
395 link->l_stats[RTNL_LINK_RX_PACKETS] = st->rx_packets; in rtnl_link_info_parse()
396 link->l_stats[RTNL_LINK_TX_PACKETS] = st->tx_packets; in rtnl_link_info_parse()
397 link->l_stats[RTNL_LINK_RX_BYTES] = st->rx_bytes; in rtnl_link_info_parse()
398 link->l_stats[RTNL_LINK_TX_BYTES] = st->tx_bytes; in rtnl_link_info_parse()
399 link->l_stats[RTNL_LINK_RX_ERRORS] = st->rx_errors; in rtnl_link_info_parse()
400 link->l_stats[RTNL_LINK_TX_ERRORS] = st->tx_errors; in rtnl_link_info_parse()
401 link->l_stats[RTNL_LINK_RX_DROPPED] = st->rx_dropped; in rtnl_link_info_parse()
402 link->l_stats[RTNL_LINK_TX_DROPPED] = st->tx_dropped; in rtnl_link_info_parse()
403 link->l_stats[RTNL_LINK_MULTICAST] = st->multicast; in rtnl_link_info_parse()
404 link->l_stats[RTNL_LINK_COLLISIONS] = st->collisions; in rtnl_link_info_parse()
406 link->l_stats[RTNL_LINK_RX_LEN_ERR] = st->rx_length_errors; in rtnl_link_info_parse()
407 link->l_stats[RTNL_LINK_RX_OVER_ERR] = st->rx_over_errors; in rtnl_link_info_parse()
408 link->l_stats[RTNL_LINK_RX_CRC_ERR] = st->rx_crc_errors; in rtnl_link_info_parse()
409 link->l_stats[RTNL_LINK_RX_FRAME_ERR] = st->rx_frame_errors; in rtnl_link_info_parse()
410 link->l_stats[RTNL_LINK_RX_FIFO_ERR] = st->rx_fifo_errors; in rtnl_link_info_parse()
411 link->l_stats[RTNL_LINK_RX_MISSED_ERR] = st->rx_missed_errors; in rtnl_link_info_parse()
413 link->l_stats[RTNL_LINK_TX_ABORT_ERR] = st->tx_aborted_errors; in rtnl_link_info_parse()
414 link->l_stats[RTNL_LINK_TX_CARRIER_ERR] = st->tx_carrier_errors; in rtnl_link_info_parse()
415 link->l_stats[RTNL_LINK_TX_FIFO_ERR] = st->tx_fifo_errors; in rtnl_link_info_parse()
416 link->l_stats[RTNL_LINK_TX_HBEAT_ERR] = st->tx_heartbeat_errors; in rtnl_link_info_parse()
417 link->l_stats[RTNL_LINK_TX_WIN_ERR] = st->tx_window_errors; in rtnl_link_info_parse()
419 link->l_stats[RTNL_LINK_RX_COMPRESSED] = st->rx_compressed; in rtnl_link_info_parse()
420 link->l_stats[RTNL_LINK_TX_COMPRESSED] = st->tx_compressed; in rtnl_link_info_parse()
426 link->l_stats[RTNL_LINK_RX_NOHANDLER] = st->rx_nohandler; in rtnl_link_info_parse()
428 link->l_stats[RTNL_LINK_RX_NOHANDLER] = 0; in rtnl_link_info_parse()
430 link->ce_mask |= LINK_ATTR_STATS; in rtnl_link_info_parse()
445 link->l_stats[RTNL_LINK_RX_PACKETS] = st.rx_packets; in rtnl_link_info_parse()
446 link->l_stats[RTNL_LINK_TX_PACKETS] = st.tx_packets; in rtnl_link_info_parse()
447 link->l_stats[RTNL_LINK_RX_BYTES] = st.rx_bytes; in rtnl_link_info_parse()
448 link->l_stats[RTNL_LINK_TX_BYTES] = st.tx_bytes; in rtnl_link_info_parse()
449 link->l_stats[RTNL_LINK_RX_ERRORS] = st.rx_errors; in rtnl_link_info_parse()
450 link->l_stats[RTNL_LINK_TX_ERRORS] = st.tx_errors; in rtnl_link_info_parse()
451 link->l_stats[RTNL_LINK_RX_DROPPED] = st.rx_dropped; in rtnl_link_info_parse()
452 link->l_stats[RTNL_LINK_TX_DROPPED] = st.tx_dropped; in rtnl_link_info_parse()
453 link->l_stats[RTNL_LINK_MULTICAST] = st.multicast; in rtnl_link_info_parse()
454 link->l_stats[RTNL_LINK_COLLISIONS] = st.collisions; in rtnl_link_info_parse()
456 link->l_stats[RTNL_LINK_RX_LEN_ERR] = st.rx_length_errors; in rtnl_link_info_parse()
457 link->l_stats[RTNL_LINK_RX_OVER_ERR] = st.rx_over_errors; in rtnl_link_info_parse()
458 link->l_stats[RTNL_LINK_RX_CRC_ERR] = st.rx_crc_errors; in rtnl_link_info_parse()
459 link->l_stats[RTNL_LINK_RX_FRAME_ERR] = st.rx_frame_errors; in rtnl_link_info_parse()
460 link->l_stats[RTNL_LINK_RX_FIFO_ERR] = st.rx_fifo_errors; in rtnl_link_info_parse()
461 link->l_stats[RTNL_LINK_RX_MISSED_ERR] = st.rx_missed_errors; in rtnl_link_info_parse()
463 link->l_stats[RTNL_LINK_TX_ABORT_ERR] = st.tx_aborted_errors; in rtnl_link_info_parse()
464 link->l_stats[RTNL_LINK_TX_CARRIER_ERR] = st.tx_carrier_errors; in rtnl_link_info_parse()
465 link->l_stats[RTNL_LINK_TX_FIFO_ERR] = st.tx_fifo_errors; in rtnl_link_info_parse()
466 link->l_stats[RTNL_LINK_TX_HBEAT_ERR] = st.tx_heartbeat_errors; in rtnl_link_info_parse()
467 link->l_stats[RTNL_LINK_TX_WIN_ERR] = st.tx_window_errors; in rtnl_link_info_parse()
469 link->l_stats[RTNL_LINK_RX_COMPRESSED] = st.rx_compressed; in rtnl_link_info_parse()
470 link->l_stats[RTNL_LINK_TX_COMPRESSED] = st.tx_compressed; in rtnl_link_info_parse()
475 link->l_stats[RTNL_LINK_RX_NOHANDLER] = st.rx_nohandler; in rtnl_link_info_parse()
477 link->ce_mask |= LINK_ATTR_STATS; in rtnl_link_info_parse()
481 link->l_txqlen = nla_get_u32(tb[IFLA_TXQLEN]); in rtnl_link_info_parse()
482 link->ce_mask |= LINK_ATTR_TXQLEN; in rtnl_link_info_parse()
486 link->l_mtu = nla_get_u32(tb[IFLA_MTU]); in rtnl_link_info_parse()
487 link->ce_mask |= LINK_ATTR_MTU; in rtnl_link_info_parse()
491 link->l_addr = nl_addr_alloc_attr(tb[IFLA_ADDRESS], AF_UNSPEC); in rtnl_link_info_parse()
492 if (link->l_addr == NULL) in rtnl_link_info_parse()
494 nl_addr_set_family(link->l_addr, in rtnl_link_info_parse()
495 nl_addr_guess_family(link->l_addr)); in rtnl_link_info_parse()
496 link->ce_mask |= LINK_ATTR_ADDR; in rtnl_link_info_parse()
500 link->l_bcast = nl_addr_alloc_attr(tb[IFLA_BROADCAST], in rtnl_link_info_parse()
502 if (link->l_bcast == NULL) in rtnl_link_info_parse()
504 nl_addr_set_family(link->l_bcast, in rtnl_link_info_parse()
505 nl_addr_guess_family(link->l_bcast)); in rtnl_link_info_parse()
506 link->ce_mask |= LINK_ATTR_BRD; in rtnl_link_info_parse()
510 link->l_link = nla_get_u32(tb[IFLA_LINK]); in rtnl_link_info_parse()
511 link->ce_mask |= LINK_ATTR_LINK; in rtnl_link_info_parse()
515 link->l_link_netnsid = nla_get_s32(tb[IFLA_LINK_NETNSID]); in rtnl_link_info_parse()
516 link->ce_mask |= LINK_ATTR_LINK_NETNSID; in rtnl_link_info_parse()
520 link->l_weight = nla_get_u32(tb[IFLA_WEIGHT]); in rtnl_link_info_parse()
521 link->ce_mask |= LINK_ATTR_WEIGHT; in rtnl_link_info_parse()
525 nla_strlcpy(link->l_qdisc, tb[IFLA_QDISC], IFQDISCSIZ); in rtnl_link_info_parse()
526 link->ce_mask |= LINK_ATTR_QDISC; in rtnl_link_info_parse()
530 nla_memcpy(&link->l_map, tb[IFLA_MAP], in rtnl_link_info_parse()
532 link->ce_mask |= LINK_ATTR_MAP; in rtnl_link_info_parse()
536 link->l_master = nla_get_u32(tb[IFLA_MASTER]); in rtnl_link_info_parse()
537 link->ce_mask |= LINK_ATTR_MASTER; in rtnl_link_info_parse()
541 link->l_carrier = nla_get_u8(tb[IFLA_CARRIER]); in rtnl_link_info_parse()
542 link->ce_mask |= LINK_ATTR_CARRIER; in rtnl_link_info_parse()
546 link->l_carrier_changes = nla_get_u32(tb[IFLA_CARRIER_CHANGES]); in rtnl_link_info_parse()
547 link->ce_mask |= LINK_ATTR_CARRIER_CHANGES; in rtnl_link_info_parse()
551 link->l_operstate = nla_get_u8(tb[IFLA_OPERSTATE]); in rtnl_link_info_parse()
552 link->ce_mask |= LINK_ATTR_OPERSTATE; in rtnl_link_info_parse()
556 link->l_linkmode = nla_get_u8(tb[IFLA_LINKMODE]); in rtnl_link_info_parse()
557 link->ce_mask |= LINK_ATTR_LINKMODE; in rtnl_link_info_parse()
561 link->l_ifalias = nla_strdup(tb[IFLA_IFALIAS]); in rtnl_link_info_parse()
562 if (link->l_ifalias == NULL) in rtnl_link_info_parse()
564 link->ce_mask |= LINK_ATTR_IFALIAS; in rtnl_link_info_parse()
568 link->l_ns_fd = nla_get_u32(tb[IFLA_NET_NS_FD]); in rtnl_link_info_parse()
569 link->ce_mask |= LINK_ATTR_NS_FD; in rtnl_link_info_parse()
573 link->l_ns_pid = nla_get_u32(tb[IFLA_NET_NS_PID]); in rtnl_link_info_parse()
574 link->ce_mask |= LINK_ATTR_NS_PID; in rtnl_link_info_parse()
583 struct rtnl_link *link; in link_msg_parser() local
593 link = rtnl_link_alloc(); in link_msg_parser()
594 if (link == NULL) { in link_msg_parser()
599 link->ce_msgtype = n->nlmsg_type; in link_msg_parser()
607 link->l_family = family = ifi->ifi_family; in link_msg_parser()
608 link->l_arptype = ifi->ifi_type; in link_msg_parser()
609 link->l_index = ifi->ifi_index; in link_msg_parser()
610 link->l_flags = ifi->ifi_flags; in link_msg_parser()
611 link->l_change = ifi->ifi_change; in link_msg_parser()
612 link->ce_mask = (LINK_ATTR_IFNAME | LINK_ATTR_FAMILY | in link_msg_parser()
616 if ((af_ops_family = af_ops = af_lookup_and_alloc(link, family))) { in link_msg_parser()
623 link->l_af_ops = af_ops; in link_msg_parser()
630 err = rtnl_link_info_parse(link, tb); in link_msg_parser()
635 link->l_num_vf = nla_get_u32(tb[IFLA_NUM_VF]); in link_msg_parser()
636 link->ce_mask |= LINK_ATTR_NUM_VF; in link_msg_parser()
637 if (link->l_num_vf && tb[IFLA_VFINFO_LIST]) { in link_msg_parser()
638 if ((err = rtnl_link_sriov_parse_vflist(link, tb)) < 0) { in link_msg_parser()
641 link->ce_mask |= LINK_ATTR_VF_LIST; in link_msg_parser()
658 err = rtnl_link_set_type(link, kind); in link_msg_parser()
663 !af_ops && (af_ops = af_lookup_and_alloc(link, af))) { in link_msg_parser()
668 link->l_family = af; in link_msg_parser()
669 link->l_af_ops = af_ops; in link_msg_parser()
673 link->l_info_ops = ops; in link_msg_parser()
678 err = ops->io_parse(link, li[IFLA_INFO_DATA], in link_msg_parser()
687 link->ce_mask |= LINK_ATTR_LINKINFO; in link_msg_parser()
693 err = rtnl_link_set_slave_type(link, kind); in link_msg_parser()
697 link->ce_mask |= LINK_ATTR_LINKINFO_SLAVE_KIND; in link_msg_parser()
702 err = af_ops->ao_parse_protinfo(link, tb[IFLA_PROTINFO], in link_msg_parser()
703 link->l_af_data[link->l_family]); in link_msg_parser()
706 link->ce_mask |= LINK_ATTR_PROTINFO; in link_msg_parser()
714 err = af_ops_family->ao_parse_af_full(link, in link_msg_parser()
716 link->l_af_data[af_ops_family->ao_family]); in link_msg_parser()
719 link->ce_mask |= LINK_ATTR_AF_SPEC; in link_msg_parser()
725 af_ops = af_lookup_and_alloc(link, nla_type(af_attr)); in link_msg_parser()
727 char *af_data = link->l_af_data[nla_type(af_attr)]; in link_msg_parser()
729 err = af_ops->ao_parse_af(link, af_attr, af_data); in link_msg_parser()
734 link->ce_mask |= LINK_ATTR_AF_SPEC; in link_msg_parser()
742 link->l_promiscuity = nla_get_u32(tb[IFLA_PROMISCUITY]); in link_msg_parser()
743 link->ce_mask |= LINK_ATTR_PROMISCUITY; in link_msg_parser()
747 link->l_num_tx_queues = nla_get_u32(tb[IFLA_NUM_TX_QUEUES]); in link_msg_parser()
748 link->ce_mask |= LINK_ATTR_NUM_TX_QUEUES; in link_msg_parser()
752 link->l_num_rx_queues = nla_get_u32(tb[IFLA_NUM_RX_QUEUES]); in link_msg_parser()
753 link->ce_mask |= LINK_ATTR_NUM_RX_QUEUES; in link_msg_parser()
757 link->l_gso_max_segs = nla_get_u32(tb[IFLA_GSO_MAX_SEGS]); in link_msg_parser()
758 link->ce_mask |= LINK_ATTR_GSO_MAX_SEGS; in link_msg_parser()
762 link->l_gso_max_size = nla_get_u32(tb[IFLA_GSO_MAX_SIZE]); in link_msg_parser()
763 link->ce_mask |= LINK_ATTR_GSO_MAX_SIZE; in link_msg_parser()
767 link->l_group = nla_get_u32(tb[IFLA_GROUP]); in link_msg_parser()
768 link->ce_mask |= LINK_ATTR_GROUP; in link_msg_parser()
772 link->l_phys_port_id = nl_data_alloc_attr(tb[IFLA_PHYS_PORT_ID]); in link_msg_parser()
773 if (link->l_phys_port_id == NULL) { in link_msg_parser()
777 link->ce_mask |= LINK_ATTR_PHYS_PORT_ID; in link_msg_parser()
781 nla_strlcpy(link->l_phys_port_name, tb[IFLA_PHYS_PORT_NAME], IFNAMSIZ); in link_msg_parser()
782 link->ce_mask |= LINK_ATTR_PHYS_PORT_NAME; in link_msg_parser()
786 link->l_phys_switch_id = nl_data_alloc_attr(tb[IFLA_PHYS_SWITCH_ID]); in link_msg_parser()
787 if (link->l_phys_switch_id == NULL) { in link_msg_parser()
791 link->ce_mask |= LINK_ATTR_PHYS_SWITCH_ID; in link_msg_parser()
794 err = pp->pp_cb((struct nl_object *) link, pp); in link_msg_parser()
797 rtnl_link_put(link); in link_msg_parser()
844 struct rtnl_link *link = (struct rtnl_link *) obj; in link_dump_line() local
848 cache = nl_cache_mngt_require_safe("route/link"); in link_dump_line()
852 if (link->l_family != AF_UNSPEC) in link_dump_line()
853 nl_dump_line(p, "%s ", nl_af2str(link->l_family, buf, sizeof(buf))); in link_dump_line()
855 nl_dump_line(p, "%s %s ", link->l_name, in link_dump_line()
856 nl_llproto2str(link->l_arptype, buf, sizeof(buf))); in link_dump_line()
858 if (link->l_addr && !nl_addr_iszero(link->l_addr)) in link_dump_line()
859 nl_dump(p, "%s ", nl_addr2str(link->l_addr, buf, sizeof(buf))); in link_dump_line()
861 if (link->ce_mask & LINK_ATTR_MASTER) { in link_dump_line()
863 struct rtnl_link *master = rtnl_link_get(cache, link->l_master); in link_dump_line()
868 nl_dump(p, "master %d ", link->l_master); in link_dump_line()
871 rtnl_link_flags2str(link->l_flags, buf, sizeof(buf)); in link_dump_line()
875 if (link->ce_mask & LINK_ATTR_LINK) { in link_dump_line()
877 && !(link->ce_mask & LINK_ATTR_LINK_NETNSID)) { in link_dump_line()
878 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
1411 * Get a link object directly from kernel
1414 * @arg name Name of link
1415 * @arg result Pointer to store resulting link object
1418 * a specific link directly from the kernel. The returned answer is
1420 * pointer or -NLE_OBJ_NOTFOUND is returned if no matching link was
1428 * @route_doc{link_direct_lookup, Lookup Single Link (Direct Lookup)}
1460 /* We have used link_msg_parser(), object is definitely a link */ in rtnl_link_get_kernel()
1471 * Translate interface index to corresponding link name
1472 * @arg cache Link cache
1478 * link name and stores the name in the destination string.
1480 * @route_doc{link_translate_ifindex, Translating interface index to link name}
1482 * @return Name of link or NULL if no match was found.
1487 struct rtnl_link *link = rtnl_link_get(cache, ifindex); in rtnl_link_i2name() local
1489 if (link) { in rtnl_link_i2name()
1490 strncpy(dst, link->l_name, len - 1); in rtnl_link_i2name()
1491 rtnl_link_put(link); in rtnl_link_i2name()
1499 * Translate link name to corresponding interface index
1500 * @arg cache Link cache
1501 * @arg name Name of link
1503 * @route_doc{link_translate_ifindex, Translating interface index to link name}
1510 struct rtnl_link *link; in rtnl_link_name2i() local
1512 link = rtnl_link_get_by_name(cache, name); in rtnl_link_name2i()
1513 if (link) { in rtnl_link_name2i()
1514 ifindex = link->l_index; in rtnl_link_name2i()
1515 rtnl_link_put(link); in rtnl_link_name2i()
1523 int rtnl_link_fill_info(struct nl_msg *msg, struct rtnl_link *link) in rtnl_link_fill_info() argument
1525 if (link->ce_mask & LINK_ATTR_ADDR) in rtnl_link_fill_info()
1526 NLA_PUT_ADDR(msg, IFLA_ADDRESS, link->l_addr); in rtnl_link_fill_info()
1528 if (link->ce_mask & LINK_ATTR_BRD) in rtnl_link_fill_info()
1529 NLA_PUT_ADDR(msg, IFLA_BROADCAST, link->l_bcast); in rtnl_link_fill_info()
1531 if (link->ce_mask & LINK_ATTR_MTU) in rtnl_link_fill_info()
1532 NLA_PUT_U32(msg, IFLA_MTU, link->l_mtu); in rtnl_link_fill_info()
1534 if (link->ce_mask & LINK_ATTR_TXQLEN) in rtnl_link_fill_info()
1535 NLA_PUT_U32(msg, IFLA_TXQLEN, link->l_txqlen); in rtnl_link_fill_info()
1537 if (link->ce_mask & LINK_ATTR_WEIGHT) in rtnl_link_fill_info()
1538 NLA_PUT_U32(msg, IFLA_WEIGHT, link->l_weight); in rtnl_link_fill_info()
1540 if (link->ce_mask & LINK_ATTR_IFNAME) in rtnl_link_fill_info()
1541 NLA_PUT_STRING(msg, IFLA_IFNAME, link->l_name); in rtnl_link_fill_info()
1543 if (link->ce_mask & LINK_ATTR_OPERSTATE) in rtnl_link_fill_info()
1544 NLA_PUT_U8(msg, IFLA_OPERSTATE, link->l_operstate); in rtnl_link_fill_info()
1546 if (link->ce_mask & LINK_ATTR_CARRIER) in rtnl_link_fill_info()
1547 NLA_PUT_U8(msg, IFLA_CARRIER, link->l_carrier); in rtnl_link_fill_info()
1549 if (link->ce_mask & LINK_ATTR_LINKMODE) in rtnl_link_fill_info()
1550 NLA_PUT_U8(msg, IFLA_LINKMODE, link->l_linkmode); in rtnl_link_fill_info()
1552 if (link->ce_mask & LINK_ATTR_IFALIAS) in rtnl_link_fill_info()
1553 NLA_PUT_STRING(msg, IFLA_IFALIAS, link->l_ifalias); in rtnl_link_fill_info()
1555 if (link->ce_mask & LINK_ATTR_LINK) in rtnl_link_fill_info()
1556 NLA_PUT_U32(msg, IFLA_LINK, link->l_link); in rtnl_link_fill_info()
1558 if (link->ce_mask & LINK_ATTR_LINK_NETNSID) in rtnl_link_fill_info()
1559 NLA_PUT_S32(msg, IFLA_LINK_NETNSID, link->l_link_netnsid); in rtnl_link_fill_info()
1561 if (link->ce_mask & LINK_ATTR_MASTER) in rtnl_link_fill_info()
1562 NLA_PUT_U32(msg, IFLA_MASTER, link->l_master); in rtnl_link_fill_info()
1564 if (link->ce_mask & LINK_ATTR_NUM_TX_QUEUES) in rtnl_link_fill_info()
1565 NLA_PUT_U32(msg, IFLA_NUM_TX_QUEUES, link->l_num_tx_queues); in rtnl_link_fill_info()
1567 if (link->ce_mask & LINK_ATTR_NUM_RX_QUEUES) in rtnl_link_fill_info()
1568 NLA_PUT_U32(msg, IFLA_NUM_RX_QUEUES, link->l_num_rx_queues); in rtnl_link_fill_info()
1570 if (link->ce_mask & LINK_ATTR_NS_FD) in rtnl_link_fill_info()
1571 NLA_PUT_U32(msg, IFLA_NET_NS_FD, link->l_ns_fd); in rtnl_link_fill_info()
1573 if (link->ce_mask & LINK_ATTR_NS_PID) in rtnl_link_fill_info()
1574 NLA_PUT_U32(msg, IFLA_NET_NS_PID, link->l_ns_pid); in rtnl_link_fill_info()
1583 struct rtnl_link *link, int flags, struct nl_msg **result) in build_link_msg() argument
1595 if (rtnl_link_fill_info(msg, link)) in build_link_msg()
1598 if (link->ce_mask & LINK_ATTR_GROUP) in build_link_msg()
1599 NLA_PUT_U32(msg, IFLA_GROUP, link->l_group); in build_link_msg()
1601 if (link->ce_mask & (LINK_ATTR_LINKINFO|LINK_ATTR_LINKINFO_SLAVE_KIND)) { in build_link_msg()
1607 if (link->ce_mask & LINK_ATTR_LINKINFO) { in build_link_msg()
1608 NLA_PUT_STRING(msg, IFLA_INFO_KIND, link->l_info_kind); in build_link_msg()
1610 if (link->l_info_ops) { in build_link_msg()
1611 if (link->l_info_ops->io_put_attrs && in build_link_msg()
1612 link->l_info_ops->io_put_attrs(msg, link) < 0) in build_link_msg()
1617 if (link->ce_mask & LINK_ATTR_LINKINFO_SLAVE_KIND) { in build_link_msg()
1618 NLA_PUT_STRING(msg, IFLA_INFO_SLAVE_KIND, link->l_info_slave_kind); in build_link_msg()
1624 if (link->ce_mask & LINK_ATTR_VF_LIST) { in build_link_msg()
1625 if (rtnl_link_sriov_fill_vflist(msg, link) < 0) in build_link_msg()
1629 if (do_foreach_af(link, af_fill_pi, msg) < 0) in build_link_msg()
1635 if (do_foreach_af(link, af_fill, msg) < 0) in build_link_msg()
1654 * Build a netlink message requesting the addition of new virtual link
1655 * @arg link new link to add
1669 int rtnl_link_build_add_request(struct rtnl_link *link, int flags, in rtnl_link_build_add_request() argument
1673 .ifi_family = link->l_family, in rtnl_link_build_add_request()
1674 .ifi_index = link->l_index, in rtnl_link_build_add_request()
1675 .ifi_flags = link->l_flags, in rtnl_link_build_add_request()
1676 .ifi_change = link->l_flag_mask, in rtnl_link_build_add_request()
1679 return build_link_msg(RTM_NEWLINK, &ifi, link, flags, result); in rtnl_link_build_add_request()
1683 * Add virtual link
1685 * @arg link new link to add
1689 * a new virtual link.
1699 int rtnl_link_add(struct nl_sock *sk, struct rtnl_link *link, int flags) in rtnl_link_add() argument
1704 err = rtnl_link_build_add_request(link, flags, &msg); in rtnl_link_add()
1712 * Build a netlink message requesting the modification of link
1713 * @arg orig original link to change
1714 * @arg changes link containing the changes to be made
1726 * to RTM_SETLINK (does not allow changing link info attributes) to
1748 APPBUG("link change: family is immutable"); in rtnl_link_build_change_request()
1771 * Change link
1773 * @arg orig original link to be changed
1774 * @arg changes link containing the changes to be made
1778 * a network link. If -EOPNOTSUPP is returned by the kernel, the
1782 * The link to be changed is looked up based on the interface index
1783 * supplied in the \p orig link. Optionaly the link name is used but
1785 * link name will result in the link name being changed.
1787 * If no matching link exists, the function will return
1796 * @note The link name can only be changed if the link has been put
1841 * Build a netlink message requesting the deletion of a link
1842 * @arg link Link to delete
1853 int rtnl_link_build_delete_request(const struct rtnl_link *link, in rtnl_link_build_delete_request() argument
1858 .ifi_index = link->l_index, in rtnl_link_build_delete_request()
1861 if (!(link->ce_mask & (LINK_ATTR_IFINDEX | LINK_ATTR_IFNAME))) { in rtnl_link_build_delete_request()
1872 if (link->ce_mask & LINK_ATTR_IFNAME) in rtnl_link_build_delete_request()
1873 NLA_PUT_STRING(msg, IFLA_IFNAME, link->l_name); in rtnl_link_build_delete_request()
1884 * Delete link
1886 * @arg link Link to delete
1889 * a network link which has been previously added to the kernel and
1892 * If no matching link exists, the function will return
1907 int rtnl_link_delete(struct nl_sock *sk, const struct rtnl_link *link) in rtnl_link_delete() argument
1912 if ((err = rtnl_link_build_delete_request(link, &msg)) < 0) in rtnl_link_delete()
1921 * @name Link Object
1926 * Allocate link object
1929 * @return New link object or NULL if allocation failed
1937 * Return a link object reference
1938 * @arg link Link object
1940 void rtnl_link_put(struct rtnl_link *link) in rtnl_link_put() argument
1942 nl_object_put((struct nl_object *) link); in rtnl_link_put()
1946 * Set name of link object
1947 * @arg link Link object
1950 * @note To change the name of a link in the kernel, set the interface
1951 * index to the link you wish to change, modify the link name using
1952 * this function and pass the link object to rtnl_link_change() or
1955 * @route_doc{link_attr_name, Link Name}
1959 void rtnl_link_set_name(struct rtnl_link *link, const char *name) in rtnl_link_set_name() argument
1961 strncpy(link->l_name, name, sizeof(link->l_name) - 1); in rtnl_link_set_name()
1962 link->ce_mask |= LINK_ATTR_IFNAME; in rtnl_link_set_name()
1966 * Return name of link object
1967 * @arg link Link object
1969 * @route_doc{link_attr_name, Link Name}
1971 * @return Link name or NULL if name is not specified
1973 char *rtnl_link_get_name(struct rtnl_link *link) in rtnl_link_get_name() argument
1975 return link->ce_mask & LINK_ATTR_IFNAME ? link->l_name : NULL; in rtnl_link_get_name()
1979 * Set the group identifier of a link object
1980 * @arg link Link object
1983 void rtnl_link_set_group(struct rtnl_link *link, uint32_t group) in rtnl_link_set_group() argument
1985 link->l_group = group; in rtnl_link_set_group()
1986 link->ce_mask |= LINK_ATTR_GROUP; in rtnl_link_set_group()
1990 * Return the group identifier of link object
1991 * @arg link Link object
1995 uint32_t rtnl_link_get_group(struct rtnl_link *link) in rtnl_link_get_group() argument
1997 return link->l_group; in rtnl_link_get_group()
2000 static inline void __assign_addr(struct rtnl_link *link, struct nl_addr **pos, in __assign_addr() argument
2009 link->ce_mask |= flag; in __assign_addr()
2013 * Set link layer address of link object
2014 * @arg link Link object
2015 * @arg addr New link layer address
2018 * and overwrites any existing link layer address previously assigned.
2020 * @route_doc{link_attr_address, Link layer address}
2023 void rtnl_link_set_addr(struct rtnl_link *link, struct nl_addr *addr) in rtnl_link_set_addr() argument
2025 __assign_addr(link, &link->l_addr, addr, LINK_ATTR_ADDR); in rtnl_link_set_addr()
2029 * Return link layer address of link object
2030 * @arg link Link object
2033 * @route_doc{link_attr_address, Link Layer Address}
2035 * @return Link layer address or NULL if not set.
2037 struct nl_addr *rtnl_link_get_addr(struct rtnl_link *link) in rtnl_link_get_addr() argument
2039 return link->ce_mask & LINK_ATTR_ADDR ? link->l_addr : NULL; in rtnl_link_get_addr()
2043 * Set link layer broadcast address of link object
2044 * @arg link Link object
2048 * and overwrites any existing link layer broadcast address previously
2051 * @route_doc{link_attr_broadcast, Link Layer Broadcast Address}
2054 void rtnl_link_set_broadcast(struct rtnl_link *link, struct nl_addr *addr) in rtnl_link_set_broadcast() argument
2056 __assign_addr(link, &link->l_bcast, addr, LINK_ATTR_BRD); in rtnl_link_set_broadcast()
2060 * Return link layer broadcast address of link object
2061 * @arg link Link object
2064 * @route_doc{link_attr_address, Link Layer Address}
2066 * @return Link layer address or NULL if not set.
2068 struct nl_addr *rtnl_link_get_broadcast(struct rtnl_link *link) in rtnl_link_get_broadcast() argument
2070 return link->ce_mask & LINK_ATTR_BRD ? link->l_bcast : NULL; in rtnl_link_get_broadcast()
2074 * Set flags of link object
2075 * @arg link Link object
2081 void rtnl_link_set_flags(struct rtnl_link *link, unsigned int flags) in rtnl_link_set_flags() argument
2083 link->l_flag_mask |= flags; in rtnl_link_set_flags()
2084 link->l_flags |= flags; in rtnl_link_set_flags()
2085 link->ce_mask |= LINK_ATTR_FLAGS; in rtnl_link_set_flags()
2089 * Unset flags of link object
2090 * @arg link Link object
2096 void rtnl_link_unset_flags(struct rtnl_link *link, unsigned int flags) in rtnl_link_unset_flags() argument
2098 link->l_flag_mask |= flags; in rtnl_link_unset_flags()
2099 link->l_flags &= ~flags; in rtnl_link_unset_flags()
2100 link->ce_mask |= LINK_ATTR_FLAGS; in rtnl_link_unset_flags()
2104 * Return flags of link object
2105 * @arg link Link object
2107 * @route_doc{link_attr_flags, Link Flags}
2110 * @return Link flags or 0 if none have been set.
2112 unsigned int rtnl_link_get_flags(struct rtnl_link *link) in rtnl_link_get_flags() argument
2114 return link->l_flags; in rtnl_link_get_flags()
2118 * Set address family of link object
2122 void rtnl_link_set_family(struct rtnl_link *link, int family) in rtnl_link_set_family() argument
2124 link->l_family = family; in rtnl_link_set_family()
2125 link->ce_mask |= LINK_ATTR_FAMILY; in rtnl_link_set_family()
2127 if (link->l_af_ops) { in rtnl_link_set_family()
2128 af_free(link, link->l_af_ops, in rtnl_link_set_family()
2129 link->l_af_data[link->l_af_ops->ao_family], NULL); in rtnl_link_set_family()
2130 link->l_af_data[link->l_af_ops->ao_family] = NULL; in rtnl_link_set_family()
2133 link->l_af_ops = af_lookup_and_alloc(link, family); in rtnl_link_set_family()
2137 * Return address family of link object
2138 * @arg link Link object
2143 int rtnl_link_get_family(struct rtnl_link *link) in rtnl_link_get_family() argument
2145 return link->ce_mask & LINK_ATTR_FAMILY ? link->l_family : AF_UNSPEC; in rtnl_link_get_family()
2149 * Set hardware type of link object
2150 * @arg link Link object
2157 void rtnl_link_set_arptype(struct rtnl_link *link, unsigned int arptype) in rtnl_link_set_arptype() argument
2159 link->l_arptype = arptype; in rtnl_link_set_arptype()
2160 link->ce_mask |= LINK_ATTR_ARPTYPE; in rtnl_link_set_arptype()
2164 * Get hardware type of link object
2165 * @arg link Link object
2171 unsigned int rtnl_link_get_arptype(struct rtnl_link *link) in rtnl_link_get_arptype() argument
2173 if (link->ce_mask & LINK_ATTR_ARPTYPE) in rtnl_link_get_arptype()
2174 return link->l_arptype; in rtnl_link_get_arptype()
2180 * Set interface index of link object
2181 * @arg link Link object
2187 void rtnl_link_set_ifindex(struct rtnl_link *link, int ifindex) in rtnl_link_set_ifindex() argument
2189 link->l_index = ifindex; in rtnl_link_set_ifindex()
2190 link->ce_mask |= LINK_ATTR_IFINDEX; in rtnl_link_set_ifindex()
2195 * Return interface index of link object
2196 * @arg link Link object
2202 int rtnl_link_get_ifindex(struct rtnl_link *link) in rtnl_link_get_ifindex() argument
2204 return link->l_index; in rtnl_link_get_ifindex()
2208 * Set Maximum Transmission Unit of link object
2209 * @arg link Link object
2215 void rtnl_link_set_mtu(struct rtnl_link *link, unsigned int mtu) in rtnl_link_set_mtu() argument
2217 link->l_mtu = mtu; in rtnl_link_set_mtu()
2218 link->ce_mask |= LINK_ATTR_MTU; in rtnl_link_set_mtu()
2222 * Return maximum transmission unit of link object
2223 * @arg link Link object
2229 unsigned int rtnl_link_get_mtu(struct rtnl_link *link) in rtnl_link_get_mtu() argument
2231 return link->l_mtu; in rtnl_link_get_mtu()
2236 * @arg link Link object
2239 * The unit is dependant on the link type. The most common units is number
2244 void rtnl_link_set_txqlen(struct rtnl_link *link, unsigned int txqlen) in rtnl_link_set_txqlen() argument
2246 link->l_txqlen = txqlen; in rtnl_link_set_txqlen()
2247 link->ce_mask |= LINK_ATTR_TXQLEN; in rtnl_link_set_txqlen()
2252 * @arg link Link object
2254 * The unit is dependant on the link type. The most common units is number
2260 unsigned int rtnl_link_get_txqlen(struct rtnl_link *link) in rtnl_link_get_txqlen() argument
2262 return link->ce_mask & LINK_ATTR_TXQLEN ? link->l_txqlen : 0; in rtnl_link_get_txqlen()
2265 void rtnl_link_set_link(struct rtnl_link *link, int ifindex) in rtnl_link_set_link() argument
2267 link->l_link = ifindex; in rtnl_link_set_link()
2268 link->ce_mask |= LINK_ATTR_LINK; in rtnl_link_set_link()
2271 int rtnl_link_get_link(struct rtnl_link *link) in rtnl_link_get_link() argument
2273 return link->l_link; in rtnl_link_get_link()
2277 * Set the netnsid of the link
2278 * @arg link Link object
2281 * Sets the IFLA_LINK_NETNSID attribute of the link
2284 int rtnl_link_set_link_netnsid(struct rtnl_link *link, int32_t link_netnsid) in rtnl_link_set_link_netnsid() argument
2286 link->l_link_netnsid = link_netnsid; in rtnl_link_set_link_netnsid()
2287 link->ce_mask |= LINK_ATTR_LINK_NETNSID; in rtnl_link_set_link_netnsid()
2292 * Get the netnsid of the link
2293 * @arg link Link object
2296 * Gets the IFLA_LINK_NETNSID attribute of the link
2301 int rtnl_link_get_link_netnsid(const struct rtnl_link *link, int32_t *out_link_netnsid) in rtnl_link_get_link_netnsid() argument
2303 if (!(link->ce_mask & LINK_ATTR_LINK_NETNSID)) in rtnl_link_get_link_netnsid()
2306 *out_link_netnsid = link->l_link_netnsid; in rtnl_link_get_link_netnsid()
2311 * Set master link of link object
2312 * @arg link Link object
2313 * @arg ifindex Interface index of master link
2317 void rtnl_link_set_master(struct rtnl_link *link, int ifindex) in rtnl_link_set_master() argument
2319 link->l_master = ifindex; in rtnl_link_set_master()
2320 link->ce_mask |= LINK_ATTR_MASTER; in rtnl_link_set_master()
2324 * Return master link of link object
2325 * @arg link Link object
2328 * @return Interface index of master link or 0 if not specified
2330 int rtnl_link_get_master(struct rtnl_link *link) in rtnl_link_get_master() argument
2332 return link->l_master; in rtnl_link_get_master()
2336 * Set carrier of link object
2337 * @arg link Link object
2342 void rtnl_link_set_carrier(struct rtnl_link *link, uint8_t status) in rtnl_link_set_carrier() argument
2344 link->l_carrier = status; in rtnl_link_set_carrier()
2345 link->ce_mask |= LINK_ATTR_CARRIER; in rtnl_link_set_carrier()
2349 * Return carrier status of link object
2350 * @arg link Link object
2355 uint8_t rtnl_link_get_carrier(struct rtnl_link *link) in rtnl_link_get_carrier() argument
2357 return link->l_carrier; in rtnl_link_get_carrier()
2361 * Return carrier on/off changes of link object
2362 * @arg link Link object
2367 int rtnl_link_get_carrier_changes(struct rtnl_link *link, uint32_t *carrier_changes) in rtnl_link_get_carrier_changes() argument
2369 if (!(link->ce_mask & LINK_ATTR_CARRIER_CHANGES)) in rtnl_link_get_carrier_changes()
2373 *carrier_changes = link->l_carrier_changes; in rtnl_link_get_carrier_changes()
2379 * Set operational status of link object
2380 * @arg link Link object
2386 void rtnl_link_set_operstate(struct rtnl_link *link, uint8_t status) in rtnl_link_set_operstate() argument
2388 link->l_operstate = status; in rtnl_link_set_operstate()
2389 link->ce_mask |= LINK_ATTR_OPERSTATE; in rtnl_link_set_operstate()
2393 * Return operational status of link object
2394 * @arg link Link object
2400 uint8_t rtnl_link_get_operstate(struct rtnl_link *link) in rtnl_link_get_operstate() argument
2402 return link->l_operstate; in rtnl_link_get_operstate()
2406 * Set link mode of link object
2407 * @arg link Link object
2408 * @arg mode New link mode
2413 void rtnl_link_set_linkmode(struct rtnl_link *link, uint8_t mode) in rtnl_link_set_linkmode() argument
2415 link->l_linkmode = mode; in rtnl_link_set_linkmode()
2416 link->ce_mask |= LINK_ATTR_LINKMODE; in rtnl_link_set_linkmode()
2420 * Return link mode of link object
2421 * @arg link Link object
2425 * @return Link mode or \c IF_LINK_MODE_DEFAULT
2427 uint8_t rtnl_link_get_linkmode(struct rtnl_link *link) in rtnl_link_get_linkmode() argument
2429 return link->l_linkmode; in rtnl_link_get_linkmode()
2433 * Return alias name of link object (SNMP IfAlias)
2434 * @arg link Link object
2440 const char *rtnl_link_get_ifalias(struct rtnl_link *link) in rtnl_link_get_ifalias() argument
2442 return link->l_ifalias; in rtnl_link_get_ifalias()
2446 * Set alias name of link object (SNMP IfAlias)
2447 * @arg link Link object
2450 * Sets the alias name of the link to the specified name. The alias
2457 void rtnl_link_set_ifalias(struct rtnl_link *link, const char *alias) in rtnl_link_set_ifalias() argument
2459 free(link->l_ifalias); in rtnl_link_set_ifalias()
2462 link->l_ifalias = strdup(alias); in rtnl_link_set_ifalias()
2463 link->ce_mask |= LINK_ATTR_IFALIAS; in rtnl_link_set_ifalias()
2465 link->l_ifalias = NULL; in rtnl_link_set_ifalias()
2466 link->ce_mask &= ~LINK_ATTR_IFALIAS; in rtnl_link_set_ifalias()
2471 * Set queueing discipline name of link object
2472 * @arg link Link object
2477 * For more information on how to modify the qdisc of a link, see section
2483 void rtnl_link_set_qdisc(struct rtnl_link *link, const char *name) in rtnl_link_set_qdisc() argument
2485 strncpy(link->l_qdisc, name, sizeof(link->l_qdisc) - 1); in rtnl_link_set_qdisc()
2486 link->ce_mask |= LINK_ATTR_QDISC; in rtnl_link_set_qdisc()
2490 * Return name of queueing discipline of link object
2491 * @arg link Link object
2497 char *rtnl_link_get_qdisc(struct rtnl_link *link) in rtnl_link_get_qdisc() argument
2499 return link->ce_mask & LINK_ATTR_QDISC ? link->l_qdisc : NULL; in rtnl_link_get_qdisc()
2504 * Return number of PCI virtual functions of link object
2505 * @arg link Link object
2510 int rtnl_link_get_num_vf(struct rtnl_link *link, uint32_t *num_vf) in rtnl_link_get_num_vf() argument
2512 if (link->ce_mask & LINK_ATTR_NUM_VF) { in rtnl_link_get_num_vf()
2513 *num_vf = link->l_num_vf; in rtnl_link_get_num_vf()
2520 * Return value of link statistics counter
2521 * @arg link Link object
2526 uint64_t rtnl_link_get_stat(struct rtnl_link *link, rtnl_link_stat_id_t id) in rtnl_link_get_stat() argument
2531 return link->l_stats[id]; in rtnl_link_get_stat()
2535 * Set value of link statistics counter
2536 * @arg link Link object
2545 int rtnl_link_set_stat(struct rtnl_link *link, rtnl_link_stat_id_t id, in rtnl_link_set_stat() argument
2551 link->l_stats[id] = value; in rtnl_link_set_stat()
2557 * Set type of link object
2558 * @arg link Link object
2559 * @arg type Name of link type
2561 * Looks up the link type module and prepares the link to store type
2563 * be released with all link type specific attributes lost.
2565 * @route_doc{link_modules, Link Modules}
2568 int rtnl_link_set_type(struct rtnl_link *link, const char *type) in rtnl_link_set_type() argument
2574 free(link->l_info_kind); in rtnl_link_set_type()
2575 link->ce_mask &= ~LINK_ATTR_LINKINFO; in rtnl_link_set_type()
2576 release_link_info(link); in rtnl_link_set_type()
2587 if (io->io_alloc && (err = io->io_alloc(link)) < 0) in rtnl_link_set_type()
2590 link->l_info_ops = io; in rtnl_link_set_type()
2593 link->l_info_kind = kind; in rtnl_link_set_type()
2594 link->ce_mask |= LINK_ATTR_LINKINFO; in rtnl_link_set_type()
2604 * Return type of link
2605 * @arg link Link object
2607 * @route_doc{link_modules, Link Modules}
2608 * @return Name of link type or NULL if not specified.
2610 char *rtnl_link_get_type(struct rtnl_link *link) in rtnl_link_get_type() argument
2612 return link->l_info_kind; in rtnl_link_get_type()
2616 * Set type of slave link object
2617 * @arg link Link object (slave)
2618 * @arg type Name of link type
2622 * @route_doc{link_modules, Link Modules}
2625 int rtnl_link_set_slave_type(struct rtnl_link *link, const char *type) in rtnl_link_set_slave_type() argument
2635 free(link->l_info_slave_kind); in rtnl_link_set_slave_type()
2636 link->l_info_slave_kind = kind; in rtnl_link_set_slave_type()
2639 link->ce_mask |= LINK_ATTR_LINKINFO_SLAVE_KIND; in rtnl_link_set_slave_type()
2641 link->ce_mask &= ~LINK_ATTR_LINKINFO_SLAVE_KIND; in rtnl_link_set_slave_type()
2646 * Return type of enslaved link
2647 * @arg link Link object
2649 * @route_doc{link_modules, Link Modules}
2650 * @return Name of enslaved link type or NULL if not specified.
2652 const char *rtnl_link_get_slave_type(const struct rtnl_link *link) in rtnl_link_get_slave_type() argument
2654 return link->l_info_slave_kind; in rtnl_link_get_slave_type()
2659 * Set link promiscuity count
2660 * @arg link Link object
2667 void rtnl_link_set_promiscuity(struct rtnl_link *link, uint32_t count) in rtnl_link_set_promiscuity() argument
2669 link->l_promiscuity = count; in rtnl_link_set_promiscuity()
2670 link->ce_mask |= LINK_ATTR_PROMISCUITY; in rtnl_link_set_promiscuity()
2674 * Return link promiscuity count
2675 * @arg link Link object
2678 * @return Link promiscuity count or 0
2680 uint32_t rtnl_link_get_promiscuity(struct rtnl_link *link) in rtnl_link_get_promiscuity() argument
2682 return link->l_promiscuity; in rtnl_link_get_promiscuity()
2687 * @arg link Link object
2690 * Sets the number of TX queues of the link object. The value is considered
2695 * combination with rtnl_link_add() or if the link object is used as a filter.
2699 void rtnl_link_set_num_tx_queues(struct rtnl_link *link, uint32_t nqueues) in rtnl_link_set_num_tx_queues() argument
2701 link->l_num_tx_queues = nqueues; in rtnl_link_set_num_tx_queues()
2702 link->ce_mask |= LINK_ATTR_NUM_TX_QUEUES; in rtnl_link_set_num_tx_queues()
2707 * @arg link Link object
2711 uint32_t rtnl_link_get_num_tx_queues(struct rtnl_link *link) in rtnl_link_get_num_tx_queues() argument
2713 return link->l_num_tx_queues; in rtnl_link_get_num_tx_queues()
2718 * @arg link Link object
2721 * Sets the number of RX queues of the link object. The value is considered
2726 * combination with rtnl_link_add() or if the link object is used as a filter.
2730 void rtnl_link_set_num_rx_queues(struct rtnl_link *link, uint32_t nqueues) in rtnl_link_set_num_rx_queues() argument
2732 link->l_num_rx_queues = nqueues; in rtnl_link_set_num_rx_queues()
2733 link->ce_mask |= LINK_ATTR_NUM_RX_QUEUES; in rtnl_link_set_num_rx_queues()
2738 * @arg link Link object
2742 uint32_t rtnl_link_get_num_rx_queues(struct rtnl_link *link) in rtnl_link_get_num_rx_queues() argument
2744 return link->l_num_rx_queues; in rtnl_link_get_num_rx_queues()
2749 * @arg link Link object
2754 int rtnl_link_get_gso_max_segs(struct rtnl_link *link, uint32_t *gso_max_segs) in rtnl_link_get_gso_max_segs() argument
2756 if (!(link->ce_mask & LINK_ATTR_GSO_MAX_SEGS)) in rtnl_link_get_gso_max_segs()
2760 *gso_max_segs = link->l_gso_max_segs; in rtnl_link_get_gso_max_segs()
2767 * @arg link Link object
2772 int rtnl_link_get_gso_max_size(struct rtnl_link *link, uint32_t *gso_max_size) in rtnl_link_get_gso_max_size() argument
2774 if (!(link->ce_mask & LINK_ATTR_GSO_MAX_SIZE)) in rtnl_link_get_gso_max_size()
2778 *gso_max_size = link->l_gso_max_size; in rtnl_link_get_gso_max_size()
2784 * Return physical port id of link object
2785 * @arg link Link object
2789 struct nl_data *rtnl_link_get_phys_port_id(struct rtnl_link *link) in rtnl_link_get_phys_port_id() argument
2791 return link->l_phys_port_id; in rtnl_link_get_phys_port_id()
2795 * Return physical port name of link object
2796 * @arg link Link object
2800 char *rtnl_link_get_phys_port_name(struct rtnl_link *link) in rtnl_link_get_phys_port_name() argument
2802 return link->l_phys_port_name; in rtnl_link_get_phys_port_name()
2806 * Return physical switch id of link object
2807 * @arg link Link object
2811 struct nl_data *rtnl_link_get_phys_switch_id(struct rtnl_link *link) in rtnl_link_get_phys_switch_id() argument
2813 return link->l_phys_switch_id; in rtnl_link_get_phys_switch_id()
2816 void rtnl_link_set_ns_fd(struct rtnl_link *link, int fd) in rtnl_link_set_ns_fd() argument
2818 link->l_ns_fd = fd; in rtnl_link_set_ns_fd()
2819 link->ce_mask |= LINK_ATTR_NS_FD; in rtnl_link_set_ns_fd()
2822 int rtnl_link_get_ns_fd(struct rtnl_link *link) in rtnl_link_get_ns_fd() argument
2824 return link->l_ns_fd; in rtnl_link_get_ns_fd()
2827 void rtnl_link_set_ns_pid(struct rtnl_link *link, pid_t pid) in rtnl_link_set_ns_pid() argument
2829 link->l_ns_pid = pid; in rtnl_link_set_ns_pid()
2830 link->ce_mask |= LINK_ATTR_NS_PID; in rtnl_link_set_ns_pid()
2833 pid_t rtnl_link_get_ns_pid(struct rtnl_link *link) in rtnl_link_get_ns_pid() argument
2835 return link->l_ns_pid; in rtnl_link_get_ns_pid()
2846 * Enslave slave link to master link
2848 * @arg master ifindex of master link
2849 * @arg slave ifindex of slave link
2860 struct rtnl_link *link; in rtnl_link_enslave_ifindex() local
2863 if (!(link = rtnl_link_alloc())) in rtnl_link_enslave_ifindex()
2866 rtnl_link_set_ifindex(link, slave); in rtnl_link_enslave_ifindex()
2867 rtnl_link_set_master(link, master); in rtnl_link_enslave_ifindex()
2869 if ((err = rtnl_link_change(sock, link, link, 0)) < 0) in rtnl_link_enslave_ifindex()
2872 rtnl_link_put(link); in rtnl_link_enslave_ifindex()
2881 if ((err = rtnl_link_get_kernel(sock, slave, NULL, &link)) < 0) in rtnl_link_enslave_ifindex()
2884 if (rtnl_link_get_master(link) != master) in rtnl_link_enslave_ifindex()
2888 rtnl_link_put(link); in rtnl_link_enslave_ifindex()
2894 * Enslave slave link to master link
2896 * @arg master master link
2897 * @arg slave slave link
2921 * Release slave link from its master
2923 * @arg slave slave link
2938 * Release slave link from its master
2940 * @arg slave slave link
3131 int rtnl_link_has_vf_list(struct rtnl_link *link) { in rtnl_link_has_vf_list() argument
3132 if (link->ce_mask & LINK_ATTR_VF_LIST) in rtnl_link_has_vf_list()
3138 void rtnl_link_set_vf_list(struct rtnl_link *link) { in rtnl_link_set_vf_list() argument
3141 if (!(err = rtnl_link_has_vf_list(link))) in rtnl_link_set_vf_list()
3142 link->ce_mask |= LINK_ATTR_VF_LIST; in rtnl_link_set_vf_list()
3147 void rtnl_link_unset_vf_list(struct rtnl_link *link) { in rtnl_link_unset_vf_list() argument
3150 if ((err = rtnl_link_has_vf_list(link))) in rtnl_link_unset_vf_list()
3151 link->ce_mask &= ~LINK_ATTR_VF_LIST; in rtnl_link_unset_vf_list()
3165 int rtnl_link_set_info_type(struct rtnl_link *link, const char *type) in rtnl_link_set_info_type() argument
3167 return rtnl_link_set_type(link, type); in rtnl_link_set_info_type()
3173 char *rtnl_link_get_info_type(struct rtnl_link *link) in rtnl_link_get_info_type() argument
3175 return rtnl_link_get_type(link); in rtnl_link_get_info_type()
3181 void rtnl_link_set_weight(struct rtnl_link *link, unsigned int weight) in rtnl_link_set_weight() argument
3183 link->l_weight = weight; in rtnl_link_set_weight()
3184 link->ce_mask |= LINK_ATTR_WEIGHT; in rtnl_link_set_weight()
3190 unsigned int rtnl_link_get_weight(struct rtnl_link *link) in rtnl_link_get_weight() argument
3192 return link->l_weight; in rtnl_link_get_weight()
3198 .oo_name = "route/link",
3220 .co_name = "route/link",