-/* Copyright (c) 2008 The Board of Trustees of The Leland Stanford
+/* Copyright (c) 2008, 2009 The Board of Trustees of The Leland Stanford
* Junior University
*
* We are making the OpenFlow specification and associated documentation
{
int retval;
+again:
retval = (vconn->class->recv)(vconn, msgp);
if (!retval) {
struct ofp_header *oh;
&& oh->type != OFPT_VENDOR)
{
if (vconn->version < 0) {
+ if (oh->type == OFPT_PACKET_IN
+ || oh->type == OFPT_FLOW_EXPIRED
+ || oh->type == OFPT_PORT_STATUS) {
+ /* The kernel datapath is stateless and doesn't really
+ * support version negotiation, so it can end up sending
+ * these asynchronous message before version negotiation
+ * is complete. Just ignore them.
+ *
+ * (After we move OFPT_PORT_STATUS messages from the kernel
+ * into secchan, we won't get those here, since secchan
+ * does proper version negotiation.) */
+ ofpbuf_delete(*msgp);
+ goto again;
+ }
VLOG_ERR_RL(&rl, "%s: received OpenFlow message type %"PRIu8" "
"before version negotiation complete",
vconn->name, oh->type);