sgw: implement HNA expiry
authorFerry Huberts <ferry.huberts@pelagic.nl>
Fri, 8 May 2015 11:30:34 +0000 (13:30 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Fri, 8 May 2015 12:17:50 +0000 (14:17 +0200)
HNA expiry wasn't implemented, making sgw in a dynamic
environment "rather" problematic.

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
src/gateway.c
src/gateway.h
src/hna_set.c

index 88092de..56ec469 100644 (file)
@@ -552,6 +552,20 @@ static void smartgw_tunnel_monitor(int if_index, struct interface_olsr *ifh, enu
   return;
 }
 
   return;
 }
 
+/**
+ * Timer callback to expire a gateway entry
+ *
+ * @param ptr a pointer to the smart gateway HNA to expire (struct gateway_entry*)
+ */
+static void expire_gateway_handler(void *ptr) {
+  struct gateway_entry *gw = ptr;
+
+  assert(gw);
+
+  /* remove gateway entry */
+  olsr_delete_gateway_entry(&gw->originator, gw->external_prefix.prefix_len, false);
+}
+
 /**
  * Timer callback to remove and cleanup a gateway entry
  *
 /**
  * Timer callback to remove and cleanup a gateway entry
  *
@@ -1074,8 +1088,9 @@ bool olsr_is_smart_gateway(struct olsr_ip_prefix *prefix, union olsr_ip_addr *ma
  * @param mask netmask of the HNA
  * @param prefixlen of the HNA
  * @param seqno the sequence number of the HNA
  * @param mask netmask of the HNA
  * @param prefixlen of the HNA
  * @param seqno the sequence number of the HNA
+ * @param vtime the validity time of the HNA
  */
  */
-void olsr_update_gateway_entry(union olsr_ip_addr *originator, union olsr_ip_addr *mask, int prefixlen, uint16_t seqno) {
+void olsr_update_gateway_entry(union olsr_ip_addr *originator, union olsr_ip_addr *mask, int prefixlen, uint16_t seqno, olsr_reltime vtime) {
   struct gw_container_entry * new_gw_in_list;
   uint8_t *ptr;
   int64_t prev_path_cost = 0;
   struct gw_container_entry * new_gw_in_list;
   uint8_t *ptr;
   int64_t prev_path_cost = 0;
@@ -1124,6 +1139,14 @@ void olsr_update_gateway_entry(union olsr_ip_addr *originator, union olsr_ip_add
     }
   }
 
     }
   }
 
+  if (!gw->expire_timer) {
+    /* start expire timer */
+    olsr_set_timer(&gw->expire_timer, vtime, 0, false, expire_gateway_handler, gw, NULL);
+  } else {
+    /* restart expire timer */
+    olsr_change_timer(gw->expire_timer, vtime, 0, false);
+  }
+
   /* stop cleanup timer if necessary */
   if (gw->cleanup_timer) {
     olsr_stop_timer(gw->cleanup_timer);
   /* stop cleanup timer if necessary */
   if (gw->cleanup_timer) {
     olsr_stop_timer(gw->cleanup_timer);
@@ -1193,6 +1216,12 @@ static void olsr_delete_gateway_tree_entry(struct gateway_entry * gw, uint8_t pr
     return;
   }
 
     return;
   }
 
+  if (gw->expire_timer) {
+    /* stop expire timer */
+    olsr_stop_timer(gw->expire_timer);
+    gw->expire_timer = NULL;
+  }
+
   if (immediate && gw->cleanup_timer) {
     /* stop timer if we have to remove immediately */
     olsr_stop_timer(gw->cleanup_timer);
   if (immediate && gw->cleanup_timer) {
     /* stop timer if we have to remove immediately */
     olsr_stop_timer(gw->cleanup_timer);
index 4354018..f547896 100644 (file)
@@ -67,6 +67,7 @@ struct gateway_entry {
     bool ipv4nat;
     bool ipv6;
 
     bool ipv4nat;
     bool ipv6;
 
+    struct timer_entry *expire_timer;
     struct timer_entry *cleanup_timer;
     uint16_t seqno;
 };
     struct timer_entry *cleanup_timer;
     uint16_t seqno;
 };
@@ -198,7 +199,7 @@ void refresh_smartgw_netmask(void);
  */
 
 bool olsr_is_smart_gateway(struct olsr_ip_prefix *prefix, union olsr_ip_addr *net);
  */
 
 bool olsr_is_smart_gateway(struct olsr_ip_prefix *prefix, union olsr_ip_addr *net);
-void olsr_update_gateway_entry(union olsr_ip_addr *originator, union olsr_ip_addr *mask, int prefixlen, uint16_t seqno);
+void olsr_update_gateway_entry(union olsr_ip_addr *originator, union olsr_ip_addr *mask, int prefixlen, uint16_t seqno, olsr_reltime vtime);
 void olsr_delete_gateway_entry(union olsr_ip_addr *originator, uint8_t prefixlen, bool immediate);
 void olsr_trigger_gatewayloss_check(void);
 
 void olsr_delete_gateway_entry(union olsr_ip_addr *originator, uint8_t prefixlen, bool immediate);
 void olsr_trigger_gatewayloss_check(void);
 
index 72310d9..47dd897 100644 (file)
@@ -443,7 +443,7 @@ olsr_input_hna(union olsr_message *m, struct interface_olsr *in_if __attribute__
 
 #ifdef __linux__
     if (olsr_cnf->smart_gw_active && olsr_is_smart_gateway(&prefix, &mask)) {
 
 #ifdef __linux__
     if (olsr_cnf->smart_gw_active && olsr_is_smart_gateway(&prefix, &mask)) {
-      olsr_update_gateway_entry(&originator, &mask, prefix.prefix_len, msg_seq_number);
+      olsr_update_gateway_entry(&originator, &mask, prefix.prefix_len, msg_seq_number, vtime);
       continue;
     }
 #endif /* __linux__ */
       continue;
     }
 #endif /* __linux__ */