summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Pfaff <blp@ovn.org>2016-02-10 15:54:43 -0800
committerBen Pfaff <blp@ovn.org>2016-02-19 00:02:16 -0800
commit27aa879386ce57929a0014835a344191bb89d24e (patch)
tree63b9153bf32a34002edc49cbaf0c15dc4dd7625e
parent29100ef2ba237a198b9cf85241107589af7b51d4 (diff)
downloadopenvswitch-27aa879386ce57929a0014835a344191bb89d24e.tar.gz
ofpbuf: Make ofpbuf_put_hex() accept period between hex bytes also.
This makes it accept the same syntax as parse_NOTE(), so that that function can be simplified. In an upcoming commit a second action will also be able to take advantage of the same feature. Signed-off-by: Ben Pfaff <blp@ovn.org> Acked-by: Jarno Rajahalme <jarno@ovn.org>
-rw-r--r--lib/ofp-actions.c34
-rw-r--r--lib/ofpbuf.c12
2 files changed, 15 insertions, 31 deletions
diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c
index 9b7552635..24f18d987 100644
--- a/lib/ofp-actions.c
+++ b/lib/ofp-actions.c
@@ -4401,31 +4401,15 @@ static char * OVS_WARN_UNUSED_RESULT
parse_NOTE(const char *arg, struct ofpbuf *ofpacts,
enum ofputil_protocol *usable_protocols OVS_UNUSED)
{
- struct ofpact_note *note;
-
- note = ofpact_put_NOTE(ofpacts);
- while (*arg != '\0') {
- uint8_t byte;
- bool ok;
-
- if (*arg == '.') {
- arg++;
- }
- if (*arg == '\0') {
- break;
- }
-
- byte = hexits_value(arg, 2, &ok);
- if (!ok) {
- return xstrdup("bad hex digit in `note' argument");
- }
- ofpbuf_put(ofpacts, &byte, 1);
-
- note = ofpacts->header;
- note->length++;
-
- arg += 2;
- }
+ size_t start_ofs = ofpacts->size;
+ ofpact_put_NOTE(ofpacts);
+ arg = ofpbuf_put_hex(ofpacts, arg, NULL);
+ if (arg[0]) {
+ return xstrdup("bad hex digit in `note' argument");
+ }
+ struct ofpact_note *note = ofpbuf_at_assert(ofpacts, start_ofs,
+ sizeof *note);
+ note->length = ofpacts->size - (start_ofs + sizeof *note);
ofpact_finish(ofpacts, &note->ofpact);
return NULL;
}
diff --git a/lib/ofpbuf.c b/lib/ofpbuf.c
index c190f8bb6..a3c4da4bc 100644
--- a/lib/ofpbuf.c
+++ b/lib/ofpbuf.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2016 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -389,10 +389,10 @@ 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
+/* Parses as many pairs of hex digits as possible (possibly separated by spaces
+ * or periods) 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)
@@ -402,7 +402,7 @@ ofpbuf_put_hex(struct ofpbuf *b, const char *s, size_t *n)
uint8_t byte;
bool ok;
- s += strspn(s, " \t\r\n");
+ s += strspn(s, " .\t\r\n");
byte = hexits_value(s, 2, &ok);
if (!ok) {
if (n) {