net/bnxt: fail init when mbuf allocation fails
[dpdk.git] / drivers / net / softnic / parser.c
index 7087b87..ebcb102 100644 (file)
@@ -4,24 +4,6 @@
  * All rights reserved.
  */
 
-/* For inet_pton4() and inet_pton6() functions:
- *
- * Copyright (c) 1996 by Internet Software Consortium.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
- * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
- * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- */
-
 #include <stdint.h>
 #include <stdlib.h>
 #include <stdio.h>
@@ -33,6 +15,8 @@
 #include <libgen.h>
 #include <unistd.h>
 #include <sys/wait.h>
+#include <arpa/inet.h>
+#include <sys/socket.h>
 
 #include <rte_errno.h>
 
@@ -92,6 +76,24 @@ softnic_parser_read_arg_bool(const char *p)
        return result;
 }
 
+int
+softnic_parser_read_int32(int32_t *value, const char *p)
+{
+       char *next;
+       int32_t val;
+
+       p = skip_white_spaces(p);
+       if (!isdigit(*p))
+               return -EINVAL;
+
+       val = strtol(p, &next, 10);
+       if (p == next)
+               return -EINVAL;
+
+       *value = val;
+       return 0;
+}
+
 int
 softnic_parser_read_uint64(uint64_t *value, const char *p)
 {
@@ -346,177 +348,13 @@ softnic_parse_mpls_labels(char *string, uint32_t *labels, uint32_t *n_labels)
        return 0;
 }
 
-#define INADDRSZ 4
-#define IN6ADDRSZ 16
-
-/* int
- * inet_pton4(src, dst)
- *      like inet_aton() but without all the hexadecimal and shorthand.
- * return:
- *      1 if `src' is a valid dotted quad, else 0.
- * notice:
- *      does not touch `dst' unless it's returning 1.
- * author:
- *      Paul Vixie, 1996.
- */
-static int
-inet_pton4(const char *src, unsigned char *dst)
-{
-       static const char digits[] = "0123456789";
-       int saw_digit, octets, ch;
-       unsigned char tmp[INADDRSZ], *tp;
-
-       saw_digit = 0;
-       octets = 0;
-       *(tp = tmp) = 0;
-       while ((ch = *src++) != '\0') {
-               const char *pch;
-
-               pch = strchr(digits, ch);
-               if (pch != NULL) {
-                       unsigned int new = *tp * 10 + (pch - digits);
-
-                       if (new > 255)
-                               return 0;
-                       if (!saw_digit) {
-                               if (++octets > 4)
-                                       return 0;
-                               saw_digit = 1;
-                       }
-                       *tp = (unsigned char)new;
-               } else if (ch == '.' && saw_digit) {
-                       if (octets == 4)
-                               return 0;
-                       *++tp = 0;
-                       saw_digit = 0;
-               } else
-                       return 0;
-       }
-       if (octets < 4)
-               return 0;
-
-       memcpy(dst, tmp, INADDRSZ);
-       return 1;
-}
-
-/* int
- * inet_pton6(src, dst)
- *      convert presentation level address to network order binary form.
- * return:
- *      1 if `src' is a valid [RFC1884 2.2] address, else 0.
- * notice:
- *      (1) does not touch `dst' unless it's returning 1.
- *      (2) :: in a full address is silently ignored.
- * credit:
- *      inspired by Mark Andrews.
- * author:
- *      Paul Vixie, 1996.
- */
-static int
-inet_pton6(const char *src, unsigned char *dst)
-{
-       static const char xdigits_l[] = "0123456789abcdef",
-               xdigits_u[] = "0123456789ABCDEF";
-       unsigned char tmp[IN6ADDRSZ], *tp = 0, *endp = 0, *colonp = 0;
-       const char *xdigits = 0, *curtok = 0;
-       int ch = 0, saw_xdigit = 0, count_xdigit = 0;
-       unsigned int val = 0;
-       unsigned int dbloct_count = 0;
-
-       memset((tp = tmp), '\0', IN6ADDRSZ);
-       endp = tp + IN6ADDRSZ;
-       colonp = NULL;
-       /* Leading :: requires some special handling. */
-       if (*src == ':')
-               if (*++src != ':')
-                       return 0;
-       curtok = src;
-       saw_xdigit = count_xdigit = 0;
-       val = 0;
-
-       while ((ch = *src++) != '\0') {
-               const char *pch;
-
-               pch = strchr((xdigits = xdigits_l), ch);
-               if (pch == NULL)
-                       pch = strchr((xdigits = xdigits_u), ch);
-               if (pch != NULL) {
-                       if (count_xdigit >= 4)
-                               return 0;
-                       val <<= 4;
-                       val |= (pch - xdigits);
-                       if (val > 0xffff)
-                               return 0;
-                       saw_xdigit = 1;
-                       count_xdigit++;
-                       continue;
-               }
-               if (ch == ':') {
-                       curtok = src;
-                       if (!saw_xdigit) {
-                               if (colonp)
-                                       return 0;
-                               colonp = tp;
-                               continue;
-                       } else if (*src == '\0') {
-                               return 0;
-                       }
-                       if (tp + sizeof(int16_t) > endp)
-                               return 0;
-                       *tp++ = (unsigned char)((val >> 8) & 0xff);
-                       *tp++ = (unsigned char)(val & 0xff);
-                       saw_xdigit = 0;
-                       count_xdigit = 0;
-                       val = 0;
-                       dbloct_count++;
-                       continue;
-               }
-               if (ch == '.' && ((tp + INADDRSZ) <= endp) &&
-                   inet_pton4(curtok, tp) > 0) {
-                       tp += INADDRSZ;
-                       saw_xdigit = 0;
-                       dbloct_count += 2;
-                       break;  /* '\0' was seen by inet_pton4(). */
-               }
-               return 0;
-       }
-       if (saw_xdigit) {
-               if (tp + sizeof(int16_t) > endp)
-                       return 0;
-               *tp++ = (unsigned char)((val >> 8) & 0xff);
-               *tp++ = (unsigned char)(val & 0xff);
-               dbloct_count++;
-       }
-       if (colonp != NULL) {
-               /* if we already have 8 double octets, having a colon means error */
-               if (dbloct_count == 8)
-                       return 0;
-
-               /* Since some memmove()'s erroneously fail to handle
-                * overlapping regions, we'll do the shift by hand.
-                */
-               const int n = tp - colonp;
-               int i;
-
-               for (i = 1; i <= n; i++) {
-                       endp[-i] = colonp[n - i];
-                       colonp[n - i] = 0;
-               }
-               tp = endp;
-       }
-       if (tp != endp)
-               return 0;
-       memcpy(dst, tmp, IN6ADDRSZ);
-       return 1;
-}
-
-static struct ether_addr *
+static struct rte_ether_addr *
 my_ether_aton(const char *a)
 {
        int i;
        char *end;
-       unsigned long o[ETHER_ADDR_LEN];
-       static struct ether_addr ether_addr;
+       unsigned long o[RTE_ETHER_ADDR_LEN];
+       static struct rte_ether_addr ether_addr;
 
        i = 0;
        do {
@@ -532,14 +370,14 @@ my_ether_aton(const char *a)
                return NULL;
 
        /* Support the format XX:XX:XX:XX:XX:XX */
-       if (i == ETHER_ADDR_LEN) {
+       if (i == RTE_ETHER_ADDR_LEN) {
                while (i-- != 0) {
                        if (o[i] > UINT8_MAX)
                                return NULL;
                        ether_addr.addr_bytes[i] = (uint8_t)o[i];
                }
        /* Support the format XXXX:XXXX:XXXX */
-       } else if (i == ETHER_ADDR_LEN / 2) {
+       } else if (i == RTE_ETHER_ADDR_LEN / 2) {
                while (i-- != 0) {
                        if (o[i] > UINT16_MAX)
                                return NULL;
@@ -550,7 +388,7 @@ my_ether_aton(const char *a)
        } else
                return NULL;
 
-       return (struct ether_addr *)&ether_addr;
+       return (struct rte_ether_addr *)&ether_addr;
 }
 
 int
@@ -559,7 +397,7 @@ softnic_parse_ipv4_addr(const char *token, struct in_addr *ipv4)
        if (strlen(token) >= INET_ADDRSTRLEN)
                return -EINVAL;
 
-       if (inet_pton4(token, (unsigned char *)ipv4) != 1)
+       if (inet_pton(AF_INET, token, ipv4) != 1)
                return -EINVAL;
 
        return 0;
@@ -571,22 +409,22 @@ softnic_parse_ipv6_addr(const char *token, struct in6_addr *ipv6)
        if (strlen(token) >= INET6_ADDRSTRLEN)
                return -EINVAL;
 
-       if (inet_pton6(token, (unsigned char *)ipv6) != 1)
+       if (inet_pton(AF_INET6, token, ipv6) != 1)
                return -EINVAL;
 
        return 0;
 }
 
 int
-softnic_parse_mac_addr(const char *token, struct ether_addr *addr)
+softnic_parse_mac_addr(const char *token, struct rte_ether_addr *addr)
 {
-       struct ether_addr *tmp;
+       struct rte_ether_addr *tmp;
 
        tmp = my_ether_aton(token);
        if (tmp == NULL)
                return -1;
 
-       memcpy(addr, tmp, sizeof(struct ether_addr));
+       memcpy(addr, tmp, sizeof(struct rte_ether_addr));
        return 0;
 }