• Home
  • Raw
  • Download

Lines Matching +full:- +full:bd

1 /* SPDX-License-Identifier: LGPL-2.1-only */
3 * Copyright (c) 2010-2013 Thomas Graf <tgraf@suug.ch>
14 #include "nl-default.h"
23 #include "nl-route.h"
24 #include "link-api.h"
25 #include "nl-priv-dynamic-core/nl-core.h"
26 #include "nl-priv-static-route/nl-priv-static-route.h"
71 _nl_assert(vid / 32u < ARRAY_SIZE(vlan_info->untagged_bitmap)); in vlan_id_untagged()
73 mask = vlan_info->untagged_bitmap[vid / 32]; in vlan_id_untagged()
84 return -1; in find_next_bit()
100 return -NLE_OPNOTSUPP; \
115 struct bridge_data *bd; in bridge_clone() local
117 if ((bd = bridge_alloc(link))) in bridge_clone()
118 memcpy(bd, data, sizeof(*bd)); in bridge_clone()
120 return bd; in bridge_clone()
151 struct bridge_data *bd = data; in bridge_parse_protinfo() local
158 return -NLE_RANGE; in bridge_parse_protinfo()
160 bd->b_port_state = nla_get_u8(attr); in bridge_parse_protinfo()
161 bd->ce_mask |= BRIDGE_ATTR_PORT_STATE; in bridge_parse_protinfo()
170 bd->b_priv_flags |= PRIV_FLAG_NEW_ATTRS; in bridge_parse_protinfo()
173 bd->b_port_state = nla_get_u8(br_attrs[IFLA_BRPORT_STATE]); in bridge_parse_protinfo()
174 bd->ce_mask |= BRIDGE_ATTR_PORT_STATE; in bridge_parse_protinfo()
178 bd->b_priority = nla_get_u16(br_attrs[IFLA_BRPORT_PRIORITY]); in bridge_parse_protinfo()
179 bd->ce_mask |= BRIDGE_ATTR_PRIORITY; in bridge_parse_protinfo()
183 bd->b_cost = nla_get_u32(br_attrs[IFLA_BRPORT_COST]); in bridge_parse_protinfo()
184 bd->ce_mask |= BRIDGE_ATTR_COST; in bridge_parse_protinfo()
203 struct bridge_data *bd = data; in bridge_parse_af_full() local
206 uint16_t vid_range_flags = -1; in bridge_parse_af_full()
214 bd->b_hwmode = nla_get_u16(attr); in bridge_parse_af_full()
215 bd->ce_mask |= BRIDGE_ATTR_HWMODE; in bridge_parse_af_full()
221 return -EINVAL; in bridge_parse_af_full()
224 if (!vinfo->vid || vinfo->vid >= VLAN_VID_MASK) in bridge_parse_af_full()
225 return -EINVAL; in bridge_parse_af_full()
228 if (vinfo->flags & BRIDGE_VLAN_INFO_RANGE_BEGIN) { in bridge_parse_af_full()
229 vid_range_start = vinfo->vid; in bridge_parse_af_full()
230 vid_range_flags = (vinfo->flags ^ BRIDGE_VLAN_INFO_RANGE_BEGIN); in bridge_parse_af_full()
234 if (vinfo->flags & BRIDGE_VLAN_INFO_RANGE_END) { in bridge_parse_af_full()
236 if (vid_range_flags != (vinfo->flags ^ BRIDGE_VLAN_INFO_RANGE_END)) { in bridge_parse_af_full()
238 return -EINVAL; in bridge_parse_af_full()
241 vid_range_start = vinfo->vid; in bridge_parse_af_full()
244 for (; vid_range_start <= vinfo->vid; vid_range_start++) { in bridge_parse_af_full()
245 if (vinfo->flags & BRIDGE_VLAN_INFO_PVID) in bridge_parse_af_full()
246 bd->vlan_info.pvid = vinfo->vid; in bridge_parse_af_full()
248 if (vinfo->flags & BRIDGE_VLAN_INFO_UNTAGGED) in bridge_parse_af_full()
249 set_bit(vid_range_start, bd->vlan_info.untagged_bitmap); in bridge_parse_af_full()
251 set_bit(vid_range_start, bd->vlan_info.vlan_bitmap); in bridge_parse_af_full()
252 bd->ce_mask |= BRIDGE_ATTR_PORT_VLAN; in bridge_parse_af_full()
255 vid_range_flags = -1; in bridge_parse_af_full()
264 int i = -1, j, k; in _nl_bridge_fill_vlan_info()
265 int start = -1, prev = -1; in _nl_bridge_fill_vlan_info()
272 uint32_t a = vlan_info->vlan_bitmap[k]; in _nl_bridge_fill_vlan_info()
275 i = -1; in _nl_bridge_fill_vlan_info()
283 if (vlan_info->pvid != 0 && j - 1 + base_bit == vlan_info->pvid) in _nl_bridge_fill_vlan_info()
288 start = prev = j - 1 + base_bit; in _nl_bridge_fill_vlan_info()
297 if (j - 2 + base_bit == prev) in _nl_bridge_fill_vlan_info()
304 if (start == prev-1) in _nl_bridge_fill_vlan_info()
317 vinfo.vid = prev-1; in _nl_bridge_fill_vlan_info()
334 if (done && k < RTNL_LINK_BRIDGE_VLAN_BITMAP_LEN - 1) in _nl_bridge_fill_vlan_info()
358 start = prev = j - 1 + base_bit; in _nl_bridge_fill_vlan_info()
369 if (vlan_info->pvid != 0) in _nl_bridge_fill_vlan_info()
371 untagged = vlan_id_untagged(vlan_info,vlan_info->pvid); in _nl_bridge_fill_vlan_info()
374 vinfo.vid = vlan_info->pvid; in _nl_bridge_fill_vlan_info()
381 return -NLE_MSGSIZE; in _nl_bridge_fill_vlan_info()
387 struct bridge_data *bd = data; in bridge_fill_af() local
389 if (bd->ce_mask & BRIDGE_ATTR_HWMODE) in bridge_fill_af()
391 NLA_PUT_U16(msg, IFLA_BRIDGE_MODE, bd->b_hwmode); in bridge_fill_af()
392 bd->b_config_mode = BRIDGE_FLAGS_SELF; in bridge_fill_af()
393 bd->ce_mask |= BRIDGE_ATTR_CONFIG_MODE; in bridge_fill_af()
396 if (bd->ce_mask & BRIDGE_ATTR_CONFIG_MODE) in bridge_fill_af()
397 NLA_PUT_U16(msg, IFLA_BRIDGE_FLAGS, bd->b_config_mode); in bridge_fill_af()
399 if (bd->ce_mask & BRIDGE_ATTR_PORT_VLAN) { in bridge_fill_af()
400 if (_nl_bridge_fill_vlan_info(msg, &bd->vlan_info)) { in bridge_fill_af()
408 return -NLE_MSGSIZE; in bridge_fill_af()
414 struct bridge_data *bd = data; in bridge_fill_pi() local
416 if (bd->ce_mask & BRIDGE_ATTR_FLAGS) { in bridge_fill_pi()
417 if (bd->b_flags_mask & RTNL_BRIDGE_BPDU_GUARD) { in bridge_fill_pi()
419 bd->b_flags & RTNL_BRIDGE_BPDU_GUARD); in bridge_fill_pi()
421 if (bd->b_flags_mask & RTNL_BRIDGE_HAIRPIN_MODE) { in bridge_fill_pi()
423 bd->b_flags & RTNL_BRIDGE_HAIRPIN_MODE); in bridge_fill_pi()
425 if (bd->b_flags_mask & RTNL_BRIDGE_FAST_LEAVE) { in bridge_fill_pi()
427 bd->b_flags & RTNL_BRIDGE_FAST_LEAVE); in bridge_fill_pi()
429 if (bd->b_flags_mask & RTNL_BRIDGE_ROOT_BLOCK) { in bridge_fill_pi()
431 bd->b_flags & RTNL_BRIDGE_ROOT_BLOCK); in bridge_fill_pi()
433 if (bd->b_flags_mask & RTNL_BRIDGE_UNICAST_FLOOD) { in bridge_fill_pi()
435 bd->b_flags & RTNL_BRIDGE_UNICAST_FLOOD); in bridge_fill_pi()
437 if (bd->b_flags_mask & RTNL_BRIDGE_LEARNING) { in bridge_fill_pi()
439 bd->b_flags & RTNL_BRIDGE_LEARNING); in bridge_fill_pi()
441 if (bd->b_flags_mask & RTNL_BRIDGE_LEARNING_SYNC) { in bridge_fill_pi()
443 bd->b_flags & RTNL_BRIDGE_LEARNING_SYNC); in bridge_fill_pi()
447 if (bd->ce_mask & BRIDGE_ATTR_COST) in bridge_fill_pi()
448 NLA_PUT_U32(msg, IFLA_BRPORT_COST, bd->b_cost); in bridge_fill_pi()
450 if (bd->ce_mask & BRIDGE_ATTR_PRIORITY) in bridge_fill_pi()
451 NLA_PUT_U16(msg, IFLA_BRPORT_PRIORITY, bd->b_priority); in bridge_fill_pi()
453 if (bd->ce_mask & BRIDGE_ATTR_PORT_STATE) in bridge_fill_pi()
454 NLA_PUT_U8(msg, IFLA_BRPORT_STATE, bd->b_port_state); in bridge_fill_pi()
459 return -NLE_MSGSIZE; in bridge_fill_pi()
463 struct bridge_data *bd; in bridge_override_rtm() local
468 bd = bridge_data(link); in bridge_override_rtm()
470 if (bd->ce_mask & BRIDGE_ATTR_FLAGS) in bridge_override_rtm()
484 int i = -1, j, k; in dump_bitmap()
485 int start = -1, prev = -1; in dump_bitmap()
493 i = -1; in dump_bitmap()
500 start = prev = j - 1 + base_bit; in dump_bitmap()
504 if (j - 2 + base_bit == prev) { in dump_bitmap()
513 if (done && k < RTNL_LINK_BRIDGE_VLAN_BITMAP_LEN - 1) in dump_bitmap()
518 nl_dump(p, "-%d", prev); in dump_bitmap()
524 start = prev = j - 1 + base_bit; in dump_bitmap()
536 struct bridge_data *bd) in rtnl_link_bridge_dump_vlans() argument
538 nl_dump(p, "pvid %u", bd->vlan_info.pvid); in rtnl_link_bridge_dump_vlans()
541 dump_bitmap(p, bd->vlan_info.vlan_bitmap); in rtnl_link_bridge_dump_vlans()
544 dump_bitmap(p, bd->vlan_info.untagged_bitmap); in rtnl_link_bridge_dump_vlans()
550 struct bridge_data *bd = data; in bridge_dump_details() local
554 if (bd->ce_mask & BRIDGE_ATTR_PORT_STATE) in bridge_dump_details()
555 nl_dump(p, "port-state %u ", bd->b_port_state); in bridge_dump_details()
557 if (bd->ce_mask & BRIDGE_ATTR_PRIORITY) in bridge_dump_details()
558 nl_dump(p, "prio %u ", bd->b_priority); in bridge_dump_details()
560 if (bd->ce_mask & BRIDGE_ATTR_COST) in bridge_dump_details()
561 nl_dump(p, "cost %u ", bd->b_cost); in bridge_dump_details()
563 if (bd->ce_mask & BRIDGE_ATTR_HWMODE) { in bridge_dump_details()
566 rtnl_link_bridge_hwmode2str(bd->b_hwmode, hbuf, sizeof(hbuf)); in bridge_dump_details()
570 if (bd->ce_mask & BRIDGE_ATTR_PORT_VLAN) in bridge_dump_details()
571 rtnl_link_bridge_dump_vlans(p, bd); in bridge_dump_details()
573 if (bd->ce_mask & BRIDGE_ATTR_FLAGS) { in bridge_dump_details()
576 rtnl_link_bridge_flags2str(bd->b_flags & bd->b_flags_mask, in bridge_dump_details()
593 a->b_port_state != b->b_port_state); in bridge_compare()
594 diff |= _DIFF(BRIDGE_ATTR_PRIORITY, a->b_priority != b->b_priority); in bridge_compare()
595 diff |= _DIFF(BRIDGE_ATTR_COST, a->b_cost != b->b_cost); in bridge_compare()
597 memcmp(&a->vlan_info, &b->vlan_info, in bridge_compare()
599 diff |= _DIFF(BRIDGE_ATTR_HWMODE, a->b_hwmode != b->b_hwmode); in bridge_compare()
600 diff |= _DIFF(BRIDGE_ATTR_CONFIG_MODE, a->b_config_mode != b->b_config_mode); in bridge_compare()
604 (a->b_flags ^ b->b_flags) & b->b_flags_mask); in bridge_compare()
606 diff |= _DIFF(BRIDGE_ATTR_FLAGS, a->b_flags != b->b_flags); in bridge_compare()
650 return -NLE_NOMEM; in rtnl_link_bridge_add()
669 return link->l_family == AF_BRIDGE && in rtnl_link_is_bridge()
670 link->l_af_ops == &bridge_ops; in rtnl_link_is_bridge()
680 * - rtnl_link_bridge_get_cost()
681 * - rtnl_link_bridge_get_priority()
682 * - rtnl_link_bridge_get_flags()
688 struct bridge_data *bd; in rtnl_link_bridge_has_ext_info() local
693 bd = bridge_data(link); in rtnl_link_bridge_has_ext_info()
694 return !!(bd->b_priv_flags & PRIV_FLAG_NEW_ATTRS); in rtnl_link_bridge_has_ext_info()
703 * - BR_STATE_DISABLED
704 * - BR_STATE_LISTENING
705 * - BR_STATE_LEARNING
706 * - BR_STATE_FORWARDING
707 * - BR_STATE_BLOCKING
712 * @retval -NLE_OPNOTSUPP Link is not a bridge
713 * @retval -NLE_INVAL Invalid state value (0..BR_STATE_BLOCKING)
717 struct bridge_data *bd = bridge_data(link); in rtnl_link_bridge_set_port_state() local
722 return -NLE_INVAL; in rtnl_link_bridge_set_port_state()
724 bd->b_port_state = state; in rtnl_link_bridge_set_port_state()
725 bd->ce_mask |= BRIDGE_ATTR_PORT_STATE; in rtnl_link_bridge_set_port_state()
737 * @retval -NLE_OPNOTSUPP Link is not a bridge
741 struct bridge_data *bd = bridge_data(link); in rtnl_link_bridge_get_port_state() local
745 return bd->b_port_state; in rtnl_link_bridge_get_port_state()
756 * @retval -NLE_OPNOTSUPP Link is not a bridge
760 struct bridge_data *bd = bridge_data(link); in rtnl_link_bridge_set_priority() local
764 bd->b_priority = prio; in rtnl_link_bridge_set_priority()
765 bd->ce_mask |= BRIDGE_ATTR_PRIORITY; in rtnl_link_bridge_set_priority()
777 * @retval -NLE_OPNOTSUPP Link is not a bridge
781 struct bridge_data *bd = bridge_data(link); in rtnl_link_bridge_get_priority() local
785 return bd->b_priority; in rtnl_link_bridge_get_priority()
796 * @retval -NLE_OPNOTSUPP Link is not a bridge
800 struct bridge_data *bd = bridge_data(link); in rtnl_link_bridge_set_cost() local
804 bd->b_cost = cost; in rtnl_link_bridge_set_cost()
805 bd->ce_mask |= BRIDGE_ATTR_COST; in rtnl_link_bridge_set_cost()
818 * @retval -NLE_OPNOTSUPP Link is not a bridge
819 * @retval -NLE_INVAL `cost` is not a valid pointer
823 struct bridge_data *bd = bridge_data(link); in rtnl_link_bridge_get_cost() local
828 return -NLE_INVAL; in rtnl_link_bridge_get_cost()
830 *cost = bd->b_cost; in rtnl_link_bridge_get_cost()
844 * @retval -NLE_OPNOTSUPP Link is not a bridge
848 struct bridge_data *bd = bridge_data(link); in rtnl_link_bridge_unset_flags() local
852 bd->b_flags_mask |= flags; in rtnl_link_bridge_unset_flags()
853 bd->b_flags &= ~flags; in rtnl_link_bridge_unset_flags()
854 bd->ce_mask |= BRIDGE_ATTR_FLAGS; in rtnl_link_bridge_unset_flags()
865 * - RTNL_BRIDGE_HAIRPIN_MODE
866 * - RTNL_BRIDGE_BPDU_GUARD
867 * - RTNL_BRIDGE_ROOT_BLOCK
868 * - RTNL_BRIDGE_FAST_LEAVE
869 * - RTNL_BRIDGE_UNICAST_FLOOD
870 * - RTNL_BRIDGE_LEARNING
871 * - RTNL_BRIDGE_LEARNING_SYNC
877 * @retval -NLE_OPNOTSUPP Link is not a bridge
881 struct bridge_data *bd = bridge_data(link); in rtnl_link_bridge_set_flags() local
885 bd->b_flags_mask |= flags; in rtnl_link_bridge_set_flags()
886 bd->b_flags |= flags; in rtnl_link_bridge_set_flags()
887 bd->ce_mask |= BRIDGE_ATTR_FLAGS; in rtnl_link_bridge_set_flags()
900 * @retval -NLE_OPNOTSUPP Link is not a bridge
904 struct bridge_data *bd = bridge_data(link); in rtnl_link_bridge_get_flags() local
908 return bd->b_flags; in rtnl_link_bridge_get_flags()
920 * @return -NLE_OPNOTSUP Link is not a bridge
924 struct bridge_data *bd = bridge_data(link); in rtnl_link_bridge_set_self() local
928 bd->b_config_mode = BRIDGE_FLAGS_SELF; in rtnl_link_bridge_set_self()
929 bd->ce_mask |= BRIDGE_ATTR_CONFIG_MODE; in rtnl_link_bridge_set_self()
943 * @return -NLE_OPNOTSUP Link is not a bridge
947 struct bridge_data *bd = bridge_data(link); in rtnl_link_bridge_set_master() local
951 bd->b_config_mode = BRIDGE_FLAGS_MASTER; in rtnl_link_bridge_set_master()
952 bd->ce_mask |= BRIDGE_ATTR_CONFIG_MODE; in rtnl_link_bridge_set_master()
965 * @return -NLE_NOATTR if hardware mode is not present
966 * @return -NLE_OPNOTSUP Link is not a bridge
970 struct bridge_data *bd = bridge_data(link); in rtnl_link_bridge_get_hwmode() local
974 if (!(bd->ce_mask & BRIDGE_ATTR_HWMODE)) in rtnl_link_bridge_get_hwmode()
975 return -NLE_NOATTR; in rtnl_link_bridge_get_hwmode()
977 *hwmode = bd->b_hwmode; in rtnl_link_bridge_get_hwmode()
991 * - RTNL_BRIDGE_HWMODE_VEB
992 * - RTNL_BRIDGE_HWMODE_VEPA
998 * @return -NLE_OPNOTSUP Link is not a bridge
999 * @return -NLE_INVAL when specified hwmode is unsupported.
1004 struct bridge_data *bd = bridge_data(link); in rtnl_link_bridge_set_hwmode() local
1007 return -NLE_INVAL; in rtnl_link_bridge_set_hwmode()
1012 bd->b_hwmode = hwmode; in rtnl_link_bridge_set_hwmode()
1013 bd->ce_mask |= BRIDGE_ATTR_HWMODE; in rtnl_link_bridge_set_hwmode()
1098 * @return -NLE_OPNOTSUP Link is not a bridge
1102 struct bridge_data *bd = bridge_data(link); in rtnl_link_bridge_enable_vlan() local
1106 bd->ce_mask |= BRIDGE_ATTR_PORT_VLAN; in rtnl_link_bridge_enable_vlan()
1125 * Supported range is 1-4094
1128 * @return -NLE_NOATTR if port vlan attribute not present
1129 * @return -NLE_OPNOTSUP Link is not a bridge
1130 * @return -NLE_INVAL range is not in supported range.
1141 return -NLE_NOATTR; in rtnl_link_bridge_set_port_vlan_map_range()
1144 return -NLE_INVAL; in rtnl_link_bridge_set_port_vlan_map_range()
1148 set_bit(i,vinfo->vlan_bitmap); in rtnl_link_bridge_set_port_vlan_map_range()
1150 set_bit(i,vinfo->untagged_bitmap); in rtnl_link_bridge_set_port_vlan_map_range()
1152 unset_bit(i,vinfo->untagged_bitmap); in rtnl_link_bridge_set_port_vlan_map_range()
1166 * Supported range is 1-4094
1169 * @return -NLE_NOATTR if port vlan attribute not present
1170 * @return -NLE_OPNOTSUP Link is not a bridge
1171 * @return -NLE_INVAL range is not in supported range.
1182 return -NLE_NOATTR; in rtnl_link_bridge_unset_port_vlan_map_range()
1185 return -NLE_INVAL; in rtnl_link_bridge_unset_port_vlan_map_range()
1189 unset_bit(i,vinfo->vlan_bitmap); in rtnl_link_bridge_unset_port_vlan_map_range()
1190 unset_bit(i,vinfo->untagged_bitmap); in rtnl_link_bridge_unset_port_vlan_map_range()
1202 * Supported range is 0-4094, Setting pvid to 0 will unset it.
1208 * @return -NLE_NOATTR if port vlan attribute not present
1209 * @return -NLE_OPNOTSUP Link is not a bridge
1210 * @return -NLE_INVAL PVID is above supported range.
1221 return -NLE_NOATTR; in rtnl_link_bridge_set_port_vlan_pvid()
1224 return -NLE_INVAL; in rtnl_link_bridge_set_port_vlan_pvid()
1226 vinfo->pvid = pvid; in rtnl_link_bridge_set_port_vlan_pvid()
1235 struct bridge_data *bd; in rtnl_link_bridge_pvid() local
1239 bd = link->l_af_data[AF_BRIDGE]; in rtnl_link_bridge_pvid()
1240 if (bd->ce_mask & BRIDGE_ATTR_PORT_VLAN) in rtnl_link_bridge_pvid()
1241 return (int) bd->vlan_info.pvid; in rtnl_link_bridge_pvid()
1243 return -EINVAL; in rtnl_link_bridge_pvid()
1248 struct bridge_data *bd; in rtnl_link_bridge_has_vlan() local
1253 bd = link->l_af_data[AF_BRIDGE]; in rtnl_link_bridge_has_vlan()
1254 if (bd->ce_mask & BRIDGE_ATTR_PORT_VLAN) { in rtnl_link_bridge_has_vlan()
1255 if (bd->vlan_info.pvid) in rtnl_link_bridge_has_vlan()
1259 if (bd->vlan_info.vlan_bitmap[i] || in rtnl_link_bridge_has_vlan()
1260 bd->vlan_info.untagged_bitmap[i]) in rtnl_link_bridge_has_vlan()
1274 data = link->l_af_data[AF_BRIDGE]; in rtnl_link_bridge_get_port_vlan()
1275 if (data && (data->ce_mask & BRIDGE_ATTR_PORT_VLAN)) in rtnl_link_bridge_get_port_vlan()
1276 return &data->vlan_info; in rtnl_link_bridge_get_port_vlan()