Lines Matching full:link

8  * @defgroup link Links (Interfaces)
11 * @route_doc{route_link, Link Documentation}
26 #include <netlink/route/link.h>
32 #include "link-sriov.h"
33 #include "link/link-api.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
101 if (!rtnl_link_af_alloc(link, af_ops)) { in af_lookup_and_alloc()
109 static int af_free(struct rtnl_link *link, struct rtnl_link_af_ops *ops, in af_free() argument
113 ops->ao_free(link, data); in af_free()
131 static int af_clone(struct rtnl_link *link, struct rtnl_link_af_ops *ops, in af_clone() argument
143 static int af_fill(struct rtnl_link *link, struct rtnl_link_af_ops *ops, in af_fill() argument
157 if ((err = ops->ao_fill_af(link, arg, data)) < 0) in af_fill()
166 static int af_fill_pi(struct rtnl_link *link, struct rtnl_link_af_ops *ops, in af_fill_pi() argument
182 if ((err = ops->ao_fill_pi(link, arg, data)) < 0) in af_fill_pi()
190 static int af_dump_line(struct rtnl_link *link, struct rtnl_link_af_ops *ops, in af_dump_line() argument
196 ops->ao_dump[NL_DUMP_LINE](link, p, data); in af_dump_line()
201 static int af_dump_details(struct rtnl_link *link, struct rtnl_link_af_ops *ops, in af_dump_details() argument
207 ops->ao_dump[NL_DUMP_DETAILS](link, p, data); in af_dump_details()
212 static int af_dump_stats(struct rtnl_link *link, struct rtnl_link_af_ops *ops, in af_dump_stats() argument
218 ops->ao_dump[NL_DUMP_STATS](link, p, data); in af_dump_stats()
223 static int do_foreach_af(struct rtnl_link *link, in do_foreach_af() argument
231 if (link->l_af_data[i]) { in do_foreach_af()
237 err = cb(link, ops, link->l_af_data[i], arg); in do_foreach_af()
246 static void release_link_info(struct rtnl_link *link) in release_link_info() argument
248 struct rtnl_link_info_ops *io = link->l_info_ops; in release_link_info()
252 io->io_free(link); in release_link_info()
255 BUG_ON(link->l_info); in release_link_info()
258 link->l_info_ops = NULL; in release_link_info()
264 struct rtnl_link *link = nl_object_priv(c); in link_free_data() local
266 if (link) { in link_free_data()
267 release_link_info(link); in link_free_data()
270 rtnl_link_af_ops_put(link->l_af_ops); in link_free_data()
272 nl_addr_put(link->l_addr); in link_free_data()
273 nl_addr_put(link->l_bcast); in link_free_data()
275 free(link->l_ifalias); in link_free_data()
276 free(link->l_info_kind); in link_free_data()
277 free(link->l_info_slave_kind); in link_free_data()
279 do_foreach_af(link, af_free, NULL); in link_free_data()
281 nl_data_free(link->l_phys_port_id); in link_free_data()
282 nl_data_free(link->l_phys_switch_id); in link_free_data()
284 if (link->ce_mask & LINK_ATTR_VF_LIST) in link_free_data()
285 rtnl_link_sriov_free_data(link); in link_free_data()
402 int rtnl_link_info_parse(struct rtnl_link *link, struct nlattr **tb) in rtnl_link_info_parse() argument
407 nla_strlcpy(link->l_name, tb[IFLA_IFNAME], IFNAMSIZ); in rtnl_link_info_parse()
408 link->ce_mask |= LINK_ATTR_IFNAME; in rtnl_link_info_parse()
413 link->l_stats[RTNL_LINK_RX_PACKETS] = st->rx_packets; in rtnl_link_info_parse()
414 link->l_stats[RTNL_LINK_TX_PACKETS] = st->tx_packets; in rtnl_link_info_parse()
415 link->l_stats[RTNL_LINK_RX_BYTES] = st->rx_bytes; in rtnl_link_info_parse()
416 link->l_stats[RTNL_LINK_TX_BYTES] = st->tx_bytes; in rtnl_link_info_parse()
417 link->l_stats[RTNL_LINK_RX_ERRORS] = st->rx_errors; in rtnl_link_info_parse()
418 link->l_stats[RTNL_LINK_TX_ERRORS] = st->tx_errors; in rtnl_link_info_parse()
419 link->l_stats[RTNL_LINK_RX_DROPPED] = st->rx_dropped; in rtnl_link_info_parse()
420 link->l_stats[RTNL_LINK_TX_DROPPED] = st->tx_dropped; in rtnl_link_info_parse()
421 link->l_stats[RTNL_LINK_MULTICAST] = st->multicast; in rtnl_link_info_parse()
422 link->l_stats[RTNL_LINK_COLLISIONS] = st->collisions; in rtnl_link_info_parse()
424 link->l_stats[RTNL_LINK_RX_LEN_ERR] = st->rx_length_errors; in rtnl_link_info_parse()
425 link->l_stats[RTNL_LINK_RX_OVER_ERR] = st->rx_over_errors; in rtnl_link_info_parse()
426 link->l_stats[RTNL_LINK_RX_CRC_ERR] = st->rx_crc_errors; in rtnl_link_info_parse()
427 link->l_stats[RTNL_LINK_RX_FRAME_ERR] = st->rx_frame_errors; in rtnl_link_info_parse()
428 link->l_stats[RTNL_LINK_RX_FIFO_ERR] = st->rx_fifo_errors; in rtnl_link_info_parse()
429 link->l_stats[RTNL_LINK_RX_MISSED_ERR] = st->rx_missed_errors; in rtnl_link_info_parse()
431 link->l_stats[RTNL_LINK_TX_ABORT_ERR] = st->tx_aborted_errors; in rtnl_link_info_parse()
432 link->l_stats[RTNL_LINK_TX_CARRIER_ERR] = st->tx_carrier_errors; in rtnl_link_info_parse()
433 link->l_stats[RTNL_LINK_TX_FIFO_ERR] = st->tx_fifo_errors; in rtnl_link_info_parse()
434 link->l_stats[RTNL_LINK_TX_HBEAT_ERR] = st->tx_heartbeat_errors; in rtnl_link_info_parse()
435 link->l_stats[RTNL_LINK_TX_WIN_ERR] = st->tx_window_errors; in rtnl_link_info_parse()
437 link->l_stats[RTNL_LINK_RX_COMPRESSED] = st->rx_compressed; in rtnl_link_info_parse()
438 link->l_stats[RTNL_LINK_TX_COMPRESSED] = st->tx_compressed; in rtnl_link_info_parse()
444 link->l_stats[RTNL_LINK_RX_NOHANDLER] = st->rx_nohandler; in rtnl_link_info_parse()
446 link->l_stats[RTNL_LINK_RX_NOHANDLER] = 0; in rtnl_link_info_parse()
448 link->ce_mask |= LINK_ATTR_STATS; in rtnl_link_info_parse()
463 link->l_stats[RTNL_LINK_RX_PACKETS] = st.rx_packets; in rtnl_link_info_parse()
464 link->l_stats[RTNL_LINK_TX_PACKETS] = st.tx_packets; in rtnl_link_info_parse()
465 link->l_stats[RTNL_LINK_RX_BYTES] = st.rx_bytes; in rtnl_link_info_parse()
466 link->l_stats[RTNL_LINK_TX_BYTES] = st.tx_bytes; in rtnl_link_info_parse()
467 link->l_stats[RTNL_LINK_RX_ERRORS] = st.rx_errors; in rtnl_link_info_parse()
468 link->l_stats[RTNL_LINK_TX_ERRORS] = st.tx_errors; in rtnl_link_info_parse()
469 link->l_stats[RTNL_LINK_RX_DROPPED] = st.rx_dropped; in rtnl_link_info_parse()
470 link->l_stats[RTNL_LINK_TX_DROPPED] = st.tx_dropped; in rtnl_link_info_parse()
471 link->l_stats[RTNL_LINK_MULTICAST] = st.multicast; in rtnl_link_info_parse()
472 link->l_stats[RTNL_LINK_COLLISIONS] = st.collisions; in rtnl_link_info_parse()
474 link->l_stats[RTNL_LINK_RX_LEN_ERR] = st.rx_length_errors; in rtnl_link_info_parse()
475 link->l_stats[RTNL_LINK_RX_OVER_ERR] = st.rx_over_errors; in rtnl_link_info_parse()
476 link->l_stats[RTNL_LINK_RX_CRC_ERR] = st.rx_crc_errors; in rtnl_link_info_parse()
477 link->l_stats[RTNL_LINK_RX_FRAME_ERR] = st.rx_frame_errors; in rtnl_link_info_parse()
478 link->l_stats[RTNL_LINK_RX_FIFO_ERR] = st.rx_fifo_errors; in rtnl_link_info_parse()
479 link->l_stats[RTNL_LINK_RX_MISSED_ERR] = st.rx_missed_errors; in rtnl_link_info_parse()
481 link->l_stats[RTNL_LINK_TX_ABORT_ERR] = st.tx_aborted_errors; in rtnl_link_info_parse()
482 link->l_stats[RTNL_LINK_TX_CARRIER_ERR] = st.tx_carrier_errors; in rtnl_link_info_parse()
483 link->l_stats[RTNL_LINK_TX_FIFO_ERR] = st.tx_fifo_errors; in rtnl_link_info_parse()
484 link->l_stats[RTNL_LINK_TX_HBEAT_ERR] = st.tx_heartbeat_errors; in rtnl_link_info_parse()
485 link->l_stats[RTNL_LINK_TX_WIN_ERR] = st.tx_window_errors; in rtnl_link_info_parse()
487 link->l_stats[RTNL_LINK_RX_COMPRESSED] = st.rx_compressed; in rtnl_link_info_parse()
488 link->l_stats[RTNL_LINK_TX_COMPRESSED] = st.tx_compressed; in rtnl_link_info_parse()
493 link->l_stats[RTNL_LINK_RX_NOHANDLER] = st.rx_nohandler; in rtnl_link_info_parse()
495 link->ce_mask |= LINK_ATTR_STATS; in rtnl_link_info_parse()
499 link->l_txqlen = nla_get_u32(tb[IFLA_TXQLEN]); in rtnl_link_info_parse()
500 link->ce_mask |= LINK_ATTR_TXQLEN; in rtnl_link_info_parse()
504 link->l_mtu = nla_get_u32(tb[IFLA_MTU]); in rtnl_link_info_parse()
505 link->ce_mask |= LINK_ATTR_MTU; in rtnl_link_info_parse()
509 link->l_addr = nl_addr_alloc_attr(tb[IFLA_ADDRESS], AF_UNSPEC); in rtnl_link_info_parse()
510 if (link->l_addr == NULL) in rtnl_link_info_parse()
512 nl_addr_set_family(link->l_addr, in rtnl_link_info_parse()
513 nl_addr_guess_family(link->l_addr)); in rtnl_link_info_parse()
514 link->ce_mask |= LINK_ATTR_ADDR; in rtnl_link_info_parse()
518 link->l_bcast = nl_addr_alloc_attr(tb[IFLA_BROADCAST], in rtnl_link_info_parse()
520 if (link->l_bcast == NULL) in rtnl_link_info_parse()
522 nl_addr_set_family(link->l_bcast, in rtnl_link_info_parse()
523 nl_addr_guess_family(link->l_bcast)); in rtnl_link_info_parse()
524 link->ce_mask |= LINK_ATTR_BRD; in rtnl_link_info_parse()
528 link->l_link = nla_get_u32(tb[IFLA_LINK]); in rtnl_link_info_parse()
529 link->ce_mask |= LINK_ATTR_LINK; in rtnl_link_info_parse()
533 link->l_link_netnsid = nla_get_s32(tb[IFLA_LINK_NETNSID]); in rtnl_link_info_parse()
534 link->ce_mask |= LINK_ATTR_LINK_NETNSID; in rtnl_link_info_parse()
538 link->l_weight = nla_get_u32(tb[IFLA_WEIGHT]); in rtnl_link_info_parse()
539 link->ce_mask |= LINK_ATTR_WEIGHT; in rtnl_link_info_parse()
543 nla_strlcpy(link->l_qdisc, tb[IFLA_QDISC], IFQDISCSIZ); in rtnl_link_info_parse()
544 link->ce_mask |= LINK_ATTR_QDISC; in rtnl_link_info_parse()
548 nla_memcpy(&link->l_map, tb[IFLA_MAP], in rtnl_link_info_parse()
550 link->ce_mask |= LINK_ATTR_MAP; in rtnl_link_info_parse()
554 link->l_master = nla_get_u32(tb[IFLA_MASTER]); in rtnl_link_info_parse()
555 link->ce_mask |= LINK_ATTR_MASTER; in rtnl_link_info_parse()
559 link->l_carrier = nla_get_u8(tb[IFLA_CARRIER]); in rtnl_link_info_parse()
560 link->ce_mask |= LINK_ATTR_CARRIER; in rtnl_link_info_parse()
564 link->l_carrier_changes = nla_get_u32(tb[IFLA_CARRIER_CHANGES]); in rtnl_link_info_parse()
565 link->ce_mask |= LINK_ATTR_CARRIER_CHANGES; in rtnl_link_info_parse()
569 link->l_operstate = nla_get_u8(tb[IFLA_OPERSTATE]); in rtnl_link_info_parse()
570 link->ce_mask |= LINK_ATTR_OPERSTATE; in rtnl_link_info_parse()
574 link->l_linkmode = nla_get_u8(tb[IFLA_LINKMODE]); in rtnl_link_info_parse()
575 link->ce_mask |= LINK_ATTR_LINKMODE; in rtnl_link_info_parse()
579 link->l_ifalias = nla_strdup(tb[IFLA_IFALIAS]); in rtnl_link_info_parse()
580 if (link->l_ifalias == NULL) in rtnl_link_info_parse()
582 link->ce_mask |= LINK_ATTR_IFALIAS; in rtnl_link_info_parse()
586 link->l_ns_fd = nla_get_u32(tb[IFLA_NET_NS_FD]); in rtnl_link_info_parse()
587 link->ce_mask |= LINK_ATTR_NS_FD; in rtnl_link_info_parse()
591 link->l_ns_pid = nla_get_u32(tb[IFLA_NET_NS_PID]); in rtnl_link_info_parse()
592 link->ce_mask |= LINK_ATTR_NS_PID; in rtnl_link_info_parse()
601 _nl_auto_rtnl_link struct rtnl_link *link = NULL; in link_msg_parser() local
609 link = rtnl_link_alloc(); in link_msg_parser()
610 if (link == NULL) in link_msg_parser()
613 link->ce_msgtype = n->nlmsg_type; in link_msg_parser()
619 link->l_family = family = ifi->ifi_family; in link_msg_parser()
620 link->l_arptype = ifi->ifi_type; in link_msg_parser()
621 link->l_index = ifi->ifi_index; in link_msg_parser()
622 link->l_flags = ifi->ifi_flags; in link_msg_parser()
623 link->l_change = ifi->ifi_change; in link_msg_parser()
624 link->ce_mask = (LINK_ATTR_FAMILY | in link_msg_parser()
628 if ((link->l_af_ops = af_lookup_and_alloc(link, family))) { in link_msg_parser()
629 if (link->l_af_ops->ao_protinfo_policy) { in link_msg_parser()
633 link->l_af_ops->ao_protinfo_policy, in link_msg_parser()
639 af_ops_family = link->l_af_ops; in link_msg_parser()
645 err = rtnl_link_info_parse(link, tb); in link_msg_parser()
650 link->l_num_vf = nla_get_u32(tb[IFLA_NUM_VF]); in link_msg_parser()
651 link->ce_mask |= LINK_ATTR_NUM_VF; in link_msg_parser()
652 if (link->l_num_vf && tb[IFLA_VFINFO_LIST]) { in link_msg_parser()
653 if ((err = rtnl_link_sriov_parse_vflist(link, tb)) < 0) in link_msg_parser()
655 link->ce_mask |= LINK_ATTR_VF_LIST; in link_msg_parser()
672 err = rtnl_link_set_type(link, kind); in link_msg_parser()
677 && !link->l_af_ops in link_msg_parser()
678 && (link->l_af_ops = af_lookup_and_alloc(link, af))) { in link_msg_parser()
679 link->l_family = af; in link_msg_parser()
680 if (link->l_af_ops->ao_protinfo_policy) in link_msg_parser()
681 tb[IFLA_PROTINFO] = (struct nlattr *)link->l_af_ops->ao_protinfo_policy; in link_msg_parser()
684 if (link->l_info_ops) in link_msg_parser()
685 release_link_info(link); in link_msg_parser()
688 link->l_info_ops = ops; in link_msg_parser()
693 err = ops->io_parse(link, li[IFLA_INFO_DATA], in link_msg_parser()
702 link->ce_mask |= LINK_ATTR_LINKINFO; in link_msg_parser()
708 err = rtnl_link_set_slave_type(link, kind); in link_msg_parser()
712 link->ce_mask |= LINK_ATTR_LINKINFO_SLAVE_KIND; in link_msg_parser()
717 && link->l_af_ops in link_msg_parser()
718 && link->l_af_ops->ao_parse_protinfo) { in link_msg_parser()
719 err = link->l_af_ops->ao_parse_protinfo(link, tb[IFLA_PROTINFO], in link_msg_parser()
720 link->l_af_data[link->l_family]); in link_msg_parser()
723 link->ce_mask |= LINK_ATTR_PROTINFO; in link_msg_parser()
732 err = af_ops_family->ao_parse_af_full(link, in link_msg_parser()
734 link->l_af_data[af_ops_family->ao_family]); in link_msg_parser()
737 link->ce_mask |= LINK_ATTR_AF_SPEC; in link_msg_parser()
745 af_ops = af_lookup_and_alloc(link, nla_type(af_attr)); in link_msg_parser()
747 char *af_data = link->l_af_data[nla_type(af_attr)]; in link_msg_parser()
749 err = af_ops->ao_parse_af(link, af_attr, af_data); in link_msg_parser()
754 link->ce_mask |= LINK_ATTR_AF_SPEC; in link_msg_parser()
762 link->l_promiscuity = nla_get_u32(tb[IFLA_PROMISCUITY]); in link_msg_parser()
763 link->ce_mask |= LINK_ATTR_PROMISCUITY; in link_msg_parser()
767 link->l_num_tx_queues = nla_get_u32(tb[IFLA_NUM_TX_QUEUES]); in link_msg_parser()
768 link->ce_mask |= LINK_ATTR_NUM_TX_QUEUES; in link_msg_parser()
772 link->l_num_rx_queues = nla_get_u32(tb[IFLA_NUM_RX_QUEUES]); in link_msg_parser()
773 link->ce_mask |= LINK_ATTR_NUM_RX_QUEUES; in link_msg_parser()
777 link->l_gso_max_segs = nla_get_u32(tb[IFLA_GSO_MAX_SEGS]); in link_msg_parser()
778 link->ce_mask |= LINK_ATTR_GSO_MAX_SEGS; in link_msg_parser()
782 link->l_gso_max_size = nla_get_u32(tb[IFLA_GSO_MAX_SIZE]); in link_msg_parser()
783 link->ce_mask |= LINK_ATTR_GSO_MAX_SIZE; in link_msg_parser()
787 link->l_group = nla_get_u32(tb[IFLA_GROUP]); in link_msg_parser()
788 link->ce_mask |= LINK_ATTR_GROUP; in link_msg_parser()
792 link->l_phys_port_id = nl_data_alloc_attr(tb[IFLA_PHYS_PORT_ID]); in link_msg_parser()
793 if (link->l_phys_port_id == NULL) in link_msg_parser()
795 link->ce_mask |= LINK_ATTR_PHYS_PORT_ID; in link_msg_parser()
799 nla_strlcpy(link->l_phys_port_name, tb[IFLA_PHYS_PORT_NAME], IFNAMSIZ); in link_msg_parser()
800 link->ce_mask |= LINK_ATTR_PHYS_PORT_NAME; in link_msg_parser()
804 link->l_phys_switch_id = nl_data_alloc_attr(tb[IFLA_PHYS_SWITCH_ID]); in link_msg_parser()
805 if (link->l_phys_switch_id == NULL) in link_msg_parser()
807 link->ce_mask |= LINK_ATTR_PHYS_SWITCH_ID; in link_msg_parser()
810 return pp->pp_cb((struct nl_object *) link, pp); in link_msg_parser()
853 struct rtnl_link *link = (struct rtnl_link *) obj; in link_dump_line() local
857 cache = nl_cache_mngt_require_safe("route/link"); in link_dump_line()
861 if (link->l_family != AF_UNSPEC) in link_dump_line()
862 nl_dump_line(p, "%s ", nl_af2str(link->l_family, buf, sizeof(buf))); in link_dump_line()
864 nl_dump_line(p, "%s %s ", link->l_name, in link_dump_line()
865 nl_llproto2str(link->l_arptype, buf, sizeof(buf))); in link_dump_line()
867 if (link->l_addr && !nl_addr_iszero(link->l_addr)) in link_dump_line()
868 nl_dump(p, "%s ", nl_addr2str(link->l_addr, buf, sizeof(buf))); in link_dump_line()
870 if (link->ce_mask & LINK_ATTR_MASTER) { in link_dump_line()
872 _nl_auto_rtnl_link struct rtnl_link *master = rtnl_link_get(cache, link->l_master); in link_dump_line()
876 nl_dump(p, "master %d ", link->l_master); in link_dump_line()
879 rtnl_link_flags2str(link->l_flags, buf, sizeof(buf)); in link_dump_line()
883 if (link->ce_mask & LINK_ATTR_LINK) { in link_dump_line()
885 && !(link->ce_mask & LINK_ATTR_LINK_NETNSID)) { in link_dump_line()
886 _nl_auto_rtnl_link struct rtnl_link *ll = rtnl_link_get(cache, link->l_link); in link_dump_line()
890 nl_dump(p, "slave-of %d ", link->l_link); in link_dump_line()
892 if (link->ce_mask & LINK_ATTR_LINK_NETNSID) in link_dump_line()
893 nl_dump(p, "link-netnsid %d ", link->l_link_netnsid); in link_dump_line()
895 if (link->ce_mask & LINK_ATTR_GROUP) in link_dump_line()
896 nl_dump(p, "group %u ", link->l_group); in link_dump_line()
898 if (link->l_info_ops && link->l_info_ops->io_dump[NL_DUMP_LINE]) in link_dump_line()
899 link->l_info_ops->io_dump[NL_DUMP_LINE](link, p); in link_dump_line()
901 do_foreach_af(link, af_dump_line, p); in link_dump_line()
911 struct rtnl_link *link = (struct rtnl_link *) obj; in link_dump_details() local
916 nl_dump_line(p, " mtu %u ", link->l_mtu); in link_dump_details()
917 nl_dump(p, "txqlen %u weight %u ", link->l_txqlen, link->l_weight); in link_dump_details()
919 if (link->ce_mask & LINK_ATTR_QDISC) in link_dump_details()
920 nl_dump(p, "qdisc %s ", link->l_qdisc); in link_dump_details()
922 if (link->ce_mask & LINK_ATTR_MAP && link->l_map.lm_irq) in link_dump_details()
923 nl_dump(p, "irq %u ", link->l_map.lm_irq); in link_dump_details()
925 if (link->ce_mask & LINK_ATTR_IFINDEX) in link_dump_details()
926 nl_dump(p, "index %u ", link->l_index); in link_dump_details()
928 if (link->ce_mask & LINK_ATTR_PROMISCUITY && link->l_promiscuity > 0) in link_dump_details()
929 nl_dump(p, "promisc-mode (%u users) ", link->l_promiscuity); in link_dump_details()
933 if (link->ce_mask & LINK_ATTR_IFALIAS) in link_dump_details()
934 nl_dump_line(p, " alias %s\n", link->l_ifalias); in link_dump_details()
938 if (link->ce_mask & LINK_ATTR_NUM_TX_QUEUES) in link_dump_details()
939 nl_dump(p, "txq %u ", link->l_num_tx_queues); in link_dump_details()
941 if (link->ce_mask & LINK_ATTR_NUM_RX_QUEUES) in link_dump_details()
942 nl_dump(p, "rxq %u ", link->l_num_rx_queues); in link_dump_details()
944 if (link->ce_mask & LINK_ATTR_BRD) in link_dump_details()
945 nl_dump(p, "brd %s ", nl_addr2str(link->l_bcast, buf, in link_dump_details()
948 if ((link->ce_mask & LINK_ATTR_OPERSTATE) && in link_dump_details()
949 link->l_operstate != IF_OPER_UNKNOWN) { in link_dump_details()
950 rtnl_link_operstate2str(link->l_operstate, buf, sizeof(buf)); in link_dump_details()
954 if (link->ce_mask & LINK_ATTR_NUM_VF) in link_dump_details()
955 nl_dump(p, "num-vf %u ", link->l_num_vf); in link_dump_details()
958 rtnl_link_mode2str(link->l_linkmode, buf, sizeof(buf))); in link_dump_details()
961 rtnl_link_carrier2str(link->l_carrier, buf, sizeof(buf))); in link_dump_details()
963 if (link->ce_mask & LINK_ATTR_CARRIER_CHANGES) in link_dump_details()
964 nl_dump(p, " carrier-changes %u", link->l_carrier_changes); in link_dump_details()
968 if (link->l_info_ops && link->l_info_ops->io_dump[NL_DUMP_DETAILS]) in link_dump_details()
969 link->l_info_ops->io_dump[NL_DUMP_DETAILS](link, p); in link_dump_details()
971 do_foreach_af(link, af_dump_details, p); in link_dump_details()
973 if (link->ce_mask & LINK_ATTR_VF_LIST) in link_dump_details()
974 rtnl_link_sriov_dump_details(link, p); in link_dump_details()
979 struct rtnl_link *link = (struct rtnl_link *) obj; in link_dump_stats() local
988 res = nl_cancel_down_bytes(link->l_stats[RTNL_LINK_RX_BYTES], &unit); in link_dump_stats()
994 link->l_stats[RTNL_LINK_RX_PACKETS], in link_dump_stats()
995 link->l_stats[RTNL_LINK_RX_ERRORS], in link_dump_stats()
996 link->l_stats[RTNL_LINK_RX_DROPPED], in link_dump_stats()
997 link->l_stats[RTNL_LINK_RX_FIFO_ERR], in link_dump_stats()
998 link->l_stats[RTNL_LINK_RX_COMPRESSED]); in link_dump_stats()
1000 res = nl_cancel_down_bytes(link->l_stats[RTNL_LINK_TX_BYTES], &unit); in link_dump_stats()
1006 link->l_stats[RTNL_LINK_TX_PACKETS], in link_dump_stats()
1007 link->l_stats[RTNL_LINK_TX_ERRORS], in link_dump_stats()
1008 link->l_stats[RTNL_LINK_TX_DROPPED], in link_dump_stats()
1009 link->l_stats[RTNL_LINK_TX_FIFO_ERR], in link_dump_stats()
1010 link->l_stats[RTNL_LINK_TX_COMPRESSED]); in link_dump_stats()
1018 link->l_stats[RTNL_LINK_RX_LEN_ERR], in link_dump_stats()
1019 link->l_stats[RTNL_LINK_RX_OVER_ERR], in link_dump_stats()
1020 link->l_stats[RTNL_LINK_RX_CRC_ERR], in link_dump_stats()
1021 link->l_stats[RTNL_LINK_RX_FRAME_ERR], in link_dump_stats()
1022 link->l_stats[RTNL_LINK_RX_MISSED_ERR], in link_dump_stats()
1023 link->l_stats[RTNL_LINK_MULTICAST]); in link_dump_stats()
1030 link->l_stats[RTNL_LINK_TX_ABORT_ERR], in link_dump_stats()
1031 link->l_stats[RTNL_LINK_TX_CARRIER_ERR], in link_dump_stats()
1032 link->l_stats[RTNL_LINK_TX_HBEAT_ERR], in link_dump_stats()
1033 link->l_stats[RTNL_LINK_TX_WIN_ERR], in link_dump_stats()
1034 link->l_stats[RTNL_LINK_COLLISIONS]); in link_dump_stats()
1036 if (link->l_info_ops && link->l_info_ops->io_dump[NL_DUMP_STATS]) in link_dump_stats()
1037 link->l_info_ops->io_dump[NL_DUMP_STATS](link, p); in link_dump_stats()
1039 do_foreach_af(link, af_dump_stats, p); in link_dump_stats()
1041 if (link->ce_mask & LINK_ATTR_VF_LIST) in link_dump_stats()
1042 rtnl_link_sriov_dump_stats(link, p); in link_dump_stats()
1073 dp_dump_line(p, line++, "link %s changed state to %s.\n",
1078 dp_dump(p, "link %s %s promiscuous mode.\n",
1083 dp_dump_line(p, line++, "link %s sent unknown event.\n",
1095 struct rtnl_link *link = (struct rtnl_link *) obj; in link_keygen() local
1103 lkey.l_index = link->l_index; in link_keygen()
1104 lkey.l_family = link->l_family; in link_keygen()
1108 NL_DBG(5, "link %p key (dev %d fam %d) keysz %d, hash 0x%x\n", in link_keygen()
1109 link, lkey.l_index, lkey.l_family, lkey_sz, *hashkey); in link_keygen()
1174 __ADD(LINK_ATTR_LINK, link),
1222 * Allocate link cache and fill in all configured links.
1224 * @arg family Link address family or AF_UNSPEC
1226 * @arg flags Flags to set in link cache before filling
1228 * Allocates and initializes a new link cache. If \c sk is valid, a netlink
1231 * the operation succeeds, the resulting cache will contain a link object for
1232 * each link configured in the kernel. If \c sk is NULL, returns 0 but the
1271 * Allocate link cache and fill in all configured links.
1273 * @arg family Link address family or AF_UNSPEC
1276 * Allocates and initializes a new link cache. If \c sk is valid, a netlink
1279 * the operation succeeds, the resulting cache will contain a link object for
1280 * each link configured in the kernel. If \c sk is NULL, returns 0 but the
1301 * Lookup link in cache by interface index
1302 * @arg cache Link cache
1305 * Searches through the provided cache looking for a link with matching
1308 * @attention The reference counter of the returned link object will be
1313 * @return Link object or NULL if no match was found.
1317 struct rtnl_link *link; in rtnl_link_get() local
1322 nl_list_for_each_entry(link, &cache->c_items, ce_list) { in rtnl_link_get()
1323 if (link->l_index == ((unsigned)ifindex)) { in rtnl_link_get()
1324 nl_object_get((struct nl_object *) link); in rtnl_link_get()
1325 return link; in rtnl_link_get()
1333 * Lookup link in cache by link name
1334 * @arg cache Link cache
1335 * @arg name Name of link
1337 * Searches through the provided cache looking for a link with matching
1338 * link name
1340 * @attention The reference counter of the returned link object will be
1345 * @return Link object or NULL if no match was found.
1350 struct rtnl_link *link; in rtnl_link_get_by_name() local
1355 nl_list_for_each_entry(link, &cache->c_items, ce_list) { in rtnl_link_get_by_name()
1356 if (!strcmp(name, link->l_name)) { in rtnl_link_get_by_name()
1357 nl_object_get((struct nl_object *) link); in rtnl_link_get_by_name()
1358 return link; in rtnl_link_get_by_name()
1368 * @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)}
1434 _nl_auto_rtnl_link struct rtnl_link *link = NULL; in rtnl_link_get_kernel() local
1446 err = nl_pickup_keep_syserr(sk, link_msg_parser, (struct nl_object **) &link, &syserr); in rtnl_link_get_kernel()
1462 if (err == 0 && link) in rtnl_link_get_kernel()
1465 *result = _nl_steal_pointer(&link); in rtnl_link_get_kernel()
1470 * Translate interface index to corresponding link name
1471 * @arg cache Link cache
1477 * link name and stores the name in the destination string.
1479 * @route_doc{link_translate_ifindex, Translating interface index to link name}
1481 * @return Name of link or NULL if no match was found.
1486 _nl_auto_rtnl_link struct rtnl_link *link = NULL; in rtnl_link_i2name() local
1488 link = rtnl_link_get(cache, ifindex); in rtnl_link_i2name()
1489 if (link) { in rtnl_link_i2name()
1490 _nl_strncpy_trunc(dst, link->l_name, len); in rtnl_link_i2name()
1498 * Translate link name to corresponding interface index
1499 * @arg cache Link cache
1500 * @arg name Name of link
1502 * @route_doc{link_translate_ifindex, Translating interface index to link name}
1508 _nl_auto_rtnl_link struct rtnl_link *link = NULL; in rtnl_link_name2i() local
1510 link = rtnl_link_get_by_name(cache, name); in rtnl_link_name2i()
1511 if (link) in rtnl_link_name2i()
1512 return link->l_index; in rtnl_link_name2i()
1519 int rtnl_link_fill_info(struct nl_msg *msg, struct rtnl_link *link) in rtnl_link_fill_info() argument
1521 if (link->ce_mask & LINK_ATTR_ADDR) in rtnl_link_fill_info()
1522 NLA_PUT_ADDR(msg, IFLA_ADDRESS, link->l_addr); in rtnl_link_fill_info()
1524 if (link->ce_mask & LINK_ATTR_BRD) in rtnl_link_fill_info()
1525 NLA_PUT_ADDR(msg, IFLA_BROADCAST, link->l_bcast); in rtnl_link_fill_info()
1527 if (link->ce_mask & LINK_ATTR_MTU) in rtnl_link_fill_info()
1528 NLA_PUT_U32(msg, IFLA_MTU, link->l_mtu); in rtnl_link_fill_info()
1530 if (link->ce_mask & LINK_ATTR_TXQLEN) in rtnl_link_fill_info()
1531 NLA_PUT_U32(msg, IFLA_TXQLEN, link->l_txqlen); in rtnl_link_fill_info()
1533 if (link->ce_mask & LINK_ATTR_WEIGHT) in rtnl_link_fill_info()
1534 NLA_PUT_U32(msg, IFLA_WEIGHT, link->l_weight); in rtnl_link_fill_info()
1536 if (link->ce_mask & LINK_ATTR_IFNAME) in rtnl_link_fill_info()
1537 NLA_PUT_STRING(msg, IFLA_IFNAME, link->l_name); in rtnl_link_fill_info()
1539 if (link->ce_mask & LINK_ATTR_OPERSTATE) in rtnl_link_fill_info()
1540 NLA_PUT_U8(msg, IFLA_OPERSTATE, link->l_operstate); in rtnl_link_fill_info()
1542 if (link->ce_mask & LINK_ATTR_CARRIER) in rtnl_link_fill_info()
1543 NLA_PUT_U8(msg, IFLA_CARRIER, link->l_carrier); in rtnl_link_fill_info()
1545 if (link->ce_mask & LINK_ATTR_LINKMODE) in rtnl_link_fill_info()
1546 NLA_PUT_U8(msg, IFLA_LINKMODE, link->l_linkmode); in rtnl_link_fill_info()
1548 if (link->ce_mask & LINK_ATTR_IFALIAS) in rtnl_link_fill_info()
1549 NLA_PUT_STRING(msg, IFLA_IFALIAS, link->l_ifalias); in rtnl_link_fill_info()
1551 if (link->ce_mask & LINK_ATTR_LINK) in rtnl_link_fill_info()
1552 NLA_PUT_U32(msg, IFLA_LINK, link->l_link); in rtnl_link_fill_info()
1554 if (link->ce_mask & LINK_ATTR_LINK_NETNSID) in rtnl_link_fill_info()
1555 NLA_PUT_S32(msg, IFLA_LINK_NETNSID, link->l_link_netnsid); in rtnl_link_fill_info()
1557 if (link->ce_mask & LINK_ATTR_MASTER) in rtnl_link_fill_info()
1558 NLA_PUT_U32(msg, IFLA_MASTER, link->l_master); in rtnl_link_fill_info()
1560 if (link->ce_mask & LINK_ATTR_NUM_TX_QUEUES) in rtnl_link_fill_info()
1561 NLA_PUT_U32(msg, IFLA_NUM_TX_QUEUES, link->l_num_tx_queues); in rtnl_link_fill_info()
1563 if (link->ce_mask & LINK_ATTR_NUM_RX_QUEUES) in rtnl_link_fill_info()
1564 NLA_PUT_U32(msg, IFLA_NUM_RX_QUEUES, link->l_num_rx_queues); in rtnl_link_fill_info()
1566 if (link->ce_mask & LINK_ATTR_NS_FD) in rtnl_link_fill_info()
1567 NLA_PUT_U32(msg, IFLA_NET_NS_FD, link->l_ns_fd); in rtnl_link_fill_info()
1569 if (link->ce_mask & LINK_ATTR_NS_PID) in rtnl_link_fill_info()
1570 NLA_PUT_U32(msg, IFLA_NET_NS_PID, link->l_ns_pid); in rtnl_link_fill_info()
1579 struct rtnl_link *link, int flags, struct nl_msg **result) in build_link_msg() argument
1591 if (rtnl_link_fill_info(msg, link)) in build_link_msg()
1594 if (link->ce_mask & LINK_ATTR_GROUP) in build_link_msg()
1595 NLA_PUT_U32(msg, IFLA_GROUP, link->l_group); in build_link_msg()
1597 if (link->ce_mask & (LINK_ATTR_LINKINFO|LINK_ATTR_LINKINFO_SLAVE_KIND)) { in build_link_msg()
1603 if (link->ce_mask & LINK_ATTR_LINKINFO) { in build_link_msg()
1604 NLA_PUT_STRING(msg, IFLA_INFO_KIND, link->l_info_kind); in build_link_msg()
1606 if (link->l_info_ops) { in build_link_msg()
1607 if (link->l_info_ops->io_put_attrs && in build_link_msg()
1608 link->l_info_ops->io_put_attrs(msg, link) < 0) in build_link_msg()
1613 if (link->ce_mask & LINK_ATTR_LINKINFO_SLAVE_KIND) { in build_link_msg()
1614 NLA_PUT_STRING(msg, IFLA_INFO_SLAVE_KIND, link->l_info_slave_kind); in build_link_msg()
1620 if (link->ce_mask & LINK_ATTR_VF_LIST) { in build_link_msg()
1621 if (rtnl_link_sriov_fill_vflist(msg, link) < 0) in build_link_msg()
1625 if (do_foreach_af(link, af_fill_pi, msg) < 0) in build_link_msg()
1631 if (do_foreach_af(link, af_fill, msg) < 0) in build_link_msg()
1649 * Build a netlink message requesting the addition of new virtual link
1650 * @arg link new link to add
1664 int rtnl_link_build_add_request(struct rtnl_link *link, int flags, in rtnl_link_build_add_request() argument
1668 .ifi_family = link->l_family, in rtnl_link_build_add_request()
1669 .ifi_index = link->l_index, in rtnl_link_build_add_request()
1670 .ifi_flags = link->l_flags, in rtnl_link_build_add_request()
1671 .ifi_change = link->l_flag_mask, in rtnl_link_build_add_request()
1674 return build_link_msg(RTM_NEWLINK, &ifi, link, flags, result); in rtnl_link_build_add_request()
1678 * Add virtual link
1680 * @arg link new link to add
1684 * a new virtual link.
1694 int rtnl_link_add(struct nl_sock *sk, struct rtnl_link *link, int flags) in rtnl_link_add() argument
1699 err = rtnl_link_build_add_request(link, flags, &msg); in rtnl_link_add()
1707 * Build a netlink message requesting the modification of link
1708 * @arg orig original link to change
1709 * @arg changes link containing the changes to be made
1721 * to RTM_SETLINK (does not allow changing link info attributes) to
1743 APPBUG("link change: family is immutable"); in rtnl_link_build_change_request()
1763 * Change link
1765 * @arg orig original link to be changed
1766 * @arg changes link containing the changes to be made
1770 * a network link. If -EOPNOTSUPP is returned by the kernel, the
1774 * The link to be changed is looked up based on the interface index
1775 * supplied in the \p orig link. Optionaly the link name is used but
1777 * link name will result in the link name being changed.
1779 * If no matching link exists, the function will return
1788 * @note The link name can only be changed if the link has been put
1835 * Build a netlink message requesting the deletion of a link
1836 * @arg link Link to delete
1847 int rtnl_link_build_delete_request(const struct rtnl_link *link, in rtnl_link_build_delete_request() argument
1852 .ifi_index = link->l_index, in rtnl_link_build_delete_request()
1855 if (!(link->ce_mask & (LINK_ATTR_IFINDEX | LINK_ATTR_IFNAME))) { in rtnl_link_build_delete_request()
1865 if (link->ce_mask & LINK_ATTR_IFNAME) in rtnl_link_build_delete_request()
1866 _NL_RETURN_ON_PUT_ERR(nla_put_string(msg, IFLA_IFNAME, link->l_name)); in rtnl_link_build_delete_request()
1873 * Delete link
1875 * @arg link Link to delete
1878 * a network link which has been previously added to the kernel and
1881 * If no matching link exists, the function will return
1896 int rtnl_link_delete(struct nl_sock *sk, const struct rtnl_link *link) in rtnl_link_delete() argument
1901 if ((err = rtnl_link_build_delete_request(link, &msg)) < 0) in rtnl_link_delete()
1910 * @name Link Object
1915 * Allocate link object
1918 * @return New link object or NULL if allocation failed
1926 * Release a link object reference
1927 * @arg link Link object
1929 void rtnl_link_put(struct rtnl_link *link) in rtnl_link_put() argument
1931 nl_object_put((struct nl_object *) link); in rtnl_link_put()
1935 * Set name of link object
1936 * @arg link Link object
1939 * @note To change the name of a link in the kernel, set the interface
1940 * index to the link you wish to change, modify the link name using
1941 * this function and pass the link object to rtnl_link_change() or
1944 * @route_doc{link_attr_name, Link Name}
1948 void rtnl_link_set_name(struct rtnl_link *link, const char *name) in rtnl_link_set_name() argument
1950 _nl_strncpy_trunc(link->l_name, name, sizeof(link->l_name)); in rtnl_link_set_name()
1951 link->ce_mask |= LINK_ATTR_IFNAME; in rtnl_link_set_name()
1955 * Return name of link object
1956 * @arg link Link object
1958 * @route_doc{link_attr_name, Link Name}
1960 * @return Link name or NULL if name is not specified
1962 char *rtnl_link_get_name(struct rtnl_link *link) in rtnl_link_get_name() argument
1964 return link->ce_mask & LINK_ATTR_IFNAME ? link->l_name : NULL; in rtnl_link_get_name()
1968 * Set the group identifier of a link object
1969 * @arg link Link object
1972 void rtnl_link_set_group(struct rtnl_link *link, uint32_t group) in rtnl_link_set_group() argument
1974 link->l_group = group; in rtnl_link_set_group()
1975 link->ce_mask |= LINK_ATTR_GROUP; in rtnl_link_set_group()
1979 * Return the group identifier of link object
1980 * @arg link Link object
1984 uint32_t rtnl_link_get_group(struct rtnl_link *link) in rtnl_link_get_group() argument
1986 return link->l_group; in rtnl_link_get_group()
1989 static inline void __assign_addr(struct rtnl_link *link, struct nl_addr **pos, in __assign_addr() argument
1998 link->ce_mask |= flag; in __assign_addr()
2002 * Set link layer address of link object
2003 * @arg link Link object
2004 * @arg addr New link layer address
2007 * and overwrites any existing link layer address previously assigned.
2009 * @route_doc{link_attr_address, Link layer address}
2012 void rtnl_link_set_addr(struct rtnl_link *link, struct nl_addr *addr) in rtnl_link_set_addr() argument
2014 __assign_addr(link, &link->l_addr, addr, LINK_ATTR_ADDR); in rtnl_link_set_addr()
2018 * Return link layer address of link object
2019 * @arg link Link object
2022 * @route_doc{link_attr_address, Link Layer Address}
2024 * @return Link layer address or NULL if not set.
2026 struct nl_addr *rtnl_link_get_addr(struct rtnl_link *link) in rtnl_link_get_addr() argument
2028 return link->ce_mask & LINK_ATTR_ADDR ? link->l_addr : NULL; in rtnl_link_get_addr()
2032 * Set link layer broadcast address of link object
2033 * @arg link Link object
2037 * and overwrites any existing link layer broadcast address previously
2040 * @route_doc{link_attr_broadcast, Link Layer Broadcast Address}
2043 void rtnl_link_set_broadcast(struct rtnl_link *link, struct nl_addr *addr) in rtnl_link_set_broadcast() argument
2045 __assign_addr(link, &link->l_bcast, addr, LINK_ATTR_BRD); in rtnl_link_set_broadcast()
2049 * Return link layer broadcast address of link object
2050 * @arg link Link object
2053 * @route_doc{link_attr_address, Link Layer Address}
2055 * @return Link layer address or NULL if not set.
2057 struct nl_addr *rtnl_link_get_broadcast(struct rtnl_link *link) in rtnl_link_get_broadcast() argument
2059 return link->ce_mask & LINK_ATTR_BRD ? link->l_bcast : NULL; in rtnl_link_get_broadcast()
2063 * Set flags of link object
2064 * @arg link Link object
2070 void rtnl_link_set_flags(struct rtnl_link *link, unsigned int flags) in rtnl_link_set_flags() argument
2072 link->l_flag_mask |= flags; in rtnl_link_set_flags()
2073 link->l_flags |= flags; in rtnl_link_set_flags()
2074 link->ce_mask |= LINK_ATTR_FLAGS; in rtnl_link_set_flags()
2078 * Unset flags of link object
2079 * @arg link Link object
2085 void rtnl_link_unset_flags(struct rtnl_link *link, unsigned int flags) in rtnl_link_unset_flags() argument
2087 link->l_flag_mask |= flags; in rtnl_link_unset_flags()
2088 link->l_flags &= ~flags; in rtnl_link_unset_flags()
2089 link->ce_mask |= LINK_ATTR_FLAGS; in rtnl_link_unset_flags()
2093 * Return flags of link object
2094 * @arg link Link object
2096 * @route_doc{link_attr_flags, Link Flags}
2099 * @return Link flags or 0 if none have been set.
2101 unsigned int rtnl_link_get_flags(struct rtnl_link *link) in rtnl_link_get_flags() argument
2103 return link->l_flags; in rtnl_link_get_flags()
2107 * Set address family of link object
2111 void rtnl_link_set_family(struct rtnl_link *link, int family) in rtnl_link_set_family() argument
2113 link->l_family = family; in rtnl_link_set_family()
2114 link->ce_mask |= LINK_ATTR_FAMILY; in rtnl_link_set_family()
2116 if (link->l_af_ops) { in rtnl_link_set_family()
2117 int ao_family = link->l_af_ops->ao_family; in rtnl_link_set_family()
2119 af_free(link, link->l_af_ops, link->l_af_data[ao_family], NULL); in rtnl_link_set_family()
2120 link->l_af_data[ao_family] = NULL; in rtnl_link_set_family()
2123 link->l_af_ops = af_lookup_and_alloc(link, family); in rtnl_link_set_family()
2127 * Return address family of link object
2128 * @arg link Link object
2133 int rtnl_link_get_family(struct rtnl_link *link) in rtnl_link_get_family() argument
2135 return link->ce_mask & LINK_ATTR_FAMILY ? link->l_family : AF_UNSPEC; in rtnl_link_get_family()
2139 * Set hardware type of link object
2140 * @arg link Link object
2147 void rtnl_link_set_arptype(struct rtnl_link *link, unsigned int arptype) in rtnl_link_set_arptype() argument
2149 link->l_arptype = arptype; in rtnl_link_set_arptype()
2150 link->ce_mask |= LINK_ATTR_ARPTYPE; in rtnl_link_set_arptype()
2154 * Get hardware type of link object
2155 * @arg link Link object
2161 unsigned int rtnl_link_get_arptype(struct rtnl_link *link) in rtnl_link_get_arptype() argument
2163 if (link->ce_mask & LINK_ATTR_ARPTYPE) in rtnl_link_get_arptype()
2164 return link->l_arptype; in rtnl_link_get_arptype()
2170 * Set interface index of link object
2171 * @arg link Link object
2177 void rtnl_link_set_ifindex(struct rtnl_link *link, int ifindex) in rtnl_link_set_ifindex() argument
2179 link->l_index = ifindex; in rtnl_link_set_ifindex()
2180 link->ce_mask |= LINK_ATTR_IFINDEX; in rtnl_link_set_ifindex()
2185 * Return interface index of link object
2186 * @arg link Link object
2192 int rtnl_link_get_ifindex(struct rtnl_link *link) in rtnl_link_get_ifindex() argument
2194 return link->l_index; in rtnl_link_get_ifindex()
2198 * Set Maximum Transmission Unit of link object
2199 * @arg link Link object
2205 void rtnl_link_set_mtu(struct rtnl_link *link, unsigned int mtu) in rtnl_link_set_mtu() argument
2207 link->l_mtu = mtu; in rtnl_link_set_mtu()
2208 link->ce_mask |= LINK_ATTR_MTU; in rtnl_link_set_mtu()
2212 * Return maximum transmission unit of link object
2213 * @arg link Link object
2219 unsigned int rtnl_link_get_mtu(struct rtnl_link *link) in rtnl_link_get_mtu() argument
2221 return link->l_mtu; in rtnl_link_get_mtu()
2226 * @arg link Link object
2229 * The unit is dependant on the link type. The most common units is number
2234 void rtnl_link_set_txqlen(struct rtnl_link *link, unsigned int txqlen) in rtnl_link_set_txqlen() argument
2236 link->l_txqlen = txqlen; in rtnl_link_set_txqlen()
2237 link->ce_mask |= LINK_ATTR_TXQLEN; in rtnl_link_set_txqlen()
2242 * @arg link Link object
2244 * The unit is dependant on the link type. The most common units is number
2250 unsigned int rtnl_link_get_txqlen(struct rtnl_link *link) in rtnl_link_get_txqlen() argument
2252 return link->ce_mask & LINK_ATTR_TXQLEN ? link->l_txqlen : 0; in rtnl_link_get_txqlen()
2255 void rtnl_link_set_link(struct rtnl_link *link, int ifindex) in rtnl_link_set_link() argument
2257 link->l_link = ifindex; in rtnl_link_set_link()
2258 link->ce_mask |= LINK_ATTR_LINK; in rtnl_link_set_link()
2261 int rtnl_link_get_link(struct rtnl_link *link) in rtnl_link_get_link() argument
2263 return link->l_link; in rtnl_link_get_link()
2267 * Set the netnsid of the link
2268 * @arg link Link object
2271 * Sets the IFLA_LINK_NETNSID attribute of the link
2274 int rtnl_link_set_link_netnsid(struct rtnl_link *link, int32_t link_netnsid) in rtnl_link_set_link_netnsid() argument
2276 link->l_link_netnsid = link_netnsid; in rtnl_link_set_link_netnsid()
2277 link->ce_mask |= LINK_ATTR_LINK_NETNSID; in rtnl_link_set_link_netnsid()
2282 * Get the netnsid of the link
2283 * @arg link Link object
2286 * Gets the IFLA_LINK_NETNSID attribute of the link
2291 int rtnl_link_get_link_netnsid(const struct rtnl_link *link, int32_t *out_link_netnsid) in rtnl_link_get_link_netnsid() argument
2293 if (!(link->ce_mask & LINK_ATTR_LINK_NETNSID)) in rtnl_link_get_link_netnsid()
2296 *out_link_netnsid = link->l_link_netnsid; in rtnl_link_get_link_netnsid()
2301 * Set master link of link object
2302 * @arg link Link object
2303 * @arg ifindex Interface index of master link
2307 void rtnl_link_set_master(struct rtnl_link *link, int ifindex) in rtnl_link_set_master() argument
2309 link->l_master = ifindex; in rtnl_link_set_master()
2310 link->ce_mask |= LINK_ATTR_MASTER; in rtnl_link_set_master()
2314 * Return master link of link object
2315 * @arg link Link object
2318 * @return Interface index of master link or 0 if not specified
2320 int rtnl_link_get_master(struct rtnl_link *link) in rtnl_link_get_master() argument
2322 return link->l_master; in rtnl_link_get_master()
2326 * Set carrier of link object
2327 * @arg link Link object
2332 void rtnl_link_set_carrier(struct rtnl_link *link, uint8_t status) in rtnl_link_set_carrier() argument
2334 link->l_carrier = status; in rtnl_link_set_carrier()
2335 link->ce_mask |= LINK_ATTR_CARRIER; in rtnl_link_set_carrier()
2339 * Return carrier status of link object
2340 * @arg link Link object
2345 uint8_t rtnl_link_get_carrier(struct rtnl_link *link) in rtnl_link_get_carrier() argument
2347 return link->l_carrier; in rtnl_link_get_carrier()
2351 * Return carrier on/off changes of link object
2352 * @arg link Link object
2357 int rtnl_link_get_carrier_changes(struct rtnl_link *link, uint32_t *carrier_changes) in rtnl_link_get_carrier_changes() argument
2359 if (!(link->ce_mask & LINK_ATTR_CARRIER_CHANGES)) in rtnl_link_get_carrier_changes()
2363 *carrier_changes = link->l_carrier_changes; in rtnl_link_get_carrier_changes()
2369 * Set operational status of link object
2370 * @arg link Link object
2376 void rtnl_link_set_operstate(struct rtnl_link *link, uint8_t status) in rtnl_link_set_operstate() argument
2378 link->l_operstate = status; in rtnl_link_set_operstate()
2379 link->ce_mask |= LINK_ATTR_OPERSTATE; in rtnl_link_set_operstate()
2383 * Return operational status of link object
2384 * @arg link Link object
2390 uint8_t rtnl_link_get_operstate(struct rtnl_link *link) in rtnl_link_get_operstate() argument
2392 return link->l_operstate; in rtnl_link_get_operstate()
2396 * Set link mode of link object
2397 * @arg link Link object
2398 * @arg mode New link mode
2403 void rtnl_link_set_linkmode(struct rtnl_link *link, uint8_t mode) in rtnl_link_set_linkmode() argument
2405 link->l_linkmode = mode; in rtnl_link_set_linkmode()
2406 link->ce_mask |= LINK_ATTR_LINKMODE; in rtnl_link_set_linkmode()
2410 * Return link mode of link object
2411 * @arg link Link object
2415 * @return Link mode or \c IF_LINK_MODE_DEFAULT
2417 uint8_t rtnl_link_get_linkmode(struct rtnl_link *link) in rtnl_link_get_linkmode() argument
2419 return link->l_linkmode; in rtnl_link_get_linkmode()
2423 * Return alias name of link object (SNMP IfAlias)
2424 * @arg link Link object
2430 const char *rtnl_link_get_ifalias(struct rtnl_link *link) in rtnl_link_get_ifalias() argument
2432 return link->l_ifalias; in rtnl_link_get_ifalias()
2436 * Set alias name of link object (SNMP IfAlias)
2437 * @arg link Link object
2440 * Sets the alias name of the link to the specified name. The alias
2447 void rtnl_link_set_ifalias(struct rtnl_link *link, const char *alias) in rtnl_link_set_ifalias() argument
2449 free(link->l_ifalias); in rtnl_link_set_ifalias()
2452 link->l_ifalias = strdup(alias); in rtnl_link_set_ifalias()
2453 link->ce_mask |= LINK_ATTR_IFALIAS; in rtnl_link_set_ifalias()
2455 link->l_ifalias = NULL; in rtnl_link_set_ifalias()
2456 link->ce_mask &= ~LINK_ATTR_IFALIAS; in rtnl_link_set_ifalias()
2461 * Set queueing discipline name of link object
2462 * @arg link Link object
2467 * For more information on how to modify the qdisc of a link, see section
2473 void rtnl_link_set_qdisc(struct rtnl_link *link, const char *name) in rtnl_link_set_qdisc() argument
2475 _nl_strncpy_trunc(link->l_qdisc, name, sizeof(link->l_qdisc)); in rtnl_link_set_qdisc()
2476 link->ce_mask |= LINK_ATTR_QDISC; in rtnl_link_set_qdisc()
2480 * Return name of queueing discipline of link object
2481 * @arg link Link object
2487 char *rtnl_link_get_qdisc(struct rtnl_link *link) in rtnl_link_get_qdisc() argument
2489 return link->ce_mask & LINK_ATTR_QDISC ? link->l_qdisc : NULL; in rtnl_link_get_qdisc()
2494 * Return number of PCI virtual functions of link object
2495 * @arg link Link object
2500 int rtnl_link_get_num_vf(struct rtnl_link *link, uint32_t *num_vf) in rtnl_link_get_num_vf() argument
2502 if (link->ce_mask & LINK_ATTR_NUM_VF) { in rtnl_link_get_num_vf()
2503 *num_vf = link->l_num_vf; in rtnl_link_get_num_vf()
2510 * Return value of link statistics counter
2511 * @arg link Link object
2516 uint64_t rtnl_link_get_stat(struct rtnl_link *link, rtnl_link_stat_id_t id) in rtnl_link_get_stat() argument
2521 return link->l_stats[id]; in rtnl_link_get_stat()
2525 * Set value of link statistics counter
2526 * @arg link Link object
2535 int rtnl_link_set_stat(struct rtnl_link *link, rtnl_link_stat_id_t id, in rtnl_link_set_stat() argument
2541 link->l_stats[id] = value; in rtnl_link_set_stat()
2547 * Set type of link object
2548 * @arg link Link object
2549 * @arg type Name of link type
2551 * Looks up the link type module and prepares the link to store type
2553 * be released with all link type specific attributes lost.
2555 * @route_doc{link_modules, Link Modules}
2558 int rtnl_link_set_type(struct rtnl_link *link, const char *type) in rtnl_link_set_type() argument
2564 free(link->l_info_kind); in rtnl_link_set_type()
2565 link->ce_mask &= ~LINK_ATTR_LINKINFO; in rtnl_link_set_type()
2566 release_link_info(link); in rtnl_link_set_type()
2577 if (io->io_alloc && (err = io->io_alloc(link)) < 0) { in rtnl_link_set_type()
2582 link->l_info_ops = io; in rtnl_link_set_type()
2585 link->l_info_kind = _nl_steal_pointer(&kind); in rtnl_link_set_type()
2586 link->ce_mask |= LINK_ATTR_LINKINFO; in rtnl_link_set_type()
2592 * Return type of link
2593 * @arg link Link object
2595 * @route_doc{link_modules, Link Modules}
2596 * @return Name of link type or NULL if not specified.
2598 char *rtnl_link_get_type(struct rtnl_link *link) in rtnl_link_get_type() argument
2600 return link->l_info_kind; in rtnl_link_get_type()
2604 * Set type of slave link object
2605 * @arg link Link object (slave)
2606 * @arg type Name of link type
2610 * @route_doc{link_modules, Link Modules}
2613 int rtnl_link_set_slave_type(struct rtnl_link *link, const char *type) in rtnl_link_set_slave_type() argument
2623 free(link->l_info_slave_kind); in rtnl_link_set_slave_type()
2624 link->l_info_slave_kind = kind; in rtnl_link_set_slave_type()
2627 link->ce_mask |= LINK_ATTR_LINKINFO_SLAVE_KIND; in rtnl_link_set_slave_type()
2629 link->ce_mask &= ~LINK_ATTR_LINKINFO_SLAVE_KIND; in rtnl_link_set_slave_type()
2634 * Return type of enslaved link
2635 * @arg link Link object
2637 * @route_doc{link_modules, Link Modules}
2638 * @return Name of enslaved link type or NULL if not specified.
2640 const char *rtnl_link_get_slave_type(const struct rtnl_link *link) in rtnl_link_get_slave_type() argument
2642 return link->l_info_slave_kind; in rtnl_link_get_slave_type()
2647 * Set link promiscuity count
2648 * @arg link Link object
2655 void rtnl_link_set_promiscuity(struct rtnl_link *link, uint32_t count) in rtnl_link_set_promiscuity() argument
2657 link->l_promiscuity = count; in rtnl_link_set_promiscuity()
2658 link->ce_mask |= LINK_ATTR_PROMISCUITY; in rtnl_link_set_promiscuity()
2662 * Return link promiscuity count
2663 * @arg link Link object
2666 * @return Link promiscuity count or 0
2668 uint32_t rtnl_link_get_promiscuity(struct rtnl_link *link) in rtnl_link_get_promiscuity() argument
2670 return link->l_promiscuity; in rtnl_link_get_promiscuity()
2675 * @arg link Link object
2678 * Sets the number of TX queues of the link object. The value is considered
2683 * combination with rtnl_link_add() or if the link object is used as a filter.
2687 void rtnl_link_set_num_tx_queues(struct rtnl_link *link, uint32_t nqueues) in rtnl_link_set_num_tx_queues() argument
2689 link->l_num_tx_queues = nqueues; in rtnl_link_set_num_tx_queues()
2690 link->ce_mask |= LINK_ATTR_NUM_TX_QUEUES; in rtnl_link_set_num_tx_queues()
2695 * @arg link Link object
2699 uint32_t rtnl_link_get_num_tx_queues(struct rtnl_link *link) in rtnl_link_get_num_tx_queues() argument
2701 return link->l_num_tx_queues; in rtnl_link_get_num_tx_queues()
2706 * @arg link Link object
2709 * Sets the number of RX queues of the link object. The value is considered
2714 * combination with rtnl_link_add() or if the link object is used as a filter.
2718 void rtnl_link_set_num_rx_queues(struct rtnl_link *link, uint32_t nqueues) in rtnl_link_set_num_rx_queues() argument
2720 link->l_num_rx_queues = nqueues; in rtnl_link_set_num_rx_queues()
2721 link->ce_mask |= LINK_ATTR_NUM_RX_QUEUES; in rtnl_link_set_num_rx_queues()
2726 * @arg link Link object
2730 uint32_t rtnl_link_get_num_rx_queues(struct rtnl_link *link) in rtnl_link_get_num_rx_queues() argument
2732 return link->l_num_rx_queues; in rtnl_link_get_num_rx_queues()
2737 * @arg link Link object
2742 int rtnl_link_get_gso_max_segs(struct rtnl_link *link, uint32_t *gso_max_segs) in rtnl_link_get_gso_max_segs() argument
2744 if (!(link->ce_mask & LINK_ATTR_GSO_MAX_SEGS)) in rtnl_link_get_gso_max_segs()
2748 *gso_max_segs = link->l_gso_max_segs; in rtnl_link_get_gso_max_segs()
2755 * @arg link Link object
2760 int rtnl_link_get_gso_max_size(struct rtnl_link *link, uint32_t *gso_max_size) in rtnl_link_get_gso_max_size() argument
2762 if (!(link->ce_mask & LINK_ATTR_GSO_MAX_SIZE)) in rtnl_link_get_gso_max_size()
2766 *gso_max_size = link->l_gso_max_size; in rtnl_link_get_gso_max_size()
2772 * Return physical port id of link object
2773 * @arg link Link object
2777 struct nl_data *rtnl_link_get_phys_port_id(struct rtnl_link *link) in rtnl_link_get_phys_port_id() argument
2779 return link->l_phys_port_id; in rtnl_link_get_phys_port_id()
2783 * Return physical port name of link object
2784 * @arg link Link object
2788 char *rtnl_link_get_phys_port_name(struct rtnl_link *link) in rtnl_link_get_phys_port_name() argument
2790 return link->l_phys_port_name; in rtnl_link_get_phys_port_name()
2794 * Return physical switch id of link object
2795 * @arg link Link object
2799 struct nl_data *rtnl_link_get_phys_switch_id(struct rtnl_link *link) in rtnl_link_get_phys_switch_id() argument
2801 return link->l_phys_switch_id; in rtnl_link_get_phys_switch_id()
2804 void rtnl_link_set_ns_fd(struct rtnl_link *link, int fd) in rtnl_link_set_ns_fd() argument
2806 link->l_ns_fd = fd; in rtnl_link_set_ns_fd()
2807 link->ce_mask |= LINK_ATTR_NS_FD; in rtnl_link_set_ns_fd()
2810 int rtnl_link_get_ns_fd(struct rtnl_link *link) in rtnl_link_get_ns_fd() argument
2812 return link->l_ns_fd; in rtnl_link_get_ns_fd()
2815 void rtnl_link_set_ns_pid(struct rtnl_link *link, pid_t pid) in rtnl_link_set_ns_pid() argument
2817 link->l_ns_pid = pid; in rtnl_link_set_ns_pid()
2818 link->ce_mask |= LINK_ATTR_NS_PID; in rtnl_link_set_ns_pid()
2821 pid_t rtnl_link_get_ns_pid(struct rtnl_link *link) in rtnl_link_get_ns_pid() argument
2823 return link->l_ns_pid; in rtnl_link_get_ns_pid()
2834 * Enslave slave link to master link
2836 * @arg master ifindex of master link
2837 * @arg slave ifindex of slave link
2848 _nl_auto_rtnl_link struct rtnl_link *link = NULL; in rtnl_link_enslave_ifindex() local
2851 if (!(link = rtnl_link_alloc())) in rtnl_link_enslave_ifindex()
2854 rtnl_link_set_ifindex(link, slave); in rtnl_link_enslave_ifindex()
2855 rtnl_link_set_master(link, master); in rtnl_link_enslave_ifindex()
2857 if ((err = rtnl_link_change(sock, link, link, 0)) < 0) in rtnl_link_enslave_ifindex()
2860 _nl_clear_pointer(&link, rtnl_link_put); in rtnl_link_enslave_ifindex()
2869 if ((err = rtnl_link_get_kernel(sock, slave, NULL, &link)) < 0) in rtnl_link_enslave_ifindex()
2872 if (rtnl_link_get_master(link) != master) in rtnl_link_enslave_ifindex()
2879 * Enslave slave link to master link
2881 * @arg master master link
2882 * @arg slave slave link
2906 * Release slave link from its master
2908 * @arg slave slave link
2923 * Release slave link from its master
2925 * @arg slave slave link
3117 int rtnl_link_has_vf_list(struct rtnl_link *link) { in rtnl_link_has_vf_list() argument
3118 if (link->ce_mask & LINK_ATTR_VF_LIST) in rtnl_link_has_vf_list()
3124 void rtnl_link_set_vf_list(struct rtnl_link *link) in rtnl_link_set_vf_list() argument
3126 if (!rtnl_link_has_vf_list(link)) in rtnl_link_set_vf_list()
3127 link->ce_mask |= LINK_ATTR_VF_LIST; in rtnl_link_set_vf_list()
3130 void rtnl_link_unset_vf_list(struct rtnl_link *link) in rtnl_link_unset_vf_list() argument
3132 if (rtnl_link_has_vf_list(link)) in rtnl_link_unset_vf_list()
3133 link->ce_mask &= ~LINK_ATTR_VF_LIST; in rtnl_link_unset_vf_list()
3145 int rtnl_link_set_info_type(struct rtnl_link *link, const char *type) in rtnl_link_set_info_type() argument
3147 return rtnl_link_set_type(link, type); in rtnl_link_set_info_type()
3153 char *rtnl_link_get_info_type(struct rtnl_link *link) in rtnl_link_get_info_type() argument
3155 return rtnl_link_get_type(link); in rtnl_link_get_info_type()
3161 void rtnl_link_set_weight(struct rtnl_link *link, unsigned int weight) in rtnl_link_set_weight() argument
3163 link->l_weight = weight; in rtnl_link_set_weight()
3164 link->ce_mask |= LINK_ATTR_WEIGHT; in rtnl_link_set_weight()
3170 unsigned int rtnl_link_get_weight(struct rtnl_link *link) in rtnl_link_get_weight() argument
3172 return link->l_weight; in rtnl_link_get_weight()
3178 .oo_name = "route/link",
3201 .co_name = "route/link",