]> git.sur5r.net Git - ngadmin/commitdiff
Add support for loop detection setting
authordarkcoven <admin@darkcoven.tk>
Tue, 9 Sep 2014 14:08:08 +0000 (16:08 +0200)
committerdarkcoven <admin@darkcoven.tk>
Wed, 10 Sep 2014 14:46:07 +0000 (16:46 +0200)
cli/man/ngcli.1
cli/src/Makefile.am
cli/src/com_loop.c [new file with mode: 0644]
cli/src/commands.c
lib/include/ngadmin.h
lib/src/ports.c
raw/include/nsdp/protocol.h
raw/src/attr.c
spy/src/spy.c
wireshark/nsdp.lua

index 66101c24683e999c082218c2c806a91db39959ba..71c02a64c19b9467bcadc7fc4e9ada2ae1c1e1d2 100644 (file)
@@ -1,4 +1,4 @@
-.TH NGCLI "1" "October 2013" "NgAdmin 0.1" "User Commands"
+.TH NGCLI "1" "September 2014" "NgAdmin 0.1" "User Commands"
 .SH NAME
 ngcli \- command line interface tool for GS10[58]E administration
 .
@@ -154,6 +154,18 @@ switches. This command delogs from the current switch, whether the login
 attempt is successful or not.
 .
 .TP
+\fBloop disable
+Disable loop detection.
+.
+.TP
+\fBloop enable
+Enable loop detection.
+.
+.TP
+\fBloop show
+Show loop detection configuration.
+.
+.TP
 \fBmirror disable
 Disable port mirroring.
 .
index c756408547fff0f19eb701bf4592d269543a3bc4..b23cedd6cdd5a836fc2c34de12ba0639128714f0 100644 (file)
@@ -3,9 +3,10 @@ bin_PROGRAMS = ngcli
 noinst_HEADERS = commands.h common.h
 
 ngcli_SOURCES = admin.c com_bitrate.c com_cabletest.c com_defaults.c com_firmware.c \
-               com_help.c com_igmp.c com_list.c com_login.c commands.c com_mirror.c \
-               common.c com_name.c com_netconf.c com_password.c com_ports.c com_qos.c \
-               com_quit.c com_restart.c com_scan.c com_stormfilter.c com_tree.c com_vlan.c
+               com_help.c com_igmp.c com_list.c com_login.c com_loop.c commands.c \
+               com_mirror.c common.c com_name.c com_netconf.c com_password.c \
+               com_ports.c com_qos.c com_quit.c com_restart.c com_scan.c \
+               com_stormfilter.c com_tree.c com_vlan.c
 ngcli_CPPFLAGS = -I$(top_srcdir)/raw/include/ -I$(top_srcdir)/lib/include/
 ngcli_LDADD = $(top_builddir)/raw/src/librawnsdp.la $(top_builddir)/lib/src/libngadmin.la $(READLINE_LIBS)
 
diff --git a/cli/src/com_loop.c b/cli/src/com_loop.c
new file mode 100644 (file)
index 0000000..45c4acd
--- /dev/null
@@ -0,0 +1,69 @@
+
+#include "commands.h"
+
+
+int do_loop_enable (int argc, const char **argv UNUSED, struct ngadmin *nga)
+{
+       int i;
+       
+       
+       if (argc > 0) {
+               printf("this command takes no argument\n");
+               return 1;
+       }
+       
+       i = ngadmin_setLoopDetectionState(nga, 1);
+       printErrCode(i);
+       
+       
+       return 0;
+}
+
+
+int do_loop_disable (int argc, const char **argv UNUSED, struct ngadmin *nga)
+{
+       int i;
+       
+       
+       if (argc > 0) {
+               printf("this command takes no argument\n");
+               return 1;
+       }
+       
+       i = ngadmin_setLoopDetectionState(nga, 0);
+       printErrCode(i);
+       
+       
+       return 0;
+}
+
+
+int do_loop_show (int argc, const char **argv UNUSED, struct ngadmin *nga)
+{
+       int i, s;
+       const struct swi_attr *sa;
+       
+       
+       if (argc > 0) {
+               printf("this command takes no argument\n");
+               return 1;
+       }
+       
+       sa = ngadmin_getCurrentSwitch(nga);
+       if (sa == NULL) {
+               printf("must be logged\n");
+               return 1;
+       }
+       
+       i = ngadmin_getLoopDetectionState(nga, &s);
+       if (i != ERR_OK) {
+               printErrCode(i);
+               return 1;
+       }
+       
+       printf("loop detection is %s\n", s ? "enabled" : "disabled");
+       
+       return 0;
+}
+
+
index 7662c726ec083370382ee568a7b7fa92e4f639ce..df4c93d9b35a9126cae2e1df553c3a8281db9616 100644 (file)
@@ -37,6 +37,12 @@ int do_list (int argc, const char **argv, struct ngadmin *nga);
 int do_login (int argc, const char **argv, struct ngadmin *nga);
 
 
+/* loop */
+int do_loop_enable (int argc, const char **argv, struct ngadmin *nga);
+int do_loop_disable (int argc, const char **argv, struct ngadmin *nga);
+int do_loop_show (int argc, const char **argv, struct ngadmin *nga);
+
+
 /* mirror */
 int do_mirror_disable (int argc, const char **argv, struct ngadmin *nga);
 int do_mirror_set (int argc, const char **argv, struct ngadmin *nga);
@@ -133,6 +139,12 @@ COM_ROOT_START(commands)
        
        COM_TERM(login, do_login)
        
