11 int ngadmin_getVLANType (struct ngadmin *nga, int *t)
18 if (nga == NULL || t == NULL)
20 else if (nga->current == NULL)
24 attr = createEmptyList();
25 pushBackList(attr, newEmptyAttr(ATTR_VLAN_TYPE));
26 ret=readRequest(nga, attr);
30 filterAttributes(attr, ATTR_VLAN_TYPE, ATTR_END);
34 if (attr->first != NULL) {
35 at = attr->first->data;
36 *t =(int)*(char*)at->data;
41 destroyList(attr, (void(*)(void*))freeAttr);
48 int ngadmin_setVLANType (struct ngadmin *nga, int t)
53 if (nga == NULL || t < 1 || t > 4)
55 else if (nga->current == NULL)
59 attr = createEmptyList();
60 pushBackList(attr, newByteAttr(ATTR_VLAN_TYPE, t));
63 return writeRequest(nga, attr);
67 int ngadmin_getVLANPortConf (struct ngadmin *nga, unsigned char *ports)
73 struct attr_vlan_conf *avc;
78 if (nga == NULL || ports== NULL)
86 attr = createEmptyList();
87 pushBackList(attr, newEmptyAttr(ATTR_VLAN_PORT_CONF));
88 ret = readRequest(nga, attr);
92 filterAttributes(attr, ATTR_VLAN_PORT_CONF, ATTR_END);
94 memset(ports, 0, sa->ports);
96 for (ln = attr->first; ln != NULL; ln = ln->next) {
100 if (at->size != sizeof(struct attr_vlan_conf) + sa->ports)
103 for (port = 0; port < sa->ports; port++) {
104 if (avc->ports[port] == VLAN_UNTAGGED)
105 ports[port] = avc->vlan;
111 destroyList(attr, (void(*)(void*))freeAttr);
118 int ngadmin_setVLANPortConf (struct ngadmin *nga, const unsigned char *ports)
124 struct attr_vlan_conf *avc;
125 int ret = ERR_OK, port;
129 if (nga == NULL || ports == NULL)
136 /* if nothing is to be changed, do nothing */
137 for (port = 0; port < sa->ports && ports[port] == 0; port++);
138 if (port == sa->ports )
141 attr = createEmptyList();
143 if (memchr(ports, 0, sa->ports) != NULL) {
144 /* if at least one port is unchanged, we need to read old config */
145 pushBackList(attr, newEmptyAttr(ATTR_VLAN_PORT_CONF));
146 ret = readRequest(nga, attr);
150 filterAttributes(attr, ATTR_VLAN_PORT_CONF, ATTR_END);
151 /* FIXME: check if the returned array effectively contains correct data */
153 /* create an empty VLAN config */
154 for (vlan = VLAN_MIN; vlan <= VLAN_PORT_MAX; vlan++) {
155 avc = malloc(sizeof(struct attr_vlan_conf) + sa->ports);
157 memset(avc->ports, 0, sa->ports);
158 pushBackList(attr, newAttr(ATTR_VLAN_PORT_CONF, sizeof(struct attr_vlan_conf) + sa->ports, avc));
162 for (ln = attr->first; ln != NULL; ln = ln->next) {
165 for (port = 0; port < sa->ports; port++) {
166 if (ports[port] == avc->vlan)
167 avc->ports[port] = VLAN_UNTAGGED;
169 avc->ports[port] = VLAN_NO;
173 ret = writeRequest(nga, attr);
178 destroyList(attr, (void(*)(void*))freeAttr);
185 int ngadmin_getVLANDotAllConf (struct ngadmin *nga, unsigned short *vlans, unsigned char *ports, int *nb)
190 int ret = ERR_OK, total;
191 struct attr_vlan_conf *avc;
195 if (nga == NULL || vlans == NULL || ports== NULL || nb == NULL || *nb <= 0)
206 attr = createEmptyList();
207 pushBackList(attr, newEmptyAttr(ATTR_VLAN_DOT_CONF));
208 ret = readRequest(nga, attr);
212 filterAttributes(attr, ATTR_VLAN_DOT_CONF, ATTR_END);
214 memset(vlans, 0, total * sizeof(unsigned short));
215 memset(ports, 0, total * sa->ports);
217 for (ln = attr->first; ln != NULL; ln = ln->next) {
221 if (at->size != sizeof(struct attr_vlan_conf) + sa->ports)
225 memcpy(ports, avc->ports, sa->ports);
232 break; /* no more room */
237 destroyList(attr, (void(*)(void*))freeAttr);
244 int ngadmin_getVLANDotConf (struct ngadmin *nga, unsigned short vlan, unsigned char *ports)
250 struct attr_vlan_conf *avc;
253 if (nga == NULL || vlan < VLAN_MIN || vlan > VLAN_DOT_MAX || ports == NULL)
255 else if (nga->current == NULL)
259 attr = createEmptyList();
260 pushBackList(attr, newShortAttr(ATTR_VLAN_DOT_CONF, vlan));
261 ret = readRequest(nga, attr);
265 filterAttributes(attr, ATTR_VLAN_DOT_CONF, ATTR_END);
267 memset(ports, 0, nga->current->ports);
269 for (ln = attr->first; ln != NULL; ln = ln->next) {
272 if (avc->vlan == vlan) {
273 memcpy(ports, avc->ports, nga->current->ports);
280 destroyList(attr, (void(*)(void*))freeAttr);
287 int ngadmin_setVLANDotConf (struct ngadmin *nga, unsigned short vlan, const unsigned char *ports)
292 struct attr_vlan_conf *avc;
293 int ret = ERR_OK, port;
296 if (nga == NULL || vlan < VLAN_MIN || vlan > VLAN_DOT_MAX || ports == NULL)
304 /* if nothing is to be changed, do nothing */
305 for (port = 0; port < sa->ports && ports[port] == VLAN_UNSPEC; port++);
306 if (port == sa->ports )
310 attr = createEmptyList();
311 avc = malloc(sizeof(struct attr_vlan_conf) + sa->ports);
317 /* if all is to be changed, we do not need to read old config */
318 if (memchr(ports, VLAN_UNSPEC, sa->ports) != NULL) {
320 pushBackList(attr, newShortAttr(ATTR_VLAN_DOT_CONF, vlan));
321 ret = readRequest(nga, attr);
325 filterAttributes(attr, ATTR_VLAN_DOT_CONF, ATTR_END);
327 if (attr->first != NULL) {
328 at = attr->first->data;
329 memcpy(avc, at->data, sizeof(struct attr_vlan_conf) + sa->ports);
332 clearList(attr, (void(*)(void*))freeAttr);
337 for (port = 0; port < sa->ports; port++) {
338 if (ports[port] != VLAN_UNSPEC)
339 avc->ports[port] = ports[port];
343 pushBackList(attr, newAttr(ATTR_VLAN_DOT_CONF, sizeof(struct attr_vlan_conf) + sa->ports, avc));
344 ret = writeRequest(nga, attr);
349 destroyList(attr, (void(*)(void*))freeAttr);
356 int ngadmin_VLANDestroy (struct ngadmin *nga, unsigned short vlan)
361 if (nga == NULL || vlan < VLAN_MIN || vlan > VLAN_DOT_MAX)
363 else if (nga->current == NULL)
367 attr = createEmptyList();
368 pushBackList(attr, newShortAttr(ATTR_VLAN_DESTROY, vlan));
371 return writeRequest(nga, attr);
375 int ngadmin_getAllPVID (struct ngadmin *nga, unsigned short *ports)
381 struct attr_pvid *ap;
384 if (nga == NULL || ports == NULL)
386 else if (nga->current == NULL)
390 attr = createEmptyList();
391 pushBackList(attr, newEmptyAttr(ATTR_VLAN_PVID));
392 ret = readRequest(nga, attr);
396 filterAttributes(attr, ATTR_VLAN_PVID, ATTR_END);
398 memset(ports, 0, nga->current->ports * sizeof(unsigned short));
400 for (ln = attr->first; ln != NULL; ln = ln->next) {
403 ports[ap->port - 1] = ap->vlan;
408 destroyList(attr, (void(*)(void*))freeAttr);
415 int ngadmin_setPVID (struct ngadmin *nga, unsigned char port, unsigned short vlan)
418 struct attr_pvid *ap;
421 if (nga == NULL || port < 1 || vlan < VLAN_MIN || vlan > VLAN_DOT_MAX)
423 else if (nga->current == NULL)
425 else if (port > nga->current->ports)
429 attr = createEmptyList();
430 ap = malloc(sizeof(struct attr_pvid));
436 pushBackList(attr, newAttr(ATTR_VLAN_PVID, sizeof(struct attr_pvid), ap));
439 return writeRequest(nga, attr);