link: merge branch 'rtnl-attrs'

https://github.com/thom311/libnl/pull/119
This commit is contained in:
Thomas Haller
2016-12-06 15:14:16 +01:00
4 changed files with 149 additions and 2 deletions
+5
View File
@@ -215,11 +215,16 @@ 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 */
uint32_t l_carrier_changes;
struct rtnl_link_af_ops * l_af_ops;
struct nl_data * l_phys_port_id;
char l_phys_port_name[IFNAMSIZ];
struct nl_data * l_phys_switch_id;
int l_ns_fd;
pid_t l_ns_pid;
struct rtnl_link_vf * l_vf_list;
+10
View File
@@ -200,6 +200,8 @@ extern int rtnl_link_get_master(struct rtnl_link *);
extern void rtnl_link_set_carrier(struct rtnl_link *, uint8_t);
extern uint8_t rtnl_link_get_carrier(struct rtnl_link *);
extern int rtnl_link_get_carrier_changes(struct rtnl_link *, uint32_t *);
extern void rtnl_link_set_operstate(struct rtnl_link *, uint8_t);
extern uint8_t rtnl_link_get_operstate(struct rtnl_link *);
@@ -230,8 +232,16 @@ 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 *);
extern struct nl_data * rtnl_link_get_phys_switch_id(struct rtnl_link *);
extern void rtnl_link_set_ns_fd(struct rtnl_link *, int);
extern int rtnl_link_get_ns_fd(struct rtnl_link *);
extern void rtnl_link_set_ns_pid(struct rtnl_link *, pid_t);
+129 -2
View File
@@ -64,8 +64,13 @@
#define LINK_ATTR_NS_FD (1 << 29)
#define LINK_ATTR_NS_PID (1 << 30)
/* 31 used by 32-bit api */
#define LINK_ATTR_LINK_NETNSID ((uint64_t) 1 << 32)
#define LINK_ATTR_VF_LIST ((uint64_t) 1 << 33)
#define LINK_ATTR_LINK_NETNSID ((uint64_t) 1 << 32)
#define LINK_ATTR_VF_LIST ((uint64_t) 1 << 33)
#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;
@@ -275,6 +280,7 @@ static void link_free_data(struct nl_object *c)
do_foreach_af(link, af_free, NULL);
nl_data_free(link->l_phys_port_id);
nl_data_free(link->l_phys_switch_id);
if (link->ce_mask & LINK_ATTR_VF_LIST)
rtnl_link_sriov_free_data(link);
@@ -316,6 +322,10 @@ static int link_clone(struct nl_object *_dst, struct nl_object *_src)
if (!(dst->l_phys_port_id = nl_data_clone(src->l_phys_port_id)))
return -NLE_NOMEM;
if (src->l_phys_switch_id)
if (!(dst->l_phys_switch_id = nl_data_clone(src->l_phys_switch_id)))
return -NLE_NOMEM;
if (src->ce_mask & LINK_ATTR_VF_LIST)
if ((err = rtnl_link_sriov_clone(dst, src)) < 0)
return err;
@@ -346,9 +356,14 @@ 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 },
[IFLA_PHYS_PORT_ID] = { .type = NLA_UNSPEC },
[IFLA_PHYS_PORT_NAME] = { .type = NLA_STRING, .maxlen = IFNAMSIZ },
[IFLA_PHYS_SWITCH_ID] = { .type = NLA_UNSPEC },
[IFLA_NET_NS_PID] = { .type = NLA_U32 },
[IFLA_NET_NS_FD] = { .type = NLA_U32 },
};
@@ -520,6 +535,11 @@ int rtnl_link_info_parse(struct rtnl_link *link, struct nlattr **tb)
link->ce_mask |= LINK_ATTR_CARRIER;
}
if (tb[IFLA_CARRIER_CHANGES]) {
link->l_carrier_changes = nla_get_u32(tb[IFLA_CARRIER_CHANGES]);
link->ce_mask |= LINK_ATTR_CARRIER_CHANGES;
}
if (tb[IFLA_OPERSTATE]) {
link->l_operstate = nla_get_u8(tb[IFLA_OPERSTATE]);
link->ce_mask |= LINK_ATTR_OPERSTATE;
@@ -715,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;
@@ -729,6 +759,20 @@ static int link_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
link->ce_mask |= LINK_ATTR_PHYS_PORT_ID;
}
if (tb[IFLA_PHYS_PORT_NAME]) {
nla_strlcpy(link->l_phys_port_name, tb[IFLA_PHYS_PORT_NAME], IFNAMSIZ);
link->ce_mask |= LINK_ATTR_PHYS_PORT_NAME;
}
if (tb[IFLA_PHYS_SWITCH_ID]) {
link->l_phys_switch_id = nl_data_alloc_attr(tb[IFLA_PHYS_SWITCH_ID]);
if (link->l_phys_switch_id == NULL) {
err = -NLE_NOMEM;
goto errout;
}
link->ce_mask |= LINK_ATTR_PHYS_SWITCH_ID;
}
err = pp->pp_cb((struct nl_object *) link, pp);
errout:
rtnl_link_af_ops_put(af_ops);
@@ -888,6 +932,9 @@ static void link_dump_details(struct nl_object *obj, struct nl_dump_params *p)
nl_dump(p, "carrier %s",
rtnl_link_carrier2str(link->l_carrier, buf, sizeof(buf)));
if (link->ce_mask & LINK_ATTR_CARRIER_CHANGES)
nl_dump(p, " carrier-changes %u", link->l_carrier_changes);
nl_dump(p, "\n");
if (link->l_info_ops && link->l_info_ops->io_dump[NL_DUMP_DETAILS])
@@ -1115,9 +1162,14 @@ 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),
__ADD(LINK_ATTR_PHYS_PORT_ID, phys_port_id),
__ADD(LINK_ATTR_PHYS_PORT_NAME, phys_port_name),
__ADD(LINK_ATTR_PHYS_SWITCH_ID, phys_switch_id),
__ADD(LINK_ATTR_NS_FD, ns_fd),
__ADD(LINK_ATTR_NS_PID, ns_pid),
__ADD(LINK_ATTR_LINK_NETNSID, link_netnsid),
@@ -2272,6 +2324,23 @@ uint8_t rtnl_link_get_carrier(struct rtnl_link *link)
return link->l_carrier;
}
/**
* Return carrier on/off changes of link object
* @arg link Link object
*
* @return Carrier changes.
*/
int rtnl_link_get_carrier_changes(struct rtnl_link *link, uint32_t *carrier_changes)
{
if (!(link->ce_mask & LINK_ATTR_CARRIER_CHANGES))
return -NLE_NOATTR;
if (carrier_changes)
*carrier_changes = link->l_carrier_changes;
return 0;
}
/**
* Set operational status of link object
* @arg link Link object
@@ -2598,6 +2667,42 @@ uint32_t rtnl_link_get_num_rx_queues(struct rtnl_link *link)
return link->l_num_rx_queues;
}
/**
* 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
@@ -2609,6 +2714,28 @@ struct nl_data *rtnl_link_get_phys_port_id(struct rtnl_link *link)
return link->l_phys_port_id;
}
/**
* Return physical port name of link object
* @arg link Link object
*
* @return Physical port name or NULL if not set.
*/
char *rtnl_link_get_phys_port_name(struct rtnl_link *link)
{
return link->l_phys_port_name;
}
/*
* Return physical switch id of link object
* @arg link Link object
*
* @return Physical switch id or NULL if not set.
*/
struct nl_data *rtnl_link_get_phys_switch_id(struct rtnl_link *link)
{
return link->l_phys_switch_id;
}
void rtnl_link_set_ns_fd(struct rtnl_link *link, int fd)
{
link->l_ns_fd = fd;
+5
View File
@@ -958,6 +958,11 @@ global:
rtnl_link_bridge_set_hwmode;
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;
rtnl_link_is_ipgretap;
rtnl_link_macvlan_add_macaddr;