{
char *s;
char *id_str, *dst, *save_ptr;
+ uint16_t port;
ofpact_init_AUTOPATH(ap);
ovs_fatal(0, "%s: not enough arguments to autopath action", s_);
}
- ap->port = ofputil_port_from_string(id_str);
- if (!ap->port) {
+ if (!ofputil_port_from_string(id_str, &port)) {
ovs_fatal(0, "%s: bad port number", s_);
}
+ ap->port = port;
mf_parse_subfield(&ap->dst, dst);
if (ap->dst.n_bits < 16) {
break;
}
- slave_port = ofputil_port_from_string(slave);
- if (!slave_port) {
+ if (!ofputil_port_from_string(slave, &slave_port)) {
ovs_fatal(0, "%s: bad port number", slave);
}
ofpbuf_put(ofpacts, &slave_port, sizeof slave_port);
uint16_t port;
assert(mf->n_bytes == sizeof(ovs_be16));
- port = ofputil_port_from_string(s);
- if (port) {
+ if (ofputil_port_from_string(s, &port)) {
*valuep = htons(port);
*maskp = htons(UINT16_MAX);
return NULL;
in_port_s = strsep(&arg, ",");
if (in_port_s && in_port_s[0]) {
- resubmit->in_port = ofputil_port_from_string(in_port_s);
- if (!resubmit->in_port) {
+ if (!ofputil_port_from_string(in_port_s, &resubmit->in_port)) {
ovs_fatal(0, "%s: resubmit to unknown port", in_port_s);
}
} else {
}
return false;
} else {
- uint16_t port = ofputil_port_from_string(act);
- if (port) {
+ uint16_t port;
+ if (ofputil_port_from_string(act, &port)) {
ofpact_put_OUTPUT(ofpacts)->port = port;
} else {
ovs_fatal(0, "Unknown action: %s", act);
if (!strcmp(name, "table")) {
fm->table_id = str_to_table_id(value);
} else if (!strcmp(name, "out_port")) {
- fm->out_port = ofputil_port_from_string(name);
- if (!fm->out_port) {
+ if (!ofputil_port_from_string(name, &fm->out_port)) {
ofp_fatal(str_, verbose, "%s is not a valid OpenFlow port",
name);
}
OFPUTIL_NAMED_PORT(LOCAL) \
OFPUTIL_NAMED_PORT(NONE)
-/* Returns the port number represented by 's', which may be an integer or, for
- * reserved ports, the standard OpenFlow name for the port (e.g. "LOCAL").
+/* Stores the port number represented by 's' into '*portp'. 's' may be an
+ * integer or, for reserved ports, the standard OpenFlow name for the port
+ * (e.g. "LOCAL").
*
- * Returns 0 if 's' is not a valid OpenFlow port number or name. The caller
- * should issue an error message in this case, because this function usually
- * does not. (This gives the caller an opportunity to look up the port name
- * another way, e.g. by contacting the switch and listing the names of all its
- * ports).
+ * Returns true if successful, false if 's' is not a valid OpenFlow port number
+ * or name. The caller should issue an error message in this case, because
+ * this function usually does not. (This gives the caller an opportunity to
+ * look up the port name another way, e.g. by contacting the switch and listing
+ * the names of all its ports).
*
* This function accepts OpenFlow 1.0 port numbers. It also accepts a subset
* of OpenFlow 1.1+ port numbers, mapping those port numbers into the 16-bit
* range as described in include/openflow/openflow-1.1.h. */
-uint16_t
-ofputil_port_from_string(const char *s)
+bool
+ofputil_port_from_string(const char *s, uint16_t *portp)
{
unsigned int port32;
+ *portp = 0;
if (str_to_uint(s, 10, &port32)) {
if (port32 == 0) {
VLOG_WARN("port 0 is not a valid OpenFlow port number");
- return 0;
+ return false;
} else if (port32 < OFPP_MAX) {
- return port32;
+ *portp = port32;
+ return true;
} else if (port32 < OFPP_FIRST_RESV) {
VLOG_WARN("port %u is a reserved OF1.0 port number that will "
"be translated to %u when talking to an OF1.1 or "
"later controller", port32, port32 + OFPP11_OFFSET);
- return port32;
+ *portp = port32;
+ return true;
} else if (port32 <= OFPP_LAST_RESV) {
struct ds s;
ds_cstr(&s), port32);
ds_destroy(&s);
- return port32;
+ *portp = port32;
+ return true;
} else if (port32 < OFPP11_MAX) {
VLOG_WARN("port %u is outside the supported range 0 through "
"%"PRIx16"or 0x%x through 0x%"PRIx32, port32,
UINT16_MAX, (unsigned int) OFPP11_MAX, UINT32_MAX);
- return 0;
+ return false;
} else {
- return port32 - OFPP11_OFFSET;
+ *portp = port32 - OFPP11_OFFSET;
+ return true;
}
} else {
struct pair {
for (p = pairs; p < &pairs[ARRAY_SIZE(pairs)]; p++) {
if (!strcasecmp(s, p->name)) {
- return p->value;
+ *portp = p->value;
+ return true;
}
}
- return 0;
+ return false;
}
}
ovs_be32 ofputil_port_to_ofp11(uint16_t ofp10_port);
enum ofperr ofputil_check_output_port(uint16_t ofp_port, int max_ports);
-uint16_t ofputil_port_from_string(const char *);
+bool ofputil_port_from_string(const char *, uint16_t *portp);
void ofputil_format_port(uint16_t port, struct ds *);
/* Converting OFPFW10_NW_SRC_MASK and OFPFW10_NW_DST_MASK wildcard bit counts
static uint16_t
str_to_port_no(const char *vconn_name, const char *port_name)
{
- uint16_t port_no = ofputil_port_from_string(port_name);
- if (port_no) {
+ uint16_t port_no;
+
+ if (ofputil_port_from_string(port_name, &port_no)) {
return port_no;
} else {
struct ofputil_phy_port pp;