#include "ofp-actions.h"
#include "ofproto/ofproto-dpif-ipfix.h"
#include "ofproto/ofproto-dpif-mirror.h"
+#include "ofproto/ofproto-dpif-monitor.h"
#include "ofproto/ofproto-dpif-sflow.h"
#include "ofproto/ofproto-dpif.h"
#include "ofproto/ofproto-provider.h"
/* Make the packet resemble the flow, so that it gets sent to
* an OpenFlow controller properly, so that it looks correct
* for sFlow, and so that flow_extract() will get the correct
- * vlan_tci if it is called on 'packet'.
- *
- * The allocated space inside 'packet' probably also contains
- * 'key', that is, both 'packet' and 'key' are probably part of
- * a struct dpif_upcall (see the large comment on that
- * structure definition), so pushing data on 'packet' is in
- * general not a good idea since it could overwrite 'key' or
- * free it as a side effect. However, it's OK in this special
- * case because we know that 'packet' is inside a Netlink
- * attribute: pushing 4 bytes will just overwrite the 4-byte
- * "struct nlattr", which is fine since we don't need that
- * header anymore. */
+ * vlan_tci if it is called on 'packet'. */
eth_push_vlan(packet, flow->vlan_tci);
}
/* We can't reproduce 'key' from 'flow'. */
bool has_mirror;
int out_vlan;
- has_mirror = mirror_get(xbridge->mbridge, mirror_mask_ffs(mirrors) - 1,
+ has_mirror = mirror_get(xbridge->mbridge, raw_ctz(mirrors),
&vlans, &dup_mirrors, &out, &out_vlan);
ovs_assert(has_mirror);
return vid ? vid : in_xbundle->vlan;
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
return true;
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
return vlan == out_xbundle->vlan ? 0 : vlan;
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
} else if (xport->bfd && bfd_should_process_flow(xport->bfd, flow, wc)) {
if (packet) {
bfd_process_packet(xport->bfd, flow, packet);
+ /* If POLL received, immediately sends FINAL back. */
+ if (bfd_should_send_packet(xport->bfd)) {
+ if (xport->peer) {
+ ofproto_dpif_monitor_port_send_soon(xport->ofport);
+ } else {
+ ofproto_dpif_monitor_port_send_soon_safe(xport->ofport);
+ }
+ }
}
return SLOW_BFD;
} else if (xport->xbundle && xport->xbundle->lacp
xlate_ff_group(ctx, group);
break;
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
group_dpif_release(group);
}
ofpacts = actions->ofpacts;
ofpacts_len = actions->ofpacts_len;
} else {
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
ofpbuf_use_stub(&ctx.stack, ctx.init_stack, sizeof ctx.init_stack);
goto out;
case OFPC_FRAG_REASM:
- NOT_REACHED();
+ OVS_NOT_REACHED();
case OFPC_FRAG_NX_MATCH:
/* Nothing to do. */
break;
case OFPC_INVALID_TTL_TO_CONTROLLER:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}