]> git.sur5r.net Git - ngadmin/blob - controller.c
14b596f56dc414e0cd600b6ef5e3056bc7a9af49
[ngadmin] / controller.c
1
2 #include "controller.h"
3
4
5
6
7 static char password[128];
8 static List *swiList=NULL;
9 static struct swi_attr *current=NULL;
10 static unsigned int seq=0;
11
12
13
14
15 // =============================================================================
16
17
18 // ------------------------
19 void startController (void) {
20  
21  password[0]=0;
22  swiList=createEmptyList();
23  
24 }
25
26
27 // -----------------------
28 void stopController (void) {
29  
30  destroyList(swiList, free);
31  current=NULL;
32  
33 }
34
35
36
37 // =============================================================================
38
39
40 static void getSwitchAttributes (struct swi_attr *sa, const List *l) {
41  
42  const ListNode *ln;
43  const struct attr *at;
44  int len;
45  
46  
47  memset(sa, 0, sizeof(struct swi_attr));
48  sa->ports=0;
49  
50  
51  for (ln=l->first; ln!=NULL; ln=ln->next) {
52   at=ln->data;
53   
54   switch ( at->attr ) {
55    
56    case ATTR_PRODUCT:
57     len=min(at->size, PRODUCT_SIZE);
58     memcpy(sa->product, at->data, len);
59     trim(sa->product, len);
60    break;
61    
62    case ATTR_NAME:
63     len=min(at->size, NAME_SIZE);
64     memcpy(sa->name, at->data, len);
65     trim(sa->name, len);
66    break;
67    
68    case ATTR_MAC:
69     memcpy(&sa->mac, at->data, ETH_ALEN);
70    break;
71    
72    case ATTR_IP:
73     sa->nc.ip=*(struct in_addr*)at->data;
74    break;
75    
76    case ATTR_NETMASK:
77     sa->nc.netmask=*(struct in_addr*)at->data;
78    break;
79    
80    case ATTR_GATEWAY:
81     sa->nc.gw=*(struct in_addr*)at->data;
82    break;
83    
84    case ATTR_END:
85     return;
86    
87   }
88   
89  }
90  
91  
92 }
93
94
95
96 // ------------------------
97 int discoverSwitches (void) {
98  
99  int i;
100  List *attr;
101  struct swi_attr *sa;
102  
103  
104  clearList(swiList, free);
105  current=NULL;
106  
107  attr=createEmptyList();
108  
109  i=0;
110  do {
111   pushBackList(attr, newEmptyAttr(helloRequest[i]));
112  } while ( helloRequest[i++]!=ATTR_END );
113  
114  i=sendNgPacket(CODE_READ_REQ, NULL, ++seq, attr);
115  destroyList(attr, (void(*)(void*))freeAttr);
116  if ( i<0 ) {
117   return ERR_NET;
118  }
119  
120  
121  while ( (attr=recvNgPacket (CODE_READ_REP, NULL, seq))!=NULL ) {
122   sa=malloc(sizeof(struct swi_attr));
123   getSwitchAttributes(sa, attr);
124   pushBackList(swiList, sa);
125  }
126  
127  destroyList(attr, (void(*)(void*))freeAttr);
128  
129  
130  return ERR_OK;
131  
132 }
133
134
135 // -----------------------------
136 const List* getSwitchList (void) {
137  return swiList;
138 }
139
140
141 // ------------------------------------
142 const struct swi_attr* getCurrentSwitch (void) {
143  return current;
144 }
145
146
147 // --------------
148 int login (int i) {
149  
150  List *attr;
151  ListNode *ln;
152  
153  
154  if ( i<0 || i>(int)swiList->count ) {
155   return ERR_BADID;
156  }
157  
158  
159  for (ln=swiList->first; i-->0; ln=ln->next);
160  current=ln->data;
161  
162  
163  //attr=createEmptyList();
164  
165  
166  
167  return ERR_OK;
168  
169 }
170
171
172 //int logout (void);
173
174
175 // --------------------------------
176 void setPassword (const char *pass) {
177  
178  strncpy(password, pass, sizeof(password));
179  
180 }
181
182
183 //int changePassword (const char *pass);
184
185
186
187 // =============================================================================
188
189
190 //int getPortsNumber (void);
191
192 // ------------------------------------------------
193 int getPortsStatus (unsigned char *ports, int size) {
194  
195  List *attr;
196  ListNode *ln;
197  struct attr *at;
198  char *p;
199  int i;
200  
201  
202  if ( ports==NULL || size<=0 ) {
203   return ERR_INVARG;
204  } else if ( current==NULL ) {
205   return ERR_NOTLOG;
206  }
207  
208  
209  attr=createEmptyList();
210  pushBackList(attr, newEmptyAttr(ATTR_PORT_STATUS));
211  pushBackList(attr, newEmptyAttr(ATTR_END));
212  
213  
214  i=sendNgPacket(CODE_READ_REQ, NULL, ++seq, attr);
215  destroyList(attr, (void(*)(void*))freeAttr);
216  if ( i<0 ) {
217   return ERR_NET;
218  }
219  
220  if ( (attr=recvNgPacket (CODE_READ_REP, NULL, seq))==NULL ) {
221   return ERR_TIMEOUT;
222  }
223  
224  for (ln=attr->first; ln!=NULL; ln=ln->next) {
225   at=ln->data;
226   p=at->data;
227   if ( at->attr==ATTR_PORT_STATUS && p[0]-1<size ) {
228    i=p[0]-1;
229    ports[i]=p[1];
230   }
231  }
232  
233  destroyList(attr, (void(*)(void*))freeAttr);
234  
235  
236  return ERR_OK;
237  
238 }
239
240
241 //int getPortsStatistics (unsigned long long stats[][6], int size);
242
243 //int resetPortsStatistics (void);
244
245
246