8 unsigned char * gs105e_queryData;
9 unsigned int gsDataLen;
11 struct vlan * getVlanSetting(unsigned int vlanId) {
12 struct vlan * _vlan = settings.vlans;
14 while (_vlan != NULL) {
15 if (_vlan->id == vlanId)
23 void addVlanSetting(unsigned int vlanId, unsigned char tagged, unsigned char member) {
24 struct vlan * old = settings.vlans;
25 struct vlan * new = (struct vlan *) malloc (sizeof( struct vlan) );
28 new->members = member;
33 void hexDump (char * data, int len) {
35 for (n = 0; n < len; n++) {
37 printf("\n %06X |",n);
38 printf(" %02X", (int)data[n] & 0xFF);
42 void addData(char * data, int len) {
44 gs105e_queryData = (char * )realloc(gs105e_queryData, sizeof(char) * gsDataLen);
45 memcpy(&gs105e_queryData[gsDataLen - len], data, len);
47 void addQuery(int qid) {
48 char queryData[] = {qid / 256, qid % 256, 0, 0};
49 addData(queryData, 4);
52 void addActData(int actId, int len, char * data) {
54 char actData[] = {actId / 256, actId % 256, len / 256, len % 256};
59 void gs105e_init(void) {
62 gs105e_queryData = NULL;
64 settings.vlans = NULL;
74 return (char)packetId;
77 void makeHeader(unsigned int queryType) {
82 gs105e_queryData = (unsigned char * )realloc(gs105e_queryData, sizeof(char) * 32);
86 for (n = 0; n < 32; n++)
87 gs105e_queryData[n] = 0;
89 gs105e_queryData[0] = queryType / 256;
90 gs105e_queryData[1] = queryType % 256;
92 memcpy(&gs105e_queryData[8], myMac, 6);
93 if (memcpy(settings.mac, "\x00\x00\x00\x00\x00\x00", 6))
94 memcpy(&gs105e_queryData[14], settings.mac, 6);
96 memcpy(&gs105e_queryData[24], "\x4e\x53\x44\x50", 4); //Magic!! :-O
97 if (settings.password != NULL && queryType == QR_EXEC) {
99 addActData(GS_PASSWORD, strlen(settings.password), settings.password);
108 hexDump(gs105e_queryData, gsDataLen);
111 void emptyBuffer(void) {
113 while (recvBroadcast(tmp) > 0 ) {
118 void gs105e_query (void) {
120 gs105e_queryData[23] = newPacketId();
122 if (gs105e_queryData[gsDataLen - 4] != 0xFF | gs105e_queryData[gsDataLen - 3] != 0xFF | gs105e_queryData[gsDataLen - 2] != 0x00 | gs105e_queryData[gsDataLen - 1] != 0x00)
123 addData("\xFF\xFF\x00\x00", 4);
124 sendBroadcast(gs105e_queryData, gsDataLen);
128 unsigned long toLong(char * data) {
131 for (n = 0; n < 8; n++) {
133 a |= ((unsigned long)data[n]) & 0xFF;
138 unsigned int toUInt4(char * data) {
141 for (n = 0; n < 4; n++) {
143 a |= ((unsigned int )data[n]) & 0xFF;
148 unsigned int toUInt(char * data) {
151 for (n = 0; n < 2; n++) {
153 a |= ((unsigned int )data[n]) & 0xFF;
158 void gs105e_interpret_slice(unsigned int ID, char * data, int len) {
160 struct portStatistic *p;
164 mLen = (strstr(data, " ") - data) + 1;
165 settings.model = realloc(settings.model, sizeof(char) * mLen);
166 memcpy(settings.model, data, mLen);
169 mLen= (strchr(data, 0x00) - data) + 1;
170 settings.name = realloc(settings.name, sizeof(char) * mLen);
171 memcpy(settings.name, data, mLen);
174 memcpy(settings.mac, data, 6);
177 memcpy(settings.ip, data, 4);
180 memcpy(settings.subnetmask, data, 4);
183 memcpy(settings.gateway, data, 4);
185 case GS_FIRMWAREVER:;
186 settings.swVersion = realloc(settings.swVersion, sizeof(char) * len);
187 memcpy(settings.swVersion, data, len);
189 case GS_PACKETSTATISTICS:;
190 tmp = (unsigned int)data[0] - 1;
193 p = &settings.portStatistics[tmp];
195 p->bytesIn = toLong(&data[1]);
196 p->bytesOut = toLong(&data[9]);
197 p->errors = toLong(&data[41]);
200 unsigned int vlanId = toUInt(data);
201 unsigned char tagged = (unsigned char) data[3];
202 unsigned char memberOf = (unsigned char) data[2];
203 struct vlan * _vlan = getVlanSetting(vlanId);
206 addVlanSetting(vlanId, tagged, memberOf);
208 _vlan->members = memberOf;
216 unsigned int portId = (unsigned int) data[0];
217 unsigned char state = (unsigned char) data[1];
218 p = &settings.portStatistics[portId - 1];
222 p = &settings.portStatistics[data[0]];
223 p->cableError = (char)toUInt4(&data[1]);
224 p->errorDist = (char)toUInt4(&data[5]);
227 settings.dhcp = data[1] & 0x03;
232 int gs105e__receive(void) {
234 int len = recvBroadcast(data);
242 // hexDump(data, len);
244 // printf("Received No or Invalid Packet\n");
247 if (memcmp(&data[8], myMac, 6) | data[0] != 0x01 | (!(data[1] == 0x02 | data[1] == 0x04))) {
251 for (n = 32; n < len; ) {
252 id = (data[n] * 256) + data[n + 1];
253 slLen = (data[n+2] * 256) + data[n + 3];
255 gs105e_interpret_slice(id, &data[n + 4], slLen);
263 int gs105e_receive(void) {
264 if (gs105e__receive() == -1) {
266 return gs105e_receive();
272 int gs105e_actRecv(void) {
274 int len = recvBroadcast_tout(data);
282 // hexDump(data, len);
284 // printf("Received No or Invalid Packet\n");
287 if (memcmp(&data[8], myMac, 6) | data[0] != 0x01 | (!(data[1] == 0x02 | data[1] == 0x04))) {
295 for (n = 32; n < len; ) {
296 id = (data[n] * 256) + data[n + 1];
297 slLen = (data[n+2] * 256) + data[n + 3];
299 gs105e_interpret_slice(id, &data[n + 4], slLen);
307 return gs105e_actRecv();
311 int gs105e_addVlan(int vlanId) {
314 char data[4] = {vlanId / 256, vlanId % 256, 0, 0};
316 addActData(ACT_ADDVLAN, 4, data);
322 int gs105e_setVlanMembers(unsigned int vlanId, unsigned int members, unsigned int tagged) {
323 char data[4] = {0, vlanId & 0xFF, (char)members & 0xFF, (char)tagged & 0xFF};
325 addActData(GS_VLAN, 4, data);
331 int gs105e_delVlan(int vlanId) {
334 char data[2] = {vlanId / 256, vlanId % 256};
336 addActData(ACT_DELVLAN, 2, data);
341 int gs105e_restart(int vlanId) {
346 addActData(ACT_RESTART, 1, data);
352 int gs105e_mirrorPorts(int outputPort, int mirrorMask) {
354 char data[3] = {outputPort, 0, mirrorMask};
356 addActData(ACT_PORTMIRROR, 3, data);
360 int gs105e_cableDiagnostics(int port) {
362 char data[1] = {port};
364 addActData(GS_PORTDIAG, 1, data);
368 int gs105e_setName(char * data) {
372 addActData(GS_NAME, strlen(data), data);
376 int gs105e_dhcpSettings(int action) {
378 char data[1] = {(char)action};
380 addActData(ACT_DHCP, 1, data);
384 void addDiscoveredDevice(int id) {
386 struct gs105e_discovered * ddev = gs105e_devs;
389 ddev = (struct gs105e_discovered *)malloc(sizeof(struct gs105e_discovered));
392 while (ddev != NULL) {
393 if (memcmp(ddev->mac, settings.mac, 6))
400 struct gs105e_discovered * ddev = gs105e_devs;
401 gs105e_devs = (struct gs105e_discovered *)malloc(sizeof(struct gs105e_discovered));
402 gs105e_devs->next = ddev;
405 ddev->name = settings.name;
406 memcpy(ddev->mac, settings.mac, 6);
407 memcpy(ddev->ip, settings.ip, 4);
408 memcpy(ddev->gateway, settings.gateway, 4);
409 ddev->model = settings.model;
415 int gs105e_discover(void) {
417 struct gs105e_discovered * ddev = gs105e_devs;
418 struct gs105e_discovered * ddev_T;
419 while (ddev != NULL) {
431 addQuery(GS_SUBNETMSK);
432 addQuery(GS_GATEWAY);
436 while (gs105e__receive() == 0) {
437 addDiscoveredDevice(n + 1);
445 void gs105e_queryAll(void) {
449 if (settings.vlans != NULL) {
450 struct vlan * vl = settings.vlans;
457 settings.vlans = NULL;
465 addQuery(GS_SUBNETMSK);
466 addQuery(GS_GATEWAY);
467 addQuery(GS_PACKETSTATISTICS);
468 addQuery(GS_FIRMWAREVER);
470 addQuery(GS_PORTSTATUS);