static bool facet_is_controller_flow(struct facet *);
+/* Node in 'ofport_dpif''s 'priorities' map. Used to maintain a map from
+ * 'priority' (the datapath's term for QoS queue) to the dscp bits which all
+ * traffic egressing the 'ofport' with that priority should be marked with. */
+struct priority_to_dscp {
+ struct hmap_node hmap_node; /* Node in 'ofport_dpif''s 'priorities' map. */
+ uint32_t priority; /* Priority of this queue (see struct flow). */
+
+ uint8_t dscp; /* DSCP bits to mark outgoing traffic with. */
+};
+
/* Linux VLAN device support (e.g. "eth0.10" for VLAN 10.)
*
* This is deprecated. It is only for compatibility with broken device drivers
}
}
-/* Returns true if STP should process 'flow'. */
-static bool
-stp_should_process_flow(const struct flow *flow)
+/* Returns true if STP should process 'flow'. Sets fields in 'wc' that
+ * were used to make the determination.*/
+bool
+stp_should_process_flow(const struct flow *flow, struct flow_wildcards *wc)
{
+ memset(&wc->masks.dl_dst, 0xff, sizeof wc->masks.dl_dst);
return eth_addr_equals(flow->dl_dst, eth_addr_stp);
}
-static void
+void
stp_process_packet(const struct ofport_dpif *ofport,
const struct ofpbuf *packet)
{
return dpif_queue_to_priority(ofproto->backer->dpif, queue_id, priority);
}
-struct priority_to_dscp *
+static struct priority_to_dscp *
get_priority(const struct ofport_dpif *ofport, uint32_t priority)
{
struct priority_to_dscp *pdscp;
return NULL;
}
+bool
+ofproto_dpif_dscp_from_priority(const struct ofport_dpif *ofport,
+ uint32_t priority, uint8_t *dscp)
+{
+ struct priority_to_dscp *pdscp = get_priority(ofport, priority);
+ *dscp = pdscp ? pdscp->dscp : 0;
+ return pdscp != NULL;
+}
+
static void
ofport_clear_priorities(struct ofport_dpif *ofport)
{
connmgr_send_packet_in(ofproto->up.connmgr, &pin);
}
-enum slow_path_reason
-process_special(struct ofproto_dpif *ofproto, const struct flow *flow,
- const struct ofport_dpif *ofport, const struct ofpbuf *packet)
-{
- if (!ofport) {
- return 0;
- } else if (ofport->cfm && cfm_should_process_flow(ofport->cfm, flow)) {
- if (packet) {
- cfm_process_heartbeat(ofport->cfm, packet);
- }
- return SLOW_CFM;
- } else if (ofport->bfd && bfd_should_process_flow(flow)) {
- if (packet) {
- bfd_process_packet(ofport->bfd, flow, packet);
- }
- return SLOW_BFD;
- } else if (ofport->bundle && ofport->bundle->lacp
- && flow->dl_type == htons(ETH_TYPE_LACP)) {
- if (packet) {
- lacp_process_packet(ofport->bundle->lacp, ofport, packet);
- }
- return SLOW_LACP;
- } else if (ofproto->stp && stp_should_process_flow(flow)) {
- if (packet) {
- stp_process_packet(ofport, packet);
- }
- return SLOW_STP;
- } else {
- return 0;
- }
-}
-
static struct flow_miss *
flow_miss_find(struct hmap *todo, const struct ofproto_dpif *ofproto,
const struct flow *flow, uint32_t hash)