diff options
-rw-r--r-- | include/netlink-private/types.h | 2 | ||||
-rw-r--r-- | include/netlink/route/link.h | 4 | ||||
-rw-r--r-- | lib/route/link.c | 52 | ||||
-rw-r--r-- | libnl-route-3.sym | 2 |
4 files changed, 60 insertions, 0 deletions
diff --git a/include/netlink-private/types.h b/include/netlink-private/types.h index 06eeb712..41396193 100644 --- a/include/netlink-private/types.h +++ b/include/netlink-private/types.h @@ -215,6 +215,8 @@ struct rtnl_link uint32_t l_promiscuity; uint32_t l_num_tx_queues; uint32_t l_num_rx_queues; + uint32_t l_gso_max_segs; + uint32_t l_gso_max_size; uint32_t l_group; uint8_t l_carrier; /* 3 byte hole */ diff --git a/include/netlink/route/link.h b/include/netlink/route/link.h index bf83b216..5f941d5f 100644 --- a/include/netlink/route/link.h +++ b/include/netlink/route/link.h @@ -232,6 +232,10 @@ extern uint32_t rtnl_link_get_num_tx_queues(struct rtnl_link *); extern void rtnl_link_set_num_rx_queues(struct rtnl_link *, uint32_t); extern uint32_t rtnl_link_get_num_rx_queues(struct rtnl_link *); +extern int rtnl_link_get_gso_max_segs(struct rtnl_link *, uint32_t *); + +extern int rtnl_link_get_gso_max_size(struct rtnl_link *, uint32_t *); + extern struct nl_data * rtnl_link_get_phys_port_id(struct rtnl_link *); extern char* rtnl_link_get_phys_port_name(struct rtnl_link *); diff --git a/lib/route/link.c b/lib/route/link.c index 599978a8..f8428101 100644 --- a/lib/route/link.c +++ b/lib/route/link.c @@ -69,6 +69,8 @@ #define LINK_ATTR_CARRIER_CHANGES ((uint64_t) 1 << 34) #define LINK_ATTR_PHYS_PORT_NAME ((uint64_t) 1 << 35) #define LINK_ATTR_PHYS_SWITCH_ID ((uint64_t) 1 << 36) +#define LINK_ATTR_GSO_MAX_SEGS ((uint64_t) 1 << 37) +#define LINK_ATTR_GSO_MAX_SIZE ((uint64_t) 1 << 38) static struct nl_cache_ops rtnl_link_ops; static struct nl_object_ops link_obj_ops; @@ -354,6 +356,8 @@ struct nla_policy rtln_link_policy[IFLA_MAX+1] = { [IFLA_PROMISCUITY] = { .type = NLA_U32 }, [IFLA_NUM_TX_QUEUES] = { .type = NLA_U32 }, [IFLA_NUM_RX_QUEUES] = { .type = NLA_U32 }, + [IFLA_GSO_MAX_SEGS] = { .type = NLA_U32 }, + [IFLA_GSO_MAX_SIZE] = { .type = NLA_U32 }, [IFLA_GROUP] = { .type = NLA_U32 }, [IFLA_CARRIER] = { .type = NLA_U8 }, [IFLA_CARRIER_CHANGES] = { .type = NLA_U32 }, @@ -731,6 +735,16 @@ static int link_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who, link->ce_mask |= LINK_ATTR_NUM_RX_QUEUES; } + if (tb[IFLA_GSO_MAX_SEGS]) { + link->l_gso_max_segs = nla_get_u32(tb[IFLA_GSO_MAX_SEGS]); + link->ce_mask |= LINK_ATTR_GSO_MAX_SEGS; + } + + if (tb[IFLA_GSO_MAX_SIZE]) { + link->l_gso_max_size = nla_get_u32(tb[IFLA_GSO_MAX_SIZE]); + link->ce_mask |= LINK_ATTR_GSO_MAX_SIZE; + } + if (tb[IFLA_GROUP]) { link->l_group = nla_get_u32(tb[IFLA_GROUP]); link->ce_mask |= LINK_ATTR_GROUP; @@ -1148,6 +1162,8 @@ static const struct trans_tbl link_attrs[] = { __ADD(LINK_ATTR_PROMISCUITY, promiscuity), __ADD(LINK_ATTR_NUM_TX_QUEUES, num_tx_queues), __ADD(LINK_ATTR_NUM_RX_QUEUES, num_rx_queues), + __ADD(LINK_ATTR_GSO_MAX_SEGS, gso_max_segs), + __ADD(LINK_ATTR_GSO_MAX_SIZE, gso_max_size), __ADD(LINK_ATTR_GROUP, group), __ADD(LINK_ATTR_CARRIER, carrier), __ADD(LINK_ATTR_CARRIER_CHANGES, carrier_changes), @@ -2652,6 +2668,42 @@ uint32_t rtnl_link_get_num_rx_queues(struct rtnl_link *link) } /** + * Return maximum number of segments for generic segmentation offload + * @arg link Link object + * @arg gso_max_segs Pointer to store maximum number GSO segments + * + * @return 0 on success, negative error number otherwise + */ +int rtnl_link_get_gso_max_segs(struct rtnl_link *link, uint32_t *gso_max_segs) +{ + if (!(link->ce_mask & LINK_ATTR_GSO_MAX_SEGS)) + return -NLE_NOATTR; + + if (gso_max_segs) + *gso_max_segs = link->l_gso_max_segs; + + return 0; +} + +/** + * Return maximum size for generic segmentation offload + * @arg link Link object + * @arg gso_max_segs Pointer to store maximum GSO size + * + * @return 0 on success, negative error number otherwise + */ +int rtnl_link_get_gso_max_size(struct rtnl_link *link, uint32_t *gso_max_size) +{ + if (!(link->ce_mask & LINK_ATTR_GSO_MAX_SIZE)) + return -NLE_NOATTR; + + if (gso_max_size) + *gso_max_size = link->l_gso_max_size; + + return 0; +} + +/** * Return physical port id of link object * @arg link Link object * diff --git a/libnl-route-3.sym b/libnl-route-3.sym index 17be064f..af1ed2dd 100644 --- a/libnl-route-3.sym +++ b/libnl-route-3.sym @@ -959,6 +959,8 @@ global: rtnl_link_bridge_hwmode2str; rtnl_link_bridge_str2hwmode; rtnl_link_get_carrier_changes; + rtnl_link_get_gso_max_segs; + rtnl_link_get_gso_max_size; rtnl_link_get_phys_port_name; rtnl_link_get_phys_switch_id; rtnl_link_ipgre_get_pmtudisc; |