]> git.sur5r.net Git - gsconf/blobdiff - gs105e.c
added sys [name|password|restart] and vlan enable
[gsconf] / gs105e.c
index ccee5d759a646cd01891a1c4f79783441ccb3cc5..a5b9aa60300345753050f02d0d3bcd3000ae9fae 100644 (file)
--- a/gs105e.c
+++ b/gs105e.c
@@ -90,7 +90,7 @@ void makeHeader(unsigned int queryType) {
         gs105e_queryData[1] = queryType % 256;
         
         memcpy(&gs105e_queryData[8], myMac, 6);
-        if (memcpy(settings.mac, "\x00\x00\x00\x00\x00\x00", 6))
+        if (memcmp(settings.mac, "\x00\x00\x00\x00\x00\x00", 6))
                 memcpy(&gs105e_queryData[14], settings.mac, 6);
         
         memcpy(&gs105e_queryData[24], "\x4e\x53\x44\x50", 4); //Magic!! :-O
@@ -220,12 +220,15 @@ void gs105e_interpret_slice(unsigned int ID, char * data, int len) {
                         break;
                 case GS_PORTDIAG:;
                         p = &settings.portStatistics[data[0]];
-                        p->cableError = toUInt4(&data[1]);
-                        p->errorDist = toUInt4(&data[5]);
+                        p->cableError = (char)toUInt4(&data[1]);
+                        p->errorDist = (char)toUInt4(&data[5]);
                         break;
                 case ACT_DHCP:;
                         settings.dhcp = data[1] & 0x03;
                         break;
+                case GS_VLANSETTING:;
+                        settings.vlanType = data[0];
+                        break;
         }
 }
 
@@ -289,13 +292,27 @@ int gs105e_actRecv(void) {
                 return -1;
         }
         
+        
+        
         if (data[2] == 0) {
+                for (n = 32; n < len; ) {
+                        id = (data[n] * 256)  + data[n + 1];
+                        slLen = (data[n+2] * 256)  + data[n + 3];
+
+                        gs105e_interpret_slice(id, &data[n + 4], slLen);
+                        n += slLen + 4;
+                }
                 return data[2];
         }
 }
 int gs105e_act() {
         gs105e_query();
-        return gs105e_actRecv();
+        int n = gs105e_actRecv();
+        if (n < 0){
+                gs105e_query();
+                n = gs105e_actRecv();
+        }
+        return n;
 }
 
 
@@ -342,17 +359,17 @@ int gs105e_restart(int vlanId) {
 
 int gs105e_mirrorPorts(int outputPort, int mirrorMask) {
         makeHeader(QR_EXEC);
-        char data[3] = {outputPort, 0,  mirrorMask};
+        char data[3] = {(char)outputPort, 0, (char) mirrorMask};
         
         addActData(ACT_PORTMIRROR, 3, data);
         return gs105e_act();
 }
 
 int gs105e_cableDiagnostics(int port) {
-        makeHeader(QR_EXEC);
+        makeHeader(QR_REQ);
         char data[1] = {port};
         
-        addActData(ACT_PORTMIRROR, 3, data);
+        addActData(GS_PORTDIAG, 1, data);
         return gs105e_act();
 }
 
@@ -364,6 +381,14 @@ int gs105e_setName(char * data) {
         return gs105e_act();
 }
 
+int gs105e_setPassword(char * data) {
+        makeHeader(QR_EXEC);
+        
+        
+        addActData(GS_NEWPASSWORD, strlen(data), data);
+        return gs105e_act();
+}
+
 int gs105e_dhcpSettings(int action) {
         makeHeader(QR_EXEC);
         char data[1] = {(char)action};
@@ -372,6 +397,14 @@ int gs105e_dhcpSettings(int action) {
         return gs105e_act();
 }
 
+int gs105e_vlanEnable(void) {
+        makeHeader(QR_EXEC);
+        char data[1] = {4};
+        
+        addActData(GS_VLANSETTING, 1, data);
+        return gs105e_act();        
+}
+
 void addDiscoveredDevice(int id) {
         
         struct gs105e_discovered * ddev = gs105e_devs;
@@ -460,6 +493,7 @@ void gs105e_queryAll(void) {
         addQuery(ACT_DHCP);
         addQuery(GS_PORTSTATUS);        
         addQuery(GS_VLAN);
+        addQuery(GS_VLANSETTING);
         
         gs105e_query ();
          gs105e_receive();