*/
#include <config.h>
-#include "vconn.h"
+#include "vconn-provider.h"
#include <assert.h>
#include <errno.h>
#include <inttypes.h>
&punix_vconn_class,
};
+/* High rate limit because most of the rate-limiting here is individual
+ * OpenFlow messages going over the vconn. If those are enabled then we
+ * really need to see them. */
+static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(600, 600);
+
/* Check the validity of the vconn class structures. */
static void
check_vconn_classes(void)
if (!retval) {
assert(vconn->connect_status != EAGAIN
|| vconn->class->connect);
+ vconn->name = xstrdup(name);
*vconnp = vconn;
}
return retval;
vconn_close(struct vconn *vconn)
{
if (vconn != NULL) {
+ char *name = vconn->name;
(vconn->class->close)(vconn);
+ free(name);
}
}
+/* Returns the name of 'vconn', that is, the string passed to vconn_open(). */
+const char *
+vconn_get_name(const struct vconn *vconn)
+{
+ return vconn->name;
+}
+
/* Returns true if 'vconn' is a passive vconn, that is, its purpose is to
* wait for connections to arrive, not to transfer data. Returns false if
* 'vconn' is an active vconn, that is, its purpose is to transfer data, not
if (VLOG_IS_DBG_ENABLED()) {
char *s = ofp_to_string((*msgp)->data, (*msgp)->size, 1);
- VLOG_DBG("received: %s", s);
+ VLOG_DBG_RL(&rl, "%s: received: %s", vconn->name, s);
free(s);
}
oh = buffer_at_assert(*msgp, 0, sizeof *oh);
if (oh->version != OFP_VERSION) {
- VLOG_ERR("received OpenFlow version %02"PRIx8" "
- "!= expected %02x",
- oh->version, OFP_VERSION);
+ VLOG_ERR_RL(&rl, "%s: received OpenFlow version %02"PRIx8" "
+ "!= expected %02x",
+ vconn->name, oh->version, OFP_VERSION);
buffer_delete(*msgp);
*msgp = NULL;
return EPROTO;
char *s = ofp_to_string(msg->data, msg->size, 1);
retval = (vconn->class->send)(vconn, msg);
if (retval != EAGAIN) {
- VLOG_DBG("sent (%s): %s", strerror(retval), s);
+ VLOG_DBG_RL(&rl, "%s: sent (%s): %s", vconn->name, strerror(retval), s);
}
free(s);
}
int retval;
while ((retval = vconn_send(vconn, msg)) == EAGAIN) {
vconn_send_wait(vconn);
- VLOG_DBG("blocking on vconn send");
poll_block();
}
return retval;
int retval;
while ((retval = vconn_recv(vconn, msgp)) == EAGAIN) {
vconn_recv_wait(vconn);
- VLOG_DBG("blocking on vconn receive");
poll_block();
}
return retval;
return 0;
}
- VLOG_DBG("received reply with xid %08"PRIx32" != expected %08"PRIx32,
- recv_xid, send_xid);
+ VLOG_DBG_RL(&rl, "%s: received reply with xid %08"PRIx32" != expected "
+ "%08"PRIx32, vconn->name, recv_xid, send_xid);
buffer_delete(reply);
}
}
size_t size = sizeof *opo + sizeof opo->actions[0];
struct buffer *out = buffer_new(size + packet->size);
opo = buffer_put_uninit(out, size);
- memset(opo, 0, sizeof *opo);
+ memset(opo, 0, size);
opo->header.version = OFP_VERSION;
opo->header.type = OFPT_PACKET_OUT;
opo->buffer_id = htonl(UINT32_MAX);
reply->type = OFPT_ECHO_REPLY;
return out;
}
+
+void
+vconn_init(struct vconn *vconn, struct vconn_class *class, int connect_status,
+ uint32_t ip, const char *name)
+{
+ vconn->class = class;
+ vconn->connect_status = connect_status;
+ vconn->ip = ip;
+ vconn->name = xstrdup(name);
+}
+