From 94dc48da0960ea8bb3733f4029dafc2c44ea7927 Mon Sep 17 00:00:00 2001
From: Martine Lenders <mlenders@inf.fu-berlin.de>
Date: Thu, 9 Apr 2015 20:26:10 +0200
Subject: [PATCH] shell: sc_netif: add set/unset for promiscous mode

---
 sys/shell/commands/sc_netif.c | 75 ++++++++++++++++++++++++++++++++++-
 1 file changed, 74 insertions(+), 1 deletion(-)

diff --git a/sys/shell/commands/sc_netif.c b/sys/shell/commands/sc_netif.c
index 76bcf4b445..5a3f085255 100644
--- a/sys/shell/commands/sc_netif.c
+++ b/sys/shell/commands/sc_netif.c
@@ -80,6 +80,11 @@ static void _set_usage(char *cmd_name)
          "       * \"state\" - set the device state\n");
 }
 
+static void _flag_usage(char *cmd_name)
+{
+    printf("usage: %s <if_id> [-]{promisc|autoack|preload}", cmd_name);
+}
+
 static void _print_netconf(ng_netconf_opt_t opt)
 {
     switch (opt) {
@@ -147,6 +152,8 @@ void _netif_list(kernel_pid_t dev)
     int16_t i16;
     int res;
     ng_netconf_state_t state;
+    ng_netconf_enable_t enable;
+    bool linebreak = false;
 
     printf("Iface %2d  ", dev);
 
@@ -197,6 +204,31 @@ void _netif_list(kernel_pid_t dev)
         printf("\n            ");
     }
 
+    res = ng_netapi_get(dev, NETCONF_OPT_PROMISCUOUSMODE, 0, &enable, sizeof(enable));
+
+    if ((res >= 0) && (enable == NETCONF_ENABLE)) {
+        printf("PROMISC  ");
+        linebreak = true;
+    }
+
+    res = ng_netapi_get(dev, NETCONF_OPT_AUTOACK, 0, &enable, sizeof(enable));
+
+    if ((res >= 0) && (enable == NETCONF_ENABLE)) {
+        printf("AUTOACK  ");
+        linebreak = true;
+    }
+
+    res = ng_netapi_get(dev, NETCONF_OPT_PRELOADING, 0, &enable, sizeof(enable));
+
+    if ((res >= 0) && (enable == NETCONF_ENABLE)) {
+        printf("PRELOAD  ");
+        linebreak = true;
+    }
+
+    if (linebreak) {
+        printf("\n           ");
+    }
+
     res = ng_netapi_get(dev, NETCONF_OPT_SRC_LEN, 0, &u16, sizeof(u16));
 
     if (res >= 0) {
@@ -273,6 +305,15 @@ static void _netif_set_i16(kernel_pid_t dev, ng_netconf_opt_t opt,
     printf(" on interface %" PRIkernel_pid " to %i\n", dev, val);
 }
 
+static void _netif_set_flag(kernel_pid_t dev, ng_netconf_opt_t opt,
+                            ng_netconf_enable_t set)
+{
+    if (ng_netapi_set(dev, opt, 0, &set, sizeof(ng_netconf_enable_t)) < 0) {
+        puts("error: unable to set option");
+    }
+    printf("success: %sset option\n", (set) ? "" : "un");
+}
+
 static void _netif_set_addr(kernel_pid_t dev, ng_netconf_opt_t opt,
                             char *addr_str)
 {
@@ -361,6 +402,32 @@ static void _netif_set(char *cmd_name, kernel_pid_t dev, char *key, char *value)
     }
 }
 
+static int _netif_flag(char *cmd, kernel_pid_t dev, char *flag)
+{
+    ng_netconf_enable_t set = NETCONF_ENABLE;
+
+    if (flag[0] == '-') {
+        set = NETCONF_DISABLE;
+        flag++;
+    }
+
+    if (strcmp(flag, "promisc") == 0) {
+        _netif_set_flag(dev, NETCONF_OPT_PROMISCUOUSMODE, set);
+    }
+    else if (strcmp(flag, "preload") == 0) {
+        _netif_set_flag(dev, NETCONF_OPT_PRELOADING, set);
+    }
+    else if (strcmp(flag, "autoack") == 0) {
+        _netif_set_flag(dev, NETCONF_OPT_AUTOACK, set);
+    }
+    else {
+        _flag_usage(cmd);
+        return 1;
+    }
+
+    return 0;
+}
+
 /* shell commands */
 int _netif_send(int argc, char **argv)
 {
@@ -441,12 +508,18 @@ int _netif_config(int argc, char **argv)
             }
 
             /* TODO implement add for IP addresses */
+
+            else {
+                return _netif_flag(argv[0], dev, argv[2]);
+            }
         }
         else {
             puts("error: invalid interface given");
         }
     }
 
-    printf("usage: %s [<if_id> set <key> <value>]]\n", argv[0]);
+    printf("usage: %s <if_id>\n", argv[0]);
+    _set_usage(argv[0]);
+    _flag_usage(argv[0]);
     return 1;
 }
-- 
GitLab