+       COM_START(loop)
+               COM_TERM(disable, do_loop_disable)
+               COM_TERM(enable, do_loop_enable)
+               COM_TERM(show, do_loop_show)
+       COM_END
+       
        COM_START(mirror)
                COM_TERM(disable, do_mirror_disable)
                COM_TERM(set, do_mirror_set)
index 50fffa9684b3bb0017b62e65319c1039d6e09286..a7e17de63e026733449c90be629969fd98557382 100644 (file)
@@ -807,6 +807,28 @@ int ngadmin_getAllPVID (struct ngadmin *nga, unsigned short *ports);
 int ngadmin_setPVID (struct ngadmin *nga, unsigned char port, unsigned short vlan);
 
 
+/**
+ * Get the loop detection state. 
+ * Retrieves the loop detection state. 
+ * @note You must be logged on a switch. 
+ * @param nga A pointer to the ngadmin structure. 
+ * @param s A pointer to an integer which will receive 0 or 1. 
+ * @return ERR_OK when everything is well or an error code otherwise. 
+ **/
+int ngadmin_getLoopDetectionState (struct ngadmin *nga, int *s);
+
+
+/**
+ * Set the loop detection state. 
+ * Changes the loop detection state. 
+ * @note You must be logged on a switch. 
+ * @param nga A pointer to the ngadmin structure. 
+ * @param s An integer with value 0 or 1. 
+ * @return ERR_OK when everything is well or an error code otherwise. 
+ **/
+int ngadmin_setLoopDetectionState (struct ngadmin *nga, int s);
+
+
 #ifdef __cplusplus
 }
 #endif
index 8804e4b07db5adb92ca227ff85d5c665308aa6fc..99f8b48aedf91ba10eba454e5fde7b7f86af8348 100644 (file)
@@ -184,3 +184,59 @@ end:
 }
 
 
+int ngadmin_getLoopDetectionState (struct ngadmin *nga, int *s)
+{
+       List *attr;
+       ListNode *ln;
+       struct attr *at;
+       int ret = ERR_OK;
+       
+       
+       if (nga == NULL || s == NULL)
+               return ERR_INVARG;
+       else if (nga->current == NULL)
+               return ERR_NOTLOG;
+       
+       attr = createEmptyList();
+       pushBackList(attr, newEmptyAttr(ATTR_LOOP_DETECT));
+       ret = readRequest(nga, attr);
+       if (ret != ERR_OK)
+               goto end;
+       
+       filterAttributes(attr, ATTR_LOOP_DETECT, ATTR_END);
+       
+       *s = 0;
+       
+       if (attr->first == NULL) {
+               ret = ERR_BADREPLY;
+               goto end;
+       }
+       at = attr->first->data;
+       if (at->size != 1) {
+               ret = ERR_BADREPLY;
+               goto end;
+       }
+       *s = *(char *)at->data;
+       
+       
+end:
+       destroyList(attr, (void(*)(void*))freeAttr);
+       
+       
+       return ret;
+}
+
+
+int ngadmin_setLoopDetectionState (struct ngadmin *nga, int s)
+{
+       List *attr;
+       
+       
+       attr = createEmptyList();
+       pushBackList(attr, newByteAttr(ATTR_LOOP_DETECT, s != 0));
+       
+       
+       return writeRequest(nga, attr);
+}
+
+
index def40c43b20519219ec7280b1ea3f902c5449161..70d111e0f187af18ce33ac0b72f9a7767003107a 100644 (file)
@@ -66,6 +66,7 @@
 #define ATTR_IGMP_BLOCK_UNK    0x6C00
 #define ATTR_IGMP_VALID_V3     0x7000
 #define ATTR_TLV_BITMAP                0x7400
+#define ATTR_LOOP_DETECT       0x9000
 #define ATTR_END               0xFFFF
 
 
index fca3c329264dbd4c28b14ee5c8885969bee6b8d1..3d0e4c9fe6d93fede53b94bd099cc6816ebfb4e5 100644 (file)
@@ -549,6 +549,7 @@ static int processAttr (struct attr *at, bool encode)
        case ATTR_STORM_ENABLE:
        case ATTR_IGMP_BLOCK_UNK:
        case ATTR_IGMP_VALID_V3:
+       case ATTR_LOOP_DETECT:
                if (at->size != 1)
                        return -EMSGSIZE;
                
index 7c842cc3ddddab2c84c1f0f86ff25315c62f405c..69c89fa37ae078b00483ebc1660f1eb014b212e0 100644 (file)
@@ -267,6 +267,10 @@ static void print_attr (const struct attr *at)
                printf("\tvalidate IGMPv3 = %s\n", *byte ? "yes" : "no");
                break;
        
+       case ATTR_LOOP_DETECT:
+               printf("\tloop detection = %s\n", *byte ? "yes" : "no");
+               break;
+       
        default:
                printf("\tunknown\n");
        }
index 6703a2169af1e0e7eba10fefb71bb2f90d66191c..08caca8544d136765574abd355debeee06a756c9 100644 (file)
@@ -225,6 +225,7 @@ local attributes = {
        [0x6C00] = {name = "Block Unknown IGMP Addresses", dissect = "uint"}, 
        [0x7000] = {name = "Validate IGMPv3 Headers", dissect = "uint"}, 
        [0x7400] = {name = "TLV Bitmap", dissect = nill}, 
+       [0x9000] = {name = "Loop Detection", dissect = "uint"}, 
        [0xFFFF] = {name = "End", dissect = nill}
 }