/*
- * Copyright (c) 2008, 2009 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2010 Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include <unistd.h>
#include "dynamic-string.h"
#include "list.h"
+#include "ofp-util.h"
#include "ofpbuf.h"
#include "ofproto.h"
#include "openflow/nicira-ext.h"
#include "svec.h"
#include "timeval.h"
#include "vconn.h"
-
-#define THIS_MODULE VLM_status
#include "vlog.h"
+VLOG_DEFINE_THIS_MODULE(status);
+
struct status_category {
struct list node;
char *name;
int
switch_status_handle_request(struct switch_status *ss, struct rconn *rconn,
- struct nicira_header *request)
+ const struct ofp_header *oh)
{
+ const struct nicira_header *request = (const struct nicira_header *) oh;
struct status_category *c;
struct nicira_header *reply;
struct status_reply sr;
sr.request.string = (void *) (request + 1);
sr.request.length = ntohs(request->header.length) - sizeof *request;
ds_init(&sr.output);
- LIST_FOR_EACH (c, struct status_category, node, &ss->categories) {
+ LIST_FOR_EACH (c, node, &ss->categories) {
if (!memcmp(c->name, sr.request.string,
MIN(strlen(c->name), sr.request.length))) {
sr.category = c;
c->cb(&sr, c->aux);
}
}
- reply = make_openflow_xid(sizeof *reply + sr.output.length,
- OFPT_VENDOR, request->header.xid, &b);
- reply->vendor = htonl(NX_VENDOR_ID);
- reply->subtype = htonl(NXT_STATUS_REPLY);
+ reply = make_nxmsg_xid(sizeof *reply + sr.output.length,
+ NXT_STATUS_REPLY, request->header.xid, &b);
memcpy(reply + 1, sr.output.string, sr.output.length);
retval = rconn_send(rconn, b, NULL);
if (retval && retval != EAGAIN) {
uint32_t remote_ip = rconn_get_remote_ip(rconn);
uint32_t local_ip = rconn_get_local_ip(rconn);
- status_reply_put(sr, "name=%s", rconn_get_name(rconn));
+ status_reply_put(sr, "name=%s", rconn_get_target(rconn));
if (remote_ip) {
status_reply_put(sr, "remote-ip="IP_FMT, IP_ARGS(&remote_ip));
- status_reply_put(sr, "remote-port=%d",
+ status_reply_put(sr, "remote-port=%d",
ntohs(rconn_get_remote_port(rconn)));
status_reply_put(sr, "local-ip="IP_FMT, IP_ARGS(&local_ip));
- status_reply_put(sr, "local-port=%d",
+ status_reply_put(sr, "local-port=%d",
ntohs(rconn_get_local_port(rconn)));
}
status_reply_put(sr, "state=%s", rconn_get_state(rconn));
config_status_cb(struct status_reply *sr, void *ofproto_)
{
const struct ofproto *ofproto = ofproto_;
- uint64_t datapath_id, mgmt_id;
- struct svec listeners;
- int probe_interval, max_backoff;
- size_t i;
+ uint64_t datapath_id;
datapath_id = ofproto_get_datapath_id(ofproto);
if (datapath_id) {
- status_reply_put(sr, "datapath-id=%"PRIx64, datapath_id);
- }
-
- mgmt_id = ofproto_get_mgmt_id(ofproto);
- if (mgmt_id) {
- status_reply_put(sr, "mgmt-id=%"PRIx64, mgmt_id);
- }
-
- svec_init(&listeners);
- ofproto_get_listeners(ofproto, &listeners);
- for (i = 0; i < listeners.n; i++) {
- status_reply_put(sr, "management%zu=%s", i, listeners.names[i]);
- }
- svec_destroy(&listeners);
-
- probe_interval = ofproto_get_probe_interval(ofproto);
- if (probe_interval) {
- status_reply_put(sr, "probe-interval=%d", probe_interval);
- }
-
- max_backoff = ofproto_get_max_backoff(ofproto);
- if (max_backoff) {
- status_reply_put(sr, "max-backoff=%d", max_backoff);
+ status_reply_put(sr, "datapath-id=%016"PRIx64, datapath_id);
}
}
struct switch_status *
switch_status_create(const struct ofproto *ofproto)
{
- struct switch_status *ss = xcalloc(1, sizeof *ss);
+ struct switch_status *ss = xzalloc(sizeof *ss);
ss->booted = time_now();
list_init(&ss->categories);
ss->config_cat = switch_status_register(ss, "config", config_status_cb,
/* Orphan any remaining categories, so that unregistering them later
* won't write to bad memory. */
struct status_category *c, *next;
- LIST_FOR_EACH_SAFE (c, next,
- struct status_category, node, &ss->categories) {
+ LIST_FOR_EACH_SAFE (c, next, node, &ss->categories) {
list_init(&c->node);
}
switch_status_unregister(ss->config_cat);