]> git.sur5r.net Git - ngadmin/commitdiff
Added support for changing VLAN 802.1q and PVID configuration.
authordarkcoven <admin@darkcoven.tk>
Wed, 30 Nov 2011 11:00:00 +0000 (12:00 +0100)
committerdarkcoven <admin@darkcoven.tk>
Sat, 29 Dec 2012 21:52:38 +0000 (22:52 +0100)
Lib: fixed the issue when changing only a part of network configuration.

cli/com_qos.c
cli/com_vlan.c
cli/commands.c
cli/common.c
lib/ngadmin.h
lib/src/network.h
lib/src/ngadmin.c
lib/src/protocol.c
lib/src/protocol.h

index cd617417e6e083a16fc867dceab8220002dcb97e..b6904247a1c7fa35795e171b6ce619483371cfb2 100644 (file)
@@ -117,7 +117,7 @@ bool do_qos_show (int nb UNUSED, const char **com UNUSED, struct ngadmin *nga) {
  }
  
  
- printf("QOS mode: ");
+ printf("QoS mode: ");
  
  if ( s==QOS_DOT ) {
   printf("802.1p\n");
index 14be7845caa2755b19a7fb05e5a3907a01aeeafb..813bc18f93b80d92c5d1865bc8b5fcaf7f13b99f 100644 (file)
@@ -94,6 +94,41 @@ bool do_vlan_8021q_show (int nb, const char **com, struct ngadmin *nga) {
 
 
 
+bool do_vlan_8021q_vlan_del (int nb, const char **com, struct ngadmin *nga) {
+ const struct swi_attr *sa;
+ unsigned short vlan;
+ int i;
+ if ( nb!=1 ) {
+  printf("Usage: vlan 8021q vlan del <vlan>\n");
+  return false;
+ }
+ if ( (sa=ngadmin_getCurrentSwitch(nga))==NULL ) {
+  printf("must be logged\n");
+  return false;
+ }
+ vlan=strtoul(com[0], NULL, 0);
+ if ( vlan<1 || vlan>VLAN_MAX ) {
+  printf("vlan out of range\n");
+  return false;
+ }
+ i=ngadmin_VLANDestroy(nga, vlan);
+ printErrCode(i);
+ return true;
+}
+
+
+
 bool do_vlan_mode_show (int nb UNUSED, const char **com UNUSED, struct ngadmin *nga) {
  
  int i, t, ret=true;
@@ -130,6 +165,48 @@ bool do_vlan_mode_show (int nb UNUSED, const char **com UNUSED, struct ngadmin *
 
 
 
+bool do_vlan_pvid_set (int nb, const char **com, struct ngadmin *nga) {
+ const struct swi_attr *sa;
+ unsigned char port;
+ unsigned short vlan;
+ int i;
+ if ( nb!=2 ) {
+  printf("Usage: vlan pvid set <port> <vlan>\n");
+  return false;
+ }
+ if ( (sa=ngadmin_getCurrentSwitch(nga))==NULL ) {
+  printf("must be logged\n");
+  return false;
+ }
+ port=strtoul(com[0], NULL, 0);
+ vlan=strtoul(com[1], NULL, 0);
+ if ( port<1 || port>sa->ports ) {
+  printf("port out of range\n");
+  return false;
+ }
+ if ( vlan<1 || vlan>VLAN_MAX ) {
+  printf("vlan out of range\n");
+  return false;
+ }
+ i=ngadmin_setPVID(nga, port, vlan);
+ printErrCode(i);
+ return true;
+}
+
+
+
 bool do_vlan_pvid_show (int nb UNUSED, const char **com UNUSED, struct ngadmin *nga) {
  
  unsigned short *ports=NULL;
@@ -145,7 +222,7 @@ bool do_vlan_pvid_show (int nb UNUSED, const char **com UNUSED, struct ngadmin *
  }
  
  ports=malloc(sa->ports*sizeof(unsigned short));
- i=ngadmin_getPVID(nga, ports);
+ i=ngadmin_getAllPVID(nga, ports);
  if ( i!=ERR_OK ) {
   printErrCode(i);
   ret=false;
index 70740b2d64c6b9ece2d0c56f45b77b314676b20f..552d18e03b4e9fd8430f9fd30148828e5239c50e 100644 (file)
@@ -93,7 +93,9 @@ bool do_tree (int nb, const char **com, struct ngadmin *nga);
 
 // vlan
 bool do_vlan_8021q_show (int nb, const char **com, struct ngadmin *nga);
+bool do_vlan_8021q_vlan_del (int nb, const char **com, struct ngadmin *nga);
 bool do_vlan_mode_show (int nb UNUSED, const char **com UNUSED, struct ngadmin *nga);
+bool do_vlan_pvid_set (int nb, const char **com, struct ngadmin *nga);
 bool do_vlan_pvid_show (int nb, const char **com, struct ngadmin *nga);
 
 
@@ -183,7 +185,7 @@ COM_ROOT_START(coms)
    COM_TERM(show, do_vlan_8021q_show, true)
    COM_START(vlan)
     COM_TERM(add, NULL, true)
-    COM_TERM(del, NULL, true)
+    COM_TERM(del, do_vlan_8021q_vlan_del, true)
     COM_TERM(flush, NULL, true)
    COM_END
   COM_END
@@ -194,7 +196,7 @@ COM_ROOT_START(coms)
   COM_START(port)
   COM_END
   COM_START(pvid)
-   COM_TERM(set, NULL, true)
+   COM_TERM(set, do_vlan_pvid_set, true)
    COM_TERM(show, do_vlan_pvid_show, false)
   COM_END
  COM_END
index 59f7058bfbae5ce360a885ed87d9d6d777be5085..0911a1a12cf05d80ea1d63f52984867c1de43f57 100644 (file)
@@ -96,7 +96,7 @@ void displaySwitchTab (const struct swi_attr *sa, int nb) {
  printf("Num\tMac\t\t\tProduct\t\tName\t\t\tIP/mask\t\t\tDHCP\tPorts\tFirmware\n");
  
  for (i=0; i<nb; ++i) {
-  printf("%i\t%s\t%s\t\t%s\t%s/", i, ether_ntoa(&sa[i].mac), sa[i].product, sa[i].name, inet_ntoa(sa[i].nc.ip));
+  printf("%i\t%s\t%s\t%s\t\t%s/", i, ether_ntoa(&sa[i].mac), sa[i].product, sa[i].name, inet_ntoa(sa[i].nc.ip));
   printf("%s\t%s\t%i\t%s\n", inet_ntoa(sa[i].nc.netmask), ( sa[i].nc.dhcp ? "Yes" : "No" ), sa[i].ports, sa[i].firmware);
  }
  
index adaddfed53faf4ce33c74ffb6522f65de721b117..9edcfe5761b83f203517f1c79b8c00efa0e88ada 100644 (file)
@@ -45,6 +45,8 @@
 #define VLAN_UNTAGGED          1
 #define VLAN_TAGGED            2
 
+#define VLAN_MAX               4093
+
 #define QOS_PORT               1
 #define QOS_DOT                        2
 
@@ -251,6 +253,10 @@ int ngadmin_setNetConf (struct ngadmin *nga, const struct net_conf *nc) EXPORT;
 int ngadmin_getVLANType (struct ngadmin *nga, int *t) EXPORT;
 
 
+// 
+int ngadmin_setVLANType (struct ngadmin *nga, int t) EXPORT;
+
+
 // 
 int ngadmin_getVLANDotAllConf (struct ngadmin *nga, unsigned short *vlans, unsigned char *ports, int *nb) EXPORT;
 
@@ -260,7 +266,19 @@ int ngadmin_getVLANDotConf (struct ngadmin *nga, unsigned short vlan, unsigned c
 
 
 // 
-int ngadmin_getPVID (struct ngadmin *nga, unsigned short *ports) EXPORT;
+int ngadmin_setVLANDotConf (struct ngadmin *nga, unsigned short vlan, const unsigned char *ports) EXPORT;
+
+
+// 
+int ngadmin_VLANDestroy (struct ngadmin *nga, unsigned short vlan) EXPORT;
+
+
+// 
+int ngadmin_getAllPVID (struct ngadmin *nga, unsigned short *ports) EXPORT;
+
+
+// 
+int ngadmin_setPVID (struct ngadmin *nga, unsigned char port, unsigned short vlan) EXPORT;
 
 
 
index c9043d2e871be961cbdee163d3706dccd51a3b0e..42a142c89173ddba93eda9e48f0e0eafeddbec4a 100644 (file)
@@ -16,6 +16,7 @@
 
 
 
+
 // 
 int startNetwork (struct ngadmin *nga);
 
index f1dee3e595737a54477e9ac4d3c6009c29539e3a..8248345b67612cc2b7e775f77e8795667439be89 100644 (file)
@@ -1148,6 +1148,7 @@ int ngadmin_setNetConf (struct ngadmin *nga, const struct net_conf *nc) {
   pushBackList(attr, newByteAttr(ATTR_DHCP, 1));
  } else {
   pushBackList(attr, newByteAttr(ATTR_DHCP, 0));
+  // only add non-null values
   if ( nc->ip.s_addr!=0 ) pushBackList(attr, newAddrAttr(ATTR_IP, nc->ip));
   if ( nc->netmask.s_addr!=0 ) pushBackList(attr, newAddrAttr(ATTR_NETMASK, nc->netmask));
   if ( nc->gw.s_addr!=0 ) pushBackList(attr, newAddrAttr(ATTR_GATEWAY, nc->gw));
@@ -1158,10 +1159,12 @@ int ngadmin_setNetConf (struct ngadmin *nga, const struct net_conf *nc) {
  }
  
  
- if ( nc->dhcp ) {
-  sa->nc.dhcp=true;
- } else {
-  memcpy(&sa->nc, nc, sizeof(struct net_conf));
+ // update local values
+ sa->nc.dhcp=nc->dhcp;
+ if ( !nc->dhcp ) {
+  if ( nc->ip.s_addr!=0 ) sa->nc.ip=nc->ip;
+  if ( nc->netmask.s_addr!=0 ) sa->nc.netmask=nc->netmask;
+  if ( nc->gw.s_addr!=0 ) sa->nc.gw=nc->gw;
  }
  
  
@@ -1214,6 +1217,30 @@ int ngadmin_getVLANType (struct ngadmin *nga, int *t) {
 
 
 
+// -------------------------------------------------
+int ngadmin_setVLANType (struct ngadmin *nga, int t) {
+ List *attr;
+ struct swi_attr *sa;
+ if ( nga==NULL || t<1 || t>4 ) {
+  return ERR_INVARG;
+ } else if ( (sa=nga->current)==NULL ) {
+  return ERR_NOTLOG;
+ }
+ attr=createEmptyList();
+ pushBackList(attr, newByteAttr(ATTR_VLAN_TYPE, t));
+ return writeRequest(nga, attr);
+}
+
+
+
 // ------------------------------------------------------------------------------------------------------
 int ngadmin_getVLANDotAllConf (struct ngadmin *nga, unsigned short *vlans, unsigned char *ports, int *nb) {
  
@@ -1317,8 +1344,74 @@ int ngadmin_getVLANDotConf (struct ngadmin *nga, unsigned short vlan, unsigned c
 
 
 
-// -------------------------------------------------------------
-int ngadmin_getPVID (struct ngadmin *nga, unsigned short *ports) {
+// ----------------------------------------------------------------------------------------------
+int ngadmin_setVLANDotConf (struct ngadmin *nga, unsigned short vlan, const unsigned char *ports) {
+ List *attr;
+ struct swi_attr *sa;
+ int i;
+ char *p;
+ if ( nga==NULL || ports==NULL || vlan<1 || vlan>VLAN_MAX ) {
+  return ERR_INVARG;
+ } else if ( (sa=nga->current)==NULL ) {
+  return ERR_NOTLOG;
+ }
+ attr=createEmptyList();
+ p=malloc(4);
+ *(unsigned short*)p=htons(vlan);
+ for (i=1; i<=sa->ports; ++i) {
+  if ( ports[i-1]==VLAN_TAGGED ) { // tagged
+   p[3]|=(1<<(sa->ports-i));
+  } else if ( ports[i-1]==VLAN_UNTAGGED ) { // untagged
+   p[2]|=(1<<(sa->ports-i));
+  }
+ }
+ // tagged ports must be also present in untagged ports
+ p[2]|=ports[3];
+ pushBackList(attr, newAttr(ATTR_VLAN_DOT_CONF, 4, p));
+ return writeRequest(nga, attr);
+}
+
+
+
+// ---------------------------------------------------------------
+int ngadmin_VLANDestroy (struct ngadmin *nga, unsigned short vlan) {
+ List *attr;
+ struct swi_attr *sa;
+ if ( nga==NULL || vlan<1 || vlan>VLAN_MAX ) {
+  return ERR_INVARG;
+ } else if ( (sa=nga->current)==NULL ) {
+  return ERR_NOTLOG;
+ }
+ attr=createEmptyList();
+ pushBackList(attr, newShortAttr(ATTR_VLAN_DESTROY, vlan));
+ return writeRequest(nga, attr);
+}
+
+
+
+// ----------------------------------------------------------------
+int ngadmin_getAllPVID (struct ngadmin *nga, unsigned short *ports) {
  
  List *attr;
  ListNode *ln;
@@ -1360,4 +1453,34 @@ int ngadmin_getPVID (struct ngadmin *nga, unsigned short *ports) {
 
 
 
+// -------------------------------------------------------------------------------
+int ngadmin_setPVID (struct ngadmin *nga, unsigned char port, unsigned short vlan) {
+ List *attr;
+ struct swi_attr *sa;
+ char *p;
+ if ( nga==NULL || port<1 || vlan<1 || vlan>VLAN_MAX ) {
+  return ERR_INVARG;
+ } else if ( (sa=nga->current)==NULL ) {
+  return ERR_NOTLOG;
+ } else if ( port>sa->ports ) {
+  return ERR_INVARG;
+ }
+ attr=createEmptyList();
+ p=malloc(3);
+ p[0]=port;
+ *(unsigned short*)&p[1]=htons(vlan);
+ pushBackList(attr, newAttr(ATTR_VLAN_PVID, 3, p));
+ return writeRequest(nga, attr);;
+}
+
+
 
index d1be292b8d8d7f460171001b812522d50235e523..61dd6faddc76e4496b170f373287c080ed0ca054 100644 (file)
@@ -9,6 +9,28 @@ const struct ether_addr nullMac={.ether_addr_octet={0, 0, 0, 0, 0, 0}};
 
 
 
+
+// ----------------------------
+int trim (char *txt, int start) {
+ char *p, c;
+ if ( txt==NULL ) {
+  return 0;
+ }
+ //for (p=txt; *p!=0; p++);
+ p=txt+start;
+ for (p--; p>=txt && ( (c=*p)==' ' || c=='\n' ); *p--=0);
+ return p-txt+1;
+}
+
+
+
 // -------------------
 int min (int a, int b) {
  return a<b ? a : b ;
@@ -287,8 +309,6 @@ void extractSwitchAttributes (struct swi_attr *sa, const List *l) {
  
  memset(sa, 0, sizeof(struct swi_attr));
  
- // FIXME: mutex lock ?
  for (ln=l->first; ln!=NULL; ln=ln->next) {
   at=ln->data;
   
@@ -297,13 +317,13 @@ void extractSwitchAttributes (struct swi_attr *sa, const List *l) {
    case ATTR_PRODUCT:
     len=min(at->size, PRODUCT_SIZE);
     memcpy(sa->product, at->data, len);
-    //trim(sa->product, len); // FIXME
+    trim(sa->product, len);
    break;
    
    case ATTR_NAME:
     len=min(at->size, NAME_SIZE);
     memcpy(sa->name, at->data, len);
-    //trim(sa->name, len); // FIXME
+    trim(sa->name, len);
    break;
    
    case ATTR_MAC:
index 3b26f1dfe1defa9c579c069d69130963d4e49c94..f535abac4c337b1ef23289d563ead7e11194ea1e 100644 (file)
@@ -60,6 +60,10 @@ extern const struct ether_addr nullMac;
 
 
 
+
+// 
+int trim (char *txt, int start);
+
 // 
 int min (int a, int b);