33 u32 dst_pol = port_cfg.
policy();
56 SwitchVlanInner::SwitchVlanInner(
SwitchCore* sw, VlanPolicy* vptr,
unsigned vmax,
bool lockdown)
81 if (dst_vid == 0 || dst_vid > m_vmax) tag_ok =
false;
88 if ((vmask & pkt.
src_mask()) == 0) tag_ok =
false;
98 u32 vpol = (policy.vrate.
tok_policy & 0xFF000000u);
99 u32 scale = (policy.vrate.
tok_policy & VRATE_SCALE_256X) ? 256 : 1;
100 u32 cost = satcat5::util::div_ceil(u32(pkt.
length()), scale);
102 if (cost > policy.tcount) {
112 policy.tcount -= cost;
127 for (
unsigned port = 0 ; port < pcount ; ++port) {
133 VlanPolicy vpol = lockdown ? VPOL_LOCK : VPOL_OPEN;
134 for (
unsigned vidx = 0 ; vidx < m_vmax ; ++vidx) {
135 m_policy[vidx] = vpol;
140 if (vid == 0 || vid > m_vmax)
return 0;
141 return m_policy[vid-1].pmask;
145 if (vid == 0 || vid > m_vmax)
return;
146 m_policy[vid-1].pmask = mask;
156 if (port) port->vlan_config(cfg);
160 if (vid == 0 || vid > m_vmax)
return;
161 satcat5::util::set_mask(m_policy[vid-1].pmask,
idx2mask(port));
165 if (vid == 0 || vid > m_vmax)
return;
166 satcat5::util::clr_mask(m_policy[vid-1].pmask,
idx2mask(port));
170 if (vid == 0 || vid > m_vmax)
return;
171 m_policy[vid-1].vrate = cfg;
172 m_policy[vid-1].tcount = cfg.
tok_max;
177 for (
unsigned a = 0 ; a < m_vmax ; ++a) {
178 m_policy[a].tcount = saturate_add(
180 m_policy[a].vrate.tok_rate,
Ethernet switch plugin API.
satcat5::eth::SwitchCore *const m_switch
Pointer to the associated SwitchCore object.
satcat5::eth::SwitchPort *const m_port
Pointer to the associated SwitchPort object.
A shared-memory Ethernet switch based on the MultiBuffer class.
satcat5::eth::SwitchPort * get_port(unsigned idx)
Fetch a SwitchPort object by port-index.
u32 port_count() const
Get the number of attached ports.
satcat5::eth::VtagPolicy vlan_config() const
Return this port's VLAN configuration.
Port plugin for egress formatting of Virtual-LAN tags.
Switch plugin for Virtual-LAN connectivity and rate-limiting rules.
void timer_event() override
Child class MUST override this method.
void vlan_reset(bool lockdown=false)
Revert to default VLAN settings for all ports and VIDs.
VtagPolicy vlan_get_port(unsigned port) const
Query a port's tag policy and other VLAN settings.
SATCAT5_PMASK_TYPE vlan_get_mask(u16 vid)
Get allowed-connectivity port-mask for designated VID.
void vlan_leave(u16 vid, unsigned port)
Port should leave VLAN, updating vlan_get_mask.
void vlan_set_port(const VtagPolicy &cfg)
Set a port's tag policy and other VLAN settings.
void vlan_join(u16 vid, unsigned port)
Port should join VLAN, updating vlan_get_mask.
void vlan_set_rate(u16 vid, const satcat5::eth::VlanRate &cfg)
Set rate-limiting options for the designated VID.
void vlan_set_mask(u16 vid, SATCAT5_PMASK_TYPE mask)
Limit the specified VID to the designated port(s).
void query(PluginPacket &pkt) override
Packet-received callback.
Diagnostic logging system for the Ethernet switch.
IEEE802.1Q Virtual-LAN plugin for the software-defined Ethernet switch.
#define SATCAT5_PMASK_TYPE
Set the integer type used to identify source and destination ports.
constexpr SATCAT5_PMASK_TYPE idx2mask(unsigned idx)
Macro converting port-index to a bit-mask.
Ephemeral data structure provided to plugin callbacks.
satcat5::io::MultiPacket * pkt
Complete packet contents.
void drop(u8 reason)
Drop this frame, indicating why.
unsigned length() const
Accessors and shortcuts for packet metadata.
SATCAT5_PMASK_TYPE dst_mask
Destination mask for which port(s) receive this packet.
SATCAT5_PMASK_TYPE src_mask() const
Accessors and shortcuts for packet metadata.
satcat5::eth::VtagPolicy port_vcfg() const
Accessors and shortcuts for packet metadata.
satcat5::eth::Header hdr
Copy of Ethernet header fields.
void adjust()
Notify parent that header contents have changed.
A single 24-byte packet-log message.
static constexpr u8 DROP_VLAN
Virtual-LAN policy.
static constexpr u8 DROP_VRATE
Virtual-LAN rate limits.
Data structure for configuring VLAN rate-limiter parameters.
u32 tok_max
Maximum accumulated tokens.
u32 tok_policy
Policy and scaling.
u16 pcp() const
Accessors for each individual field.
u16 value
The 16-bit value holds VID, DEI, and PCP fields.
bool any() const
Accessors for each individual field.
u16 vid() const
Accessors for each individual field.
void set(u16 vid, u16 dei, u16 pcp)
Accessors for each individual field.
u16 dei() const
Accessors for each individual field.
Data structure for configuring VLAN tagging policy of each port.
u32 policy() const
Accessors for each individual field.
unsigned port() const
Accessors for each individual field.
satcat5::eth::VlanTag vtag() const
Accessors for each individual field.
u16 m_priority
Packet priority.
constexpr satcat5::eth::VtagPolicy VCFG_DEFAULT(0, VTAG_ADMIT_ALL, VTAG_DEFAULT)
Default VLAN tagging policy.
constexpr u32 VTAG_RESTRICT
Define VLAN policy modes for a given switch port.
constexpr u32 VTAG_ADMIT_ALL
Define VLAN policy modes for a given switch port.
constexpr u32 VPOL_UNLIMITED
Define VLAN rate-limiter modes for each VID.
constexpr u32 VLAN_CONNECT_ALL
Common port-connection masks.
constexpr u32 VLAN_CONNECT_NONE
Common port-connection masks.
constexpr u32 VPOL_STRICT
Define VLAN rate-limiter modes for each VID.
constexpr satcat5::eth::VlanRate VRATE_UNLIMITED(VPOL_UNLIMITED, 0, 0)
Define some commonly-used rate-limiter configurations.
constexpr satcat5::eth::VlanRate VRATE_8KBPS(VPOL_STRICT, 8000ull, 4096)
Define some commonly-used rate-limiter configurations.
constexpr u32 VTAG_MANDATORY
Define VLAN policy modes for a given switch port.
constexpr u32 VPOL_AUTO
Define VLAN rate-limiter modes for each VID.
constexpr u32 VTAG_PRIORITY
Define VLAN policy modes for a given switch port.
constexpr u32 VPOL_DEMOTE
Define VLAN rate-limiter modes for each VID.
Miscellaneous mathematical utility functions.
constexpr T saturate_add(T a, T b, T c=T(-1))
Unsigned add with saturation: min(A + B, C).