udhcpc: allow zero server-id. Closes 6614.
[oweals/busybox.git] / networking / tc.c
index 6a5a8504f12fad2399d484965aec826ec8f6b4a4..b9a4d16ccb4b8f0bd26de7cd64895a7b88eacc2f 100644 (file)
@@ -1,14 +1,33 @@
 /* vi: set sw=4 ts=4: */
 /*
- * tc.c                "tc" utility frontend.
+ * Licensed under GPLv2 or later, see file LICENSE in this source tree.
  *
- * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
- *
- * Authors:    Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
+ * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
  *
  * Bernhard Reutner-Fischer adjusted for busybox
  */
 
+//usage:#define tc_trivial_usage
+/* //usage: "[OPTIONS] OBJECT CMD [dev STRING]" */
+//usage:       "OBJECT CMD [dev STRING]"
+//usage:#define tc_full_usage "\n\n"
+//usage:       "OBJECT: {qdisc|class|filter}\n"
+//usage:       "CMD: {add|del|change|replace|show}\n"
+//usage:       "\n"
+//usage:       "qdisc [ handle QHANDLE ] [ root |"IF_FEATURE_TC_INGRESS(" ingress |")" parent CLASSID ]\n"
+/* //usage: "[ estimator INTERVAL TIME_CONSTANT ]\n" */
+//usage:       "       [ [ QDISC_KIND ] [ help | OPTIONS ] ]\n"
+//usage:       "       QDISC_KIND := { [p|b]fifo | tbf | prio | cbq | red | etc. }\n"
+//usage:       "qdisc show [ dev STRING ]"IF_FEATURE_TC_INGRESS(" [ingress]")"\n"
+//usage:       "class [ classid CLASSID ] [ root | parent CLASSID ]\n"
+//usage:       "       [ [ QDISC_KIND ] [ help | OPTIONS ] ]\n"
+//usage:       "class show [ dev STRING ] [ root | parent CLASSID ]\n"
+//usage:       "filter [ pref PRIO ] [ protocol PROTO ]\n"
+/* //usage: "\t[ estimator INTERVAL TIME_CONSTANT ]\n" */
+//usage:       "       [ root | classid CLASSID ] [ handle FILTERID ]\n"
+//usage:       "       [ [ FILTER_TYPE ] [ help | OPTIONS ] ]\n"
+//usage:       "filter show [ dev STRING ] [ root | parent CLASSID ]"
+
 #include "libbb.h"
 
 #include "libiproute/utils.h"
 
 struct globals {
        int filter_ifindex;
-       __u32 filter_qdisc;
-       __u32 filter_parent;
-       __u32 filter_prio;
-       __u32 filter_proto;
+       uint32_t filter_qdisc;
+       uint32_t filter_parent;
+       uint32_t filter_prio;
+       uint32_t filter_proto;
 } FIX_ALIASING;
 #define G (*(struct globals*)&bb_common_bufsiz1)
+struct BUG_G_too_big {
+       char BUG_G_too_big[sizeof(G) <= COMMON_BUFSIZE ? 1 : -1];
+};
 #define filter_ifindex (G.filter_ifindex)
 #define filter_qdisc (G.filter_qdisc)
 #define filter_parent (G.filter_parent)
 #define filter_prio (G.filter_prio)
 #define filter_proto (G.filter_proto)
-
-void BUG_tc_globals_too_big(void);
-#define INIT_G() do { \
-       if (sizeof(G) > COMMON_BUFSIZE) \
-               BUG_tc_globals_too_big(); \
-} while (0)
+#define INIT_G() do { } while (0)
 
 /* Allocates a buffer containing the name of a class id.
  * The caller must free the returned memory.  */
@@ -77,8 +94,8 @@ static char* print_tc_classid(uint32_t cid)
 }
 
 /* Get a qdisc handle.  Return 0 on success, !0 otherwise.  */
-static int get_qdisc_handle(__u32 *h, const char *str) {
-       __u32 maj;
+static int get_qdisc_handle(uint32_t *h, const char *str) {
+       uint32_t maj;
        char *p;
 
        maj = TC_H_UNSPEC;
@@ -96,8 +113,8 @@ static int get_qdisc_handle(__u32 *h, const char *str) {
 }
 
 /* Get class ID.  Return 0 on success, !0 otherwise.  */
-static int get_tc_classid(__u32 *h, const char *str) {
-       __u32 maj, min;
+static int get_tc_classid(uint32_t *h, const char *str) {
+       uint32_t maj, min;
        char *p;
 
        maj = TC_H_ROOT;
@@ -374,7 +391,7 @@ static int print_class(const struct sockaddr_nl *who UNUSED_PARAM,
                printf("root ");
        else if (msg->tcm_parent) {
                classid = print_tc_classid(filter_qdisc ?
-                                                                  TC_H_MIN(msg->tcm_parent) : msg->tcm_parent);
+                               TC_H_MIN(msg->tcm_parent) : msg->tcm_parent);
                printf("parent %s ", classid);
                if (ENABLE_FEATURE_CLEAN_UP)
                        free(classid);
@@ -496,7 +513,7 @@ int tc_main(int argc UNUSED_PARAM, char **argv)
                        if (obj == OBJ_filter)
                                filter_parent = TC_H_ROOT;
                } else if (arg == ARG_parent) {
-                       __u32 handle;
+                       uint32_t handle;
                        if (msg.tcm_parent)
                                duparg(*argv, "parent");
                        if (get_tc_classid(&handle, *argv))
@@ -509,11 +526,12 @@ int tc_main(int argc UNUSED_PARAM, char **argv)
                                duparg(*argv, "handle");
                        /* reject LONG_MIN || LONG_MAX */
                        /* TODO: for fw
-                          if ((slash = strchr(handle, '/')) != NULL)
+                       slash = strchr(handle, '/');
+                       if (slash != NULL)
                                   *slash = '\0';
                         */
                        msg.tcm_handle = get_u32(*argv, "handle");
-                       /* if (slash) {if (get_u32(__u32 &mask, slash+1, NULL)) inv mask; addattr32(n, MAX_MSG, TCA_FW_MASK, mask); */
+                       /* if (slash) {if (get_u32(uint32_t &mask, slash+1, NULL)) inv mask; addattr32(n, MAX_MSG, TCA_FW_MASK, mask); */
                } else if (arg == ARG_classid && obj == OBJ_class && cmd == CMD_change){
                } else if (arg == ARG_pref || arg == ARG_prio) { /* filter::list */
                        if (filter_prio)