sgw: preserve order of declared SmartGatewayEgressInterfaces
authorFerry Huberts <ferry.huberts@pelagic.nl>
Thu, 13 Feb 2014 13:03:05 +0000 (14:03 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Thu, 13 Feb 2014 13:05:16 +0000 (14:05 +0100)
Instead of reversing the order

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
src/cfgparser/oparse.y

index 4e78a61..40d3054 100644 (file)
@@ -1359,7 +1359,7 @@ sgw_egress_ifs:   | sgw_egress_ifs sgw_egress_if
 
 sgw_egress_if: TOK_STRING
 {
-  struct sgw_egress_if *in, *previous;
+  struct sgw_egress_if *in, *previous, *last;
   char * str = $1->string;
   char *end;
 
@@ -1394,15 +1394,17 @@ sgw_egress_if: TOK_STRING
     }
 
     if (in != NULL) {
-      /* remove old interface from list to add it later at the beginning */
+      /* remove old interface from list to add it later at the end */
       if (previous) {
         previous->next = in->next;
       }
       else {
         olsr_cnf->smart_gw_egress_interfaces = in->next;
       }
+      in->next = NULL;
     }
     else {
+      /* interface in not in the list: create a new entry to add it later at the end */
       in = malloc(sizeof(*in));
       if (in == NULL) {
         fprintf(stderr, "Out of memory(ADD IF)\n");
@@ -1412,9 +1414,18 @@ sgw_egress_if: TOK_STRING
 
       in->name = str;
     }
-    /* Queue */
-    in->next = olsr_cnf->smart_gw_egress_interfaces;
-    olsr_cnf->smart_gw_egress_interfaces = in;
+
+    last = olsr_cnf->smart_gw_egress_interfaces;
+    while (last && last->next) {
+      last = last->next;
+    }
+
+    /* Add to the end of the list */
+    if (!last) {
+      olsr_cnf->smart_gw_egress_interfaces = in;
+    } else {
+      last->next = in;
+    }
     free($1);
   }
 }