X-Git-Url: https://git.sur5r.net/?p=gsconf;a=blobdiff_plain;f=gs105e.c;h=381f0b14fa22013b90a4b73b962b519a75c559b5;hp=bcd90080921b6882364ea5993c5a46071c8d11e2;hb=HEAD;hpb=bdf95351d3563e4039ee2cc229452d78b3b6a612 diff --git a/gs105e.c b/gs105e.c index bcd9008..381f0b1 100644 --- a/gs105e.c +++ b/gs105e.c @@ -5,8 +5,8 @@ #include #include -unsigned char * gs105e_queryData; -unsigned int gsDataLen; +char * gs105e_queryData; +int gsDataLen; struct vlan * getVlanSetting(unsigned int vlanId) { struct vlan * _vlan = settings.vlans; @@ -74,12 +74,14 @@ char newPacketId() { return (char)packetId; } + + void makeHeader(unsigned int queryType) { int n; - gs105e_queryData = (unsigned char * )realloc(gs105e_queryData, sizeof(char) * 32); + gs105e_queryData = realloc(gs105e_queryData, sizeof(char) * 32); gsDataLen = 32; @@ -90,13 +92,15 @@ 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 if (settings.password != NULL && queryType == QR_EXEC) { - - addActData(GS_PASSWORD, strlen(settings.password), settings.password); + char tmpPassword[strlen(settings.password)]; + for (n = 0; n < strlen(settings.password); n++) + tmpPassword[n] = passwordSecret[n % 19] ^ settings.password[n]; + addActData(GS_PASSWORD, strlen(settings.password), tmpPassword); } @@ -119,7 +123,7 @@ void gs105e_query (void) { emptyBuffer(); gs105e_queryData[23] = newPacketId(); - if (gs105e_queryData[gsDataLen - 4] != 0xFF | gs105e_queryData[gsDataLen - 3] != 0xFF | gs105e_queryData[gsDataLen - 2] != 0x00 | gs105e_queryData[gsDataLen - 1] != 0x00) + if ((gs105e_queryData[gsDataLen - 4] != 0xFF) | (gs105e_queryData[gsDataLen - 3] != 0xFF) | (gs105e_queryData[gsDataLen - 2] != 0x00) | (gs105e_queryData[gsDataLen - 1] != 0x00)) addData("\xFF\xFF\x00\x00", 4); sendBroadcast(gs105e_queryData, gsDataLen); @@ -226,6 +230,9 @@ void gs105e_interpret_slice(unsigned int ID, char * data, int len) { case ACT_DHCP:; settings.dhcp = data[1] & 0x03; break; + case GS_VLANSETTING:; + settings.vlanType = data[0]; + break; } } @@ -244,7 +251,7 @@ int gs105e__receive(void) { // printf("Received No or Invalid Packet\n"); return -1; } - if (memcmp(&data[8], myMac, 6) | data[0] != 0x01 | (!(data[1] == 0x02 | data[1] == 0x04))) { + if (memcmp(&data[8], myMac, 6) | (data[0] != 0x01) | (!((data[1] == 0x02) | (data[1] == 0x04)))) { return -1; } @@ -284,7 +291,7 @@ int gs105e_actRecv(void) { // printf("Received No or Invalid Packet\n"); return -1; } - if (memcmp(&data[8], myMac, 6) | data[0] != 0x01 | (!(data[1] == 0x02 | data[1] == 0x04))) { + if (memcmp(&data[8], myMac, 6) | (data[0] != 0x01) | (!((data[1] == 0x02) | (data[1] == 0x04)))) { gs105e_actRecv(); return -1; } @@ -304,7 +311,12 @@ int gs105e_actRecv(void) { } int gs105e_act() { gs105e_query(); - return gs105e_actRecv(); + int n = gs105e_actRecv(); + if (n < 0){ + gs105e_query(); + n = gs105e_actRecv(); + } + return n; } @@ -338,7 +350,7 @@ int gs105e_delVlan(int vlanId) { return gs105e_act(); } -int gs105e_restart(int vlanId) { +int gs105e_restart(void) { makeHeader(QR_EXEC); char data[1] = {1}; @@ -351,7 +363,7 @@ 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(); @@ -373,6 +385,17 @@ int gs105e_setName(char * data) { return gs105e_act(); } +int gs105e_setPassword(char * data) { + int n; + makeHeader(QR_EXEC); + + char tmpPasswd[strlen(data)]; + for (n = 0; n < strlen(data); n++) + tmpPasswd[n] = data[n] ^ passwordSecret[n % 19]; + addActData(GS_NEWPASSWORD, strlen(data), tmpPasswd); + return gs105e_act(); +} + int gs105e_dhcpSettings(int action) { makeHeader(QR_EXEC); char data[1] = {(char)action}; @@ -381,6 +404,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; @@ -388,25 +419,42 @@ void addDiscoveredDevice(int id) { if (ddev == NULL) { ddev = (struct gs105e_discovered *)malloc(sizeof(struct gs105e_discovered)); gs105e_devs = ddev; + ddev->next = NULL; }else { while (ddev != NULL) { - if (memcmp(ddev->mac, settings.mac, 6)) + if (memcmp(ddev->mac, settings.mac, 6)) { + ddev = ddev->next; continue; - ddev = ddev->next; + } + + break; } + } if (ddev == NULL) { - struct gs105e_discovered * ddev = gs105e_devs; + + ddev = gs105e_devs; gs105e_devs = (struct gs105e_discovered *)malloc(sizeof(struct gs105e_discovered)); + printf("%p\n", gs105e_devs); + printf("%p\n", ddev); gs105e_devs->next = ddev; ddev = gs105e_devs; + printf("%p\n", ddev); + } - ddev->name = settings.name; + + printf("%p\n", ddev->name); + ddev->name = (char *)malloc(sizeof(char) * strlen(settings.name)); + printf("DEBUG 1\n"); + memcpy(ddev->name, settings.name, strlen(settings.name) + 1); memcpy(ddev->mac, settings.mac, 6); + memcpy(ddev->ip, settings.ip, 4); memcpy(ddev->gateway, settings.gateway, 4); - ddev->model = settings.model; + ddev->model = (char *)malloc(sizeof(char) * strlen(settings.model)); + memcpy(ddev->model, settings.model, strlen(settings.model) + 1); + ddev->id = id; } @@ -434,7 +482,9 @@ int gs105e_discover(void) { gs105e_query (); gs105e_query (); while (gs105e__receive() == 0) { + printf("DEGUB DEVICE DISCOVERED\n"); addDiscoveredDevice(n + 1); + n++; } return n; @@ -469,6 +519,7 @@ void gs105e_queryAll(void) { addQuery(ACT_DHCP); addQuery(GS_PORTSTATUS); addQuery(GS_VLAN); + addQuery(GS_VLANSETTING); gs105e_query (); gs105e_receive();