]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
meta: replace rtnl_tc_handle2str and rtnl_tc_str2handle
authorPablo Neira Ayuso <pablo@netfilter.org>
Fri, 21 Jun 2013 13:27:11 +0000 (15:27 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 24 Jun 2013 09:50:00 +0000 (11:50 +0200)
Provide replacements for rtnl_tc_handle2str and rtnl_tc_str2handle,
it removes the dependency with libnl-route.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
configure.ac
src/meta.c

index d8a850cf55c9abc879ef58dc50704b3d4747feee..316d043ebe42f21d2ef3ec7b06ed27b93d87c9e2 100644 (file)
@@ -55,9 +55,6 @@ AC_CHECK_LIB([nl], [nl_socket_alloc], ,
 AC_CHECK_LIB([nl-nf], [nfnl_nft_rule_alloc], ,
             AC_MSG_ERROR([No suitable version of libnl-nf found]))
 
-AC_CHECK_LIB([nl-route], [rtnl_link_alloc], ,
-            AC_MSG_ERROR([No suitable version of libnl-route found]))
-
 AC_CHECK_LIB([gmp], [__gmpz_init], ,
             AC_MSG_ERROR([No suitable version of libgmp found]))
 
index c5719b90cf0a0fb7e944de3221b12fd175381a01..49d81305d043e76f739425966c22880693a3fedc 100644 (file)
 #include <stdlib.h>
 #include <stdio.h>
 #include <stdint.h>
+#include <string.h>
 #include <net/if.h>
 #include <net/if_arp.h>
 #include <pwd.h>
 #include <grp.h>
-#include <netlink/route/link.h>
-#include <netlink/route/tc.h>
+#include <linux/pkt_sched.h>
 
 #include <nftables.h>
 #include <expression.h>
@@ -65,10 +65,24 @@ static const struct datatype realm_type = {
 
 static void tchandle_type_print(const struct expr *expr)
 {
-       char buf[sizeof("ffff:ffff")];
-
-       printf("%s", rtnl_tc_handle2str(mpz_get_uint32(expr->value),
-                                       buf, sizeof(buf)));
+       uint32_t handle = mpz_get_uint32(expr->value);
+
+       switch(handle) {
+       case TC_H_ROOT:
+               printf("root\n");
+       case TC_H_UNSPEC:
+               printf("none\n");
+       default:
+               if (TC_H_MAJ(handle) == 0)
+                       printf(":%04x\n", TC_H_MIN(handle));
+               else if (TC_H_MIN(handle) == 0)
+                       printf("%04x:\n", TC_H_MAJ(handle) >> 16);
+               else {
+                       printf("%04x:%04x\n",
+                              TC_H_MAJ(handle) >> 16, TC_H_MIN(handle));
+               }
+               break;
+       }
 }
 
 static struct error_record *tchandle_type_parse(const struct expr *sym,
@@ -76,14 +90,33 @@ static struct error_record *tchandle_type_parse(const struct expr *sym,
 {
        uint32_t handle;
 
-       if (rtnl_tc_str2handle(sym->identifier, &handle) < 0)
-               return error(&sym->location, "Could not parse %s",
-                            sym->dtype->desc);
-
+       if (strcmp(sym->identifier, "root") == 0)
+               handle = TC_H_ROOT;
+       else if (strcmp(sym->identifier, "none") == 0)
+               handle = TC_H_UNSPEC;
+       else if (sym->identifier[0] == ':') {
+               if (sscanf(sym->identifier, ":%04x", &handle) < 0)
+                       goto err;
+       } else if (sym->identifier[strlen(sym->identifier)-1] == ':') {
+               if (sscanf(sym->identifier, "%04x:", &handle) < 0)
+                       goto err;
+
+               handle <<= 16;
+       } else {
+               uint32_t min, max;
+
+               if (sscanf(sym->identifier, "%04x:%04x", &min, &max) < 0)
+                       goto err;
+
+               handle = max << 16 | min;
+       }
        *res = constant_expr_alloc(&sym->location, sym->dtype,
                                   BYTEORDER_HOST_ENDIAN,
                                   sizeof(handle) * BITS_PER_BYTE, &handle);
        return NULL;
+err:
+       return error(&sym->location, "Could not parse %s",
+                    sym->dtype->desc);
 }
 
 static const struct datatype tchandle_type = {