7 static const struct timeval default_timeout={.tv_sec=3, .tv_usec=0};
11 // ---------------------------------------------
12 struct ngadmin* ngadmin_init (const char *iface) {
17 // allocate main structure
18 nga=malloc(sizeof(struct ngadmin));
19 memset(nga, 0, sizeof(struct ngadmin));
21 strncpy(nga->iface, iface, IFNAMSIZ-1);
23 if ( startNetwork(nga)<0 ) {
28 nga->timeout=default_timeout;
29 if ( updateTimeout(nga)<0 ) {
41 // ------------------------------------
42 int ngadmin_close (struct ngadmin *nga) {
60 // ------------------------------------------------------------
61 int ngadmin_setPassword (struct ngadmin *nga, const char *pass) {
68 strncpy(nga->password, pass, PASSWORD_MAX);
77 // -------------------------------------------------------------------
78 int ngadmin_setTimeout (struct ngadmin *nga, const struct timeval *tv) {
83 if ( nga==NULL || tv==NULL ) {
89 if ( updateTimeout(nga)<0 ) {
100 // -----------------------------------
101 int ngadmin_scan (struct ngadmin *nga) {
104 List *attr, *swiList;
107 sent by official win client:
123 static const unsigned short hello[]={
146 // create attributes for an "hello" request
147 attr=createEmptyList();
149 pushBackList(attr, newEmptyAttr(hello[i]));
150 if ( hello[i]==ATTR_END ) break;
153 // send request to all potential switches
154 i=sendNgPacket(nga, CODE_READ_REQ, NULL, ++nga->seq, attr);
155 destroyList(attr, (void(*)(void*))freeAttr);
161 // try to receive any packets until timeout
162 swiList=createEmptyList();
163 while ( (attr=recvNgPacket(nga, CODE_READ_REP, NULL, NULL, NULL, nga->seq))!=NULL ) {
164 sa=malloc(sizeof(struct swi_attr));
165 extractSwitchAttributes(sa, attr);
166 destroyList(attr, (void(*)(void*))freeAttr);
167 pushBackList(swiList, sa);
170 nga->swi_count=swiList->count;
171 nga->swi_tab=convertToArray(swiList, sizeof(struct swi_attr));
180 // -----------------------------------------------------------------------
181 const struct swi_attr* ngadmin_getSwitchTab (struct ngadmin *nga, int *nb) {
184 if ( nga==NULL || nb==NULL ) {
198 // ------------------------------------------------------------------
199 const struct swi_attr* ngadmin_getCurrentSwitch (struct ngadmin *nga) {
213 // --------------------------------------------
214 int ngadmin_login (struct ngadmin *nga, int id) {
220 unsigned short attr_error;
225 } else if ( id<0 || id>=nga->swi_count ) {
231 sa=&nga->swi_tab[id];
233 attr=createEmptyList();
234 pushBackList(attr, newAttr(ATTR_PASSWORD, strlen(nga->password), strdup(nga->password)));
235 pushBackList(attr, newEmptyAttr(ATTR_END));
236 i=sendNgPacket(nga, CODE_READ_REQ, &sa->mac, ++nga->seq, attr);
237 destroyList(attr, (void(*)(void*))freeAttr);
238 if ( i<0 || (attr=recvNgPacket(nga, CODE_READ_REP, &err, &attr_error, &sa->mac, nga->seq))==NULL ) {
244 destroyList(attr, (void(*)(void*))freeAttr);
245 if ( err==7 && attr_error==ATTR_PASSWORD ) {
263 // -------------------------------------------------------------------
264 int ngadmin_getPortsStatus (struct ngadmin *nga, unsigned char *ports) {
273 if ( nga==NULL || ports==NULL ) {
275 } else if ( nga->current==NULL ) {
280 attr=createEmptyList();
281 pushBackList(attr, newEmptyAttr(ATTR_PORT_STATUS));
282 pushBackList(attr, newEmptyAttr(ATTR_END));
283 i=sendNgPacket(nga, CODE_READ_REQ, &nga->current->mac, ++nga->seq, attr);
284 destroyList(attr, (void(*)(void*))freeAttr);
285 if ( i<0 || (attr=recvNgPacket(nga, CODE_READ_REP, NULL, NULL, &nga->current->mac, nga->seq))==NULL ) {
290 for (ln=attr->first; ln!=NULL; ln=ln->next) {
293 if ( at->attr==ATTR_PORT_STATUS && at->size>=2 && (i=p[0]-1)>=0 && i<nga->current->ports ) {
298 destroyList(attr, (void(*)(void*))freeAttr);
309 // --------------------------------------------------------
310 int ngadmin_setName (struct ngadmin *nga, const char *name) {
315 unsigned short attr_error;
320 } else if ( nga->current==NULL ) {
325 attr=createEmptyList();
326 pushBackList(attr, newAttr(ATTR_PASSWORD, strlen(nga->password), strdup(nga->password)));
328 pushBackList(attr, newEmptyAttr(ATTR_NAME));
330 pushBackList(attr, newAttr(ATTR_NAME, strlen(name), strdup(name)));
332 pushBackList(attr, newEmptyAttr(ATTR_END));
333 i=sendNgPacket(nga, CODE_WRITE_REQ, &nga->current->mac, ++nga->seq, attr);
334 destroyList(attr, (void(*)(void*))freeAttr);
335 if ( i<0 || (attr=recvNgPacket(nga, CODE_WRITE_REP, &err, &attr_error, &nga->current->mac, nga->seq))==NULL ) {
340 destroyList(attr, (void(*)(void*))freeAttr);
341 if ( err==7 && attr_error==ATTR_PASSWORD ) {
347 // successful, also update local name
349 nga->current->name[0]=0;
351 strncpy(nga->current->name, name, NAME_SIZE);
363 // ------------------------------------------------------------------------
364 int ngadmin_getPortsStatistics (struct ngadmin *nga, struct port_stats *ps) {
373 if ( nga==NULL || ps==NULL ) {
375 } else if ( nga->current==NULL ) {
380 attr=createEmptyList();
381 pushBackList(attr, newEmptyAttr(ATTR_PORT_STATISTICS));
382 pushBackList(attr, newEmptyAttr(ATTR_END));
383 i=sendNgPacket(nga, CODE_READ_REQ, &nga->current->mac, ++nga->seq, attr);
384 destroyList(attr, (void(*)(void*))freeAttr);
385 if ( i<0 || (attr=recvNgPacket(nga, CODE_READ_REP, NULL, NULL, &nga->current->mac, nga->seq))==NULL ) {
390 for (ln=attr->first; ln!=NULL; ln=ln->next) {
392 if ( at->attr==ATTR_PORT_STATISTICS && at->size>=49 && (port=(int)(*(char*)at->data)-1)>=0 && port<nga->current->ports ) {
393 ps[port].recv=be64toh(*(unsigned long long*)(at->data+1+8*0));
394 ps[port].sent=be64toh(*(unsigned long long*)(at->data+1+8*1));
395 ps[port].crc=be64toh(*(unsigned long long*)(at->data+1+8*5));
396 // all offsets between 2 and 4 inclusive are unknown values
400 destroyList(attr, (void(*)(void*))freeAttr);
412 // ---------------------------------------------------
413 int ngadmin_resetPortsStatistics (struct ngadmin *nga) {
418 unsigned short attr_error;
423 } else if ( nga->current==NULL ) {
428 attr=createEmptyList();
429 pushBackList(attr, newAttr(ATTR_PASSWORD, strlen(nga->password), strdup(nga->password)));
430 pushBackList(attr, newByteAttr(ATTR_STATS_RESET, 1));
431 pushBackList(attr, newEmptyAttr(ATTR_END));
432 i=sendNgPacket(nga, CODE_WRITE_REQ, &nga->current->mac, ++nga->seq, attr);
433 destroyList(attr, (void(*)(void*))freeAttr);
434 if ( i<0 || (attr=recvNgPacket(nga, CODE_WRITE_REP, &err, &attr_error, &nga->current->mac, nga->seq))==NULL ) {
439 destroyList(attr, (void(*)(void*))freeAttr);
441 if ( err==7 && attr_error==ATTR_PASSWORD ) {
456 // ---------------------------------------------------------------
457 int ngadmin_changePassword (struct ngadmin *nga, const char* pass) {
462 unsigned short attr_error;
465 if ( nga==NULL || pass==NULL ) {
467 } else if ( nga->current==NULL ) {
472 attr=createEmptyList();
473 pushBackList(attr, newAttr(ATTR_PASSWORD, strlen(nga->password), strdup(nga->password)));
474 pushBackList(attr, newAttr(ATTR_NEW_PASSWORD, strlen(pass), strdup(pass)));
475 pushBackList(attr, newEmptyAttr(ATTR_END));
476 i=sendNgPacket(nga, CODE_WRITE_REQ, &nga->current->mac, ++nga->seq, attr);
477 destroyList(attr, (void(*)(void*))freeAttr);
478 if ( i<0 || (attr=recvNgPacket(nga, CODE_WRITE_REP, &err, &attr_error, &nga->current->mac, nga->seq))==NULL ) {
483 destroyList(attr, (void(*)(void*))freeAttr);
485 if ( err==7 && attr_error==ATTR_PASSWORD ) {
491 // successful, also update local password
492 strncpy(nga->password, pass, PASSWORD_MAX);