]> git.sur5r.net Git - ngadmin/blobdiff - cli/com_bitrate.c
CLI: separated commands by category in different files.
[ngadmin] / cli / com_bitrate.c
diff --git a/cli/com_bitrate.c b/cli/com_bitrate.c
new file mode 100644 (file)
index 0000000..94afad8
--- /dev/null
@@ -0,0 +1,121 @@
+
+#include "commands.h"
+
+
+
+// helper function to analyse bitrate speed specifications
+static int bitrate_analyse (int nb, const char **com, int *ports) {
+ int i=0, s;
+ while ( i<nb-1 ) {
+  s=parseBitrate(com[i+1]);
+  if ( strcmp(com[i], "inout")==0 ) {
+   ports[0]=s;
+   ports[1]=s;
+  } else if ( strcmp(com[i], "in")==0 ) {
+   ports[0]=s;
+  } else if ( strcmp(com[i], "out")==0 ) {
+   ports[1]=s;
+  } else {
+   break;
+  }
+  i+=2;
+ }
+ return i;
+}
+
+
+
+bool do_bitrate_set (int nb, const char **com, struct ngadmin *nga) {
+ int i, k=0, defs[]={12, 12}, p, *ports=NULL;
+ const struct swi_attr *sa;
+ bool ret=true;
+ if ( nb<2 ) {
+  printf("Usage: bitrate set [all SPEEDSPEC] <port1> SPEEDSPEC [<port2> SPEEDSPEC ...]\n");
+  printf("SPEEDSPEC: [inout <speed>] [in <ispeed>] [out <ospeed>]\n");
+  ret=false;
+  goto end;
+ }
+ if ( (sa=ngadmin_getCurrentSwitch(nga))==NULL ) {
+  printf("must be logged\n");
+  ret=false;
+  goto end;
+ }
+ ports=malloc(2*sa->ports*sizeof(int));
+ // get defaults if present
+ if ( strcmp(com[k], "all")==0 ) {
+  ++k;
+  k+=bitrate_analyse(nb-k, &com[k], defs);
+ }
+ // apply defaults
+ for (i=0; i<sa->ports; ++i) {
+  memcpy(&ports[2*i], defs, sizeof(defs));
+ }
+ // get ports specifics
+ while ( k<nb ) {
+  p=strtol(com[k++], NULL, 0)-1;
+  if ( p>=0 && p<sa->ports ) {
+   k+=bitrate_analyse(nb-k, &com[k], &ports[2*p]);
+  }
+ }
+ // send it to the switch
+ i=ngadmin_setBitrateLimits(nga, ports);
+ printErrCode(i);
+ end:
+ free(ports);
+ return ret;
+}
+
+
+
+bool do_bitrate_show (int nb UNUSED, const char **com UNUSED, struct ngadmin *nga) {
+ int i, ret=true, *ports=NULL;
+ const struct swi_attr *sa;
+ if ( (sa=ngadmin_getCurrentSwitch(nga))==NULL ) {
+  printf("must be logged\n");
+  ret=false;
+  goto end;
+ }
+ ports=malloc(2*sa->ports*sizeof(int));
+ if ( (i=ngadmin_getBitrateLimits(nga, ports))!=ERR_OK ) {
+  printErrCode(i);
+  ret=false;
+  goto end;
+ }
+ for (i=0; i<sa->ports; ++i) {
+  printf("port %i: in %s, out %s\n", i+1, bitrates[ports[2*i+0]], bitrates[ports[2*i+1]]);
+ }
+ end:
+ free(ports);
+ return ret;
+}
+
+
+