/** * Get flags * @arg link Link object of type bridge * * @see rtnl_link_bridge_set_flags() * @see rtnl_link_bridge_unset_flags() * * @return Flags or a negative error code. * @retval -NLE_OPNOTSUPP Link is not a bridge */ int rtnl_link_bridge_get_flags(struct rtnl_link *link) { struct bridge_data *bd = bridge_data(link); IS_BRIDGE_LINK_ASSERT(link); return bd->b_flags; }
/** * Get priority * @arg link Link object of type bridge * * @see rtnl_link_bridge_set_priority() * * @return 0 on success or a negative error code. * @retval -NLE_OPNOTSUPP Link is not a bridge */ int rtnl_link_bridge_get_priority(struct rtnl_link *link) { struct bridge_data *bd = bridge_data(link); IS_BRIDGE_LINK_ASSERT(link); return bd->b_priority; }
/** * Get Spanning Tree Protocol (STP) port state * @arg link Link object of type bridge * * @see rtnl_link_bridge_set_port_state() * * @return The STP port state or a negative error code. * @retval -NLE_OPNOTSUPP Link is not a bridge */ int rtnl_link_bridge_get_port_state(struct rtnl_link *link) { struct bridge_data *bd = bridge_data(link); IS_BRIDGE_LINK_ASSERT(link); return bd->b_port_state; }
/** * Set Spanning Tree Protocol (STP) path cost * @arg link Link object of type bridge * @arg cost New STP path cost value * * @see rtnl_link_bridge_get_cost() * * @return The bridge priority or a negative error code. * @retval -NLE_OPNOTSUPP Link is not a bridge */ int rtnl_link_bridge_set_cost(struct rtnl_link *link, uint32_t cost) { struct bridge_data *bd = bridge_data(link); IS_BRIDGE_LINK_ASSERT(link); bd->b_cost = cost; bd->ce_mask |= BRIDGE_ATTR_COST; return 0; }
/** * Set priority * @arg link Link object of type bridge * @arg prio Bridge priority * * @see rtnl_link_bridge_get_priority() * * @return 0 on success or a negative error code. * @retval -NLE_OPNOTSUPP Link is not a bridge */ int rtnl_link_bridge_set_priority(struct rtnl_link *link, uint16_t prio) { struct bridge_data *bd = bridge_data(link); IS_BRIDGE_LINK_ASSERT(link); bd->b_priority = prio; bd->ce_mask |= BRIDGE_ATTR_PRIORITY; return 0; }
/** * Set flags * @arg link Link object of type bridge * @arg flags Bridging flags to set * * Valid flags are: * - RTNL_BRIDGE_HAIRPIN_MODE * - RTNL_BRIDGE_BPDU_GUARD * - RTNL_BRIDGE_ROOT_BLOCK * - RTNL_BRIDGE_FAST_LEAVE * * @see rtnl_link_bridge_unset_flags() * @see rtnl_link_bridge_get_flags() * * @return 0 on success or a negative error code. * @retval -NLE_OPNOTSUPP Link is not a bridge */ int rtnl_link_bridge_set_flags(struct rtnl_link *link, unsigned int flags) { struct bridge_data *bd = bridge_data(link); IS_BRIDGE_LINK_ASSERT(link); bd->b_flags_mask |= flags; bd->b_flags |= flags; bd->ce_mask |= BRIDGE_ATTR_FLAGS; return 0; }
int rtnl_link_bridge_pvid(struct rtnl_link *link) { struct bridge_data *bd; IS_BRIDGE_LINK_ASSERT(link); bd = link->l_af_data[AF_BRIDGE]; if (bd->ce_mask & BRIDGE_ATTR_PORT_VLAN) return (int) bd->vlan_info.pvid; return -EINVAL; }
/** * Get Spanning Tree Protocol (STP) path cost * @arg link Link object of type bridge * @arg cost Pointer to store STP cost value * * @see rtnl_link_bridge_set_cost() * * @return 0 on success or a negative error code. * @retval -NLE_OPNOTSUPP Link is not a bridge * @retval -NLE_INVAL `cost` is not a valid pointer */ int rtnl_link_bridge_get_cost(struct rtnl_link *link, uint32_t *cost) { struct bridge_data *bd = bridge_data(link); IS_BRIDGE_LINK_ASSERT(link); if (!cost) return -NLE_INVAL; *cost = bd->b_cost; return 0; }
/** * Set Spanning Tree Protocol (STP) port state * @arg link Link object of type bridge * @arg state New STP port state * * The value of state must be one of the following: * - BR_STATE_DISABLED * - BR_STATE_LISTENING * - BR_STATE_LEARNING * - BR_STATE_FORWARDING * - BR_STATE_BLOCKING * * @see rtnl_link_bridge_get_port_state() * * @return 0 on success or a negative error code. * @retval -NLE_OPNOTSUPP Link is not a bridge * @retval -NLE_INVAL Invalid state value (0..BR_STATE_BLOCKING) */ int rtnl_link_bridge_set_port_state(struct rtnl_link *link, uint8_t state) { struct bridge_data *bd = bridge_data(link); IS_BRIDGE_LINK_ASSERT(link); if (state > BR_STATE_BLOCKING) return -NLE_INVAL; bd->b_port_state = state; bd->ce_mask |= BRIDGE_ATTR_PORT_STATE; return 0; }
int rtnl_link_bridge_has_vlan(struct rtnl_link *link) { struct bridge_data *bd; int i; IS_BRIDGE_LINK_ASSERT(link); bd = link->l_af_data[AF_BRIDGE]; if (bd->ce_mask & BRIDGE_ATTR_PORT_VLAN) { if (bd->vlan_info.pvid) return 1; for (i = 0; i < RTNL_LINK_BRIDGE_VLAN_BITMAP_LEN; ++i) { if (bd->vlan_info.vlan_bitmap[i] || bd->vlan_info.untagged_bitmap[i]) return 1; } } return 0; }