summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/packets.c18
-rw-r--r--lib/packets.h10
2 files changed, 28 insertions, 0 deletions
diff --git a/lib/packets.c b/lib/packets.c
index e4c29d509..11bb587e5 100644
--- a/lib/packets.c
+++ b/lib/packets.c
@@ -427,6 +427,24 @@ ip_parse(const char *s, ovs_be32 *ip)
return inet_pton(AF_INET, s, ip) == 1;
}
+/* Parses string 's', which must be an IP address with a port number
+ * with ":" as a separator (e.g.: 192.168.1.2:80).
+ * Stores the IP address into '*ip' and port number to '*port'. */
+char * OVS_WARN_UNUSED_RESULT
+ip_parse_port(const char *s, ovs_be32 *ip, ovs_be16 *port)
+{
+ int n = 0;
+ if (!ovs_scan_len(s, &n, IP_PORT_SCAN_FMT,
+ IP_PORT_SCAN_ARGS(ip, port))) {
+ return xasprintf("%s: invalid IP address or port number", s);
+ }
+
+ if (s[n]) {
+ return xasprintf("%s: invalid IP address or port number", s);
+ }
+ return NULL;
+}
+
/* Parses string 's', which must be an IP address with an optional netmask or
* CIDR prefix length. Stores the IP address into '*ip', netmask into '*mask',
* (255.255.255.255, if 's' lacks a netmask), and number of scanned characters
diff --git a/lib/packets.h b/lib/packets.h
index dcfcd04b2..21bd35c09 100644
--- a/lib/packets.h
+++ b/lib/packets.h
@@ -537,6 +537,14 @@ mpls_lse_to_bos(ovs_be32 mpls_lse)
&((uint8_t *) ip)[2], \
&((uint8_t *) ip)[3]
+#define IP_PORT_SCAN_FMT "%"SCNu8".%"SCNu8".%"SCNu8".%"SCNu8":%"SCNu16
+#define IP_PORT_SCAN_ARGS(ip, port) \
+ ((void) (ovs_be32) *(ip), &((uint8_t *) ip)[0]), \
+ &((uint8_t *) ip)[1], \
+ &((uint8_t *) ip)[2], \
+ &((uint8_t *) ip)[3], \
+ ((void) (ovs_be16) *(port), (uint16_t *) port)
+
/* Returns true if 'netmask' is a CIDR netmask, that is, if it consists of N
* high-order 1-bits and 32-N low-order 0-bits. */
static inline bool
@@ -558,6 +566,8 @@ ip_is_local_multicast(ovs_be32 ip)
int ip_count_cidr_bits(ovs_be32 netmask);
void ip_format_masked(ovs_be32 ip, ovs_be32 mask, struct ds *);
bool ip_parse(const char *s, ovs_be32 *ip);
+char *ip_parse_port(const char *s, ovs_be32 *ip, ovs_be16 *port)
+ OVS_WARN_UNUSED_RESULT;
char *ip_parse_masked(const char *s, ovs_be32 *ip, ovs_be32 *mask)
OVS_WARN_UNUSED_RESULT;
char *ip_parse_cidr(const char *s, ovs_be32 *ip, unsigned int *plen)