net/mlx5: fix meter flow direction check
[dpdk.git] / examples / ip_pipeline / parser.c
index 0901e9c..dfd71a7 100644 (file)
@@ -4,25 +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>
 #include <libgen.h>
 #include <unistd.h>
 #include <sys/wait.h>
+#include <arpa/inet.h>
+#include <sys/socket.h>
 
 #include <rte_errno.h>
-#include <rte_cfgfile.h>
 #include <rte_string_fns.h>
 
-#include "app.h"
 #include "parser.h"
 
 static uint32_t
@@ -350,178 +331,13 @@ 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 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 {
@@ -530,21 +346,21 @@ my_ether_aton(const char *a)
                if (errno != 0 || end == a || (end[0] != ':' && end[0] != 0))
                        return NULL;
                a = end + 1;
-       } while (++i != sizeof(o) / sizeof(o[0]) && end[0] != 0);
+       } while (++i != RTE_DIM(o) && end[0] != 0);
 
        /* Junk at the end of line */
        if (end[0] != 0)
                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;
@@ -555,7 +371,7 @@ my_ether_aton(const char *a)
        } else
                return NULL;
 
-       return (struct ether_addr *)&ether_addr;
+       return (struct rte_ether_addr *)&ether_addr;
 }
 
 int
@@ -564,7 +380,7 @@ 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;
@@ -576,30 +392,28 @@ 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
-parse_mac_addr(const char *token, struct ether_addr *addr)
+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;
 }
 
 int
-parse_pipeline_core(uint32_t *socket,
-       uint32_t *core,
-       uint32_t *ht,
-       const char *entry)
+parse_cpu_core(const char *entry,
+       struct cpu_core_params *p)
 {
        size_t num_len;
        char num[8];
@@ -609,6 +423,9 @@ parse_pipeline_core(uint32_t *socket,
        const char *next = skip_white_spaces(entry);
        char type;
 
+       if (p == NULL)
+               return -EINVAL;
+
        /* Expect <CORE> or [sX][cY][h]. At least one parameter is required. */
        while (*next != '\0') {
                /* If everything parsed nothing should left */
@@ -682,8 +499,8 @@ parse_pipeline_core(uint32_t *socket,
                }
        }
 
-       *socket = s;
-       *core = c;
-       *ht = h;
+       p->socket_id = s;
+       p->core_id = c;
+       p->thread_id = h;
        return 0;
 }