[ovs-dev] [trace 2/3] ofpbuf: New function ofpbuf_put_hex().
Ben Pfaff
blp at nicira.com
Thu Dec 9 01:10:53 UTC 2010
This commit converts nx_match_from_string() to use this new function. The
new function will also have another user in an upcoming commit.
---
lib/nx-match.c | 30 +++++++++---------------------
lib/ofpbuf.c | 27 +++++++++++++++++++++++++++
lib/ofpbuf.h | 1 +
3 files changed, 37 insertions(+), 21 deletions(-)
diff --git a/lib/nx-match.c b/lib/nx-match.c
index 4821c62..276093e 100644
--- a/lib/nx-match.c
+++ b/lib/nx-match.c
@@ -743,25 +743,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(). */
@@ -782,6 +763,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, "(");
@@ -797,14 +779,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 77595e0..91ea363 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 a7b5ded..bd668c1 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);
--
1.7.1
More information about the dev
mailing list