aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Pfaff <blp@nicira.com>2010-12-08 13:09:59 -0800
committerBen Pfaff <blp@nicira.com>2010-12-09 14:51:31 -0800
commit78090f6300df053914954794301e44a2df1f6d57 (patch)
tree6f5eef0dabcec7dd5b7f669ed6107dcf4c7f4f9a
parent8961de6adfd44216f47007ff75fd1cea213d7e31 (diff)
ofpbuf: New function ofpbuf_put_hex().
This commit converts nx_match_from_string() to use this new function. The new function will also have another user in an upcoming commit.
-rw-r--r--lib/nx-match.c30
-rw-r--r--lib/ofpbuf.c27
-rw-r--r--lib/ofpbuf.h1
3 files changed, 37 insertions, 21 deletions
diff --git a/lib/nx-match.c b/lib/nx-match.c
index bcb6482a..359441da 100644
--- a/lib/nx-match.c
+++ b/lib/nx-match.c
@@ -749,25 +749,6 @@ parse_nxm_field_name(const char *name, int name_len)
return 0;
}
-
-static const char *
-parse_hex_bytes(struct ofpbuf *b, const char *s, unsigned int n)
-{
- while (n--) {
- uint8_t byte;
- bool ok;
-
- s += strspn(s, " ");
- byte = hexits_value(s, 2, &ok);
- if (!ok) {
- ovs_fatal(0, "%.2s: hex digits expected", s);
- }
-
- ofpbuf_put(b, &byte, 1);
- s += 2;
- }
- return s;
-}
/* nx_match_from_string(). */
@@ -788,6 +769,7 @@ nx_match_from_string(const char *s, struct ofpbuf *b)
const char *name;
uint32_t header;
int name_len;
+ size_t n;
name = s;
name_len = strcspn(s, "(");
@@ -803,14 +785,20 @@ nx_match_from_string(const char *s, struct ofpbuf *b)
s += name_len + 1;
nxm_put_header(b, header);
- s = parse_hex_bytes(b, s, nxm_field_bytes(header));
+ s = ofpbuf_put_hex(b, s, &n);
+ if (n != nxm_field_bytes(header)) {
+ ovs_fatal(0, "%.2s: hex digits expected", s);
+ }
if (NXM_HASMASK(header)) {
s += strspn(s, " ");
if (*s != '/') {
ovs_fatal(0, "%s: missing / in masked field %.*s",
full_s, name_len, name);
}
- s = parse_hex_bytes(b, s + 1, nxm_field_bytes(header));
+ s = ofpbuf_put_hex(b, s + 1, &n);
+ if (n != nxm_field_bytes(header)) {
+ ovs_fatal(0, "%.2s: hex digits expected", s);
+ }
}
s += strspn(s, " ");
diff --git a/lib/ofpbuf.c b/lib/ofpbuf.c
index 77595e03..91ea3630 100644
--- a/lib/ofpbuf.c
+++ b/lib/ofpbuf.c
@@ -242,6 +242,33 @@ ofpbuf_put(struct ofpbuf *b, const void *p, size_t size)
return dst;
}
+/* Parses as many pairs of hex digits as possible (possibly separated by
+ * spaces) from the beginning of 's', appending bytes for their values to 'b'.
+ * Returns the first character of 's' that is not the first of a pair of hex
+ * digits. If 'n' is nonnull, stores the number of bytes added to 'b' in
+ * '*n'. */
+char *
+ofpbuf_put_hex(struct ofpbuf *b, const char *s, size_t *n)
+{
+ size_t initial_size = b->size;
+ for (;;) {
+ uint8_t byte;
+ bool ok;
+
+ s += strspn(s, " ");
+ byte = hexits_value(s, 2, &ok);
+ if (!ok) {
+ if (n) {
+ *n = b->size - initial_size;
+ }
+ return (char *) s;
+ }
+
+ ofpbuf_put(b, &byte, 1);
+ s += 2;
+ }
+}
+
/* Reserves 'size' bytes of headroom so that they can be later allocated with
* ofpbuf_push_uninit() without reallocating the ofpbuf. */
void
diff --git a/lib/ofpbuf.h b/lib/ofpbuf.h
index a7b5ded9..bd668c1e 100644
--- a/lib/ofpbuf.h
+++ b/lib/ofpbuf.h
@@ -65,6 +65,7 @@ void *ofpbuf_end(const struct ofpbuf *);
void *ofpbuf_put_uninit(struct ofpbuf *, size_t);
void *ofpbuf_put_zeros(struct ofpbuf *, size_t);
void *ofpbuf_put(struct ofpbuf *, const void *, size_t);
+char *ofpbuf_put_hex(struct ofpbuf *, const char *s, size_t *n);
void ofpbuf_reserve(struct ofpbuf *, size_t);
void *ofpbuf_push_uninit(struct ofpbuf *b, size_t);
void *ofpbuf_push_zeros(struct ofpbuf *, size_t);