sgw: olsr_modifiy_inetgw_netmask can choose between normal and zero bw
authorFerry Huberts <ferry.huberts@pelagic.nl>
Fri, 1 May 2015 08:19:53 +0000 (10:19 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Fri, 1 May 2015 08:29:22 +0000 (10:29 +0200)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
src/build_msg.c
src/gateway.c
src/gateway.h

index 25f6a4c..972c981 100644 (file)
@@ -972,7 +972,11 @@ serialize_mid6(struct interface_olsr *ifp)
 }
 
 static void appendHNAEntry(struct interface_olsr *ifp, struct ip_prefix_list *h, uint16_t * remainsize, uint16_t * curr_size,
-    union olsr_message *m, struct hnapair **pair) {
+    union olsr_message *m, struct hnapair **pair, bool zero
+#ifndef __linux__
+__attribute__((unused))
+#endif
+  ) {
   union olsr_ip_addr ip_addr;
 
   if ((*curr_size + (2 * olsr_cnf->ipsize)) > *remainsize) {
@@ -999,7 +1003,7 @@ static void appendHNAEntry(struct interface_olsr *ifp, struct ip_prefix_list *h,
 #ifdef __linux__
   if (olsr_cnf->smart_gw_active && is_prefix_inetgw(&h->net)) {
     /* this is the default route, overwrite it with the smart gateway */
-    olsr_modifiy_inetgw_netmask(&ip_addr, h->net.prefix_len);
+    olsr_modifiy_inetgw_netmask(&ip_addr, h->net.prefix_len, zero);
   }
 #endif /* __linux__ */
   (*pair)->addr = h->net.prefix.v4.s_addr;
@@ -1069,7 +1073,7 @@ serialize_hna4(struct interface_olsr *ifp)
   pair = m->v4.message.hna.hna_net;
 
   for (; h != NULL; h = h->next) {
-    appendHNAEntry(ifp, h, &remainsize, &curr_size, m, &pair);
+    appendHNAEntry(ifp, h, &remainsize, &curr_size, m, &pair, false);
   }
 
   m->v4.olsr_msgsize = htons(curr_size);
@@ -1082,7 +1086,11 @@ serialize_hna4(struct interface_olsr *ifp)
 }
 
 static void appendHNA6Entry(struct interface_olsr *ifp, struct ip_prefix_list *h, uint16_t * remainsize, uint16_t * curr_size,
-    union olsr_message *m, struct hnapair6 **pair) {
+    union olsr_message *m, struct hnapair6 **pair, bool zero
+#ifndef __linux__
+__attribute__((unused))
+#endif
+  ) {
   union olsr_ip_addr ip_addr;
 
   if ((*curr_size + (2 * olsr_cnf->ipsize)) > *remainsize) {
@@ -1109,7 +1117,7 @@ static void appendHNA6Entry(struct interface_olsr *ifp, struct ip_prefix_list *h
 #ifdef __linux__
   if (olsr_cnf->smart_gw_active && is_prefix_inetgw(&h->net)) {
     /* this is the default gateway, so overwrite it with the smart one */
-    olsr_modifiy_inetgw_netmask(&ip_addr, h->net.prefix_len);
+    olsr_modifiy_inetgw_netmask(&ip_addr, h->net.prefix_len, zero);
   }
 #endif /* __linux__ */
   (*pair)->addr = h->net.prefix.v6;
@@ -1171,7 +1179,7 @@ serialize_hna6(struct interface_olsr *ifp)
   pair6 = m->v6.message.hna.hna_net;
 
   for (; h != NULL; h = h->next) {
-    appendHNA6Entry(ifp, h, &remainsize, &curr_size, m, &pair6);
+    appendHNA6Entry(ifp, h, &remainsize, &curr_size, m, &pair6, false);
   }
 
   m->v6.olsr_msgsize = htons(curr_size);
index 99df6fd..f0b4153 100644 (file)
@@ -53,6 +53,9 @@ static struct olsr_cookie_info *gateway_entry_mem_cookie = NULL;
 /** gateway container cookie */
 static struct olsr_cookie_info *gw_container_entry_mem_cookie = NULL;
 
+/** the gateway netmask for the HNA with zero bandwidth */
+static uint8_t smart_gateway_netmask_zero[sizeof(union olsr_ip_addr)];
+
 /** the gateway netmask for the HNA */
 static uint8_t smart_gateway_netmask[sizeof(union olsr_ip_addr)];
 
@@ -982,12 +985,16 @@ void olsr_print_gateway_entries(void) {
  *
  * @param mask pointer to netmask of the HNA
  * @param prefixlen of the HNA
+ * @param zero true to use zero bandwidth
  */
-void olsr_modifiy_inetgw_netmask(union olsr_ip_addr *mask, int prefixlen) {
+void olsr_modifiy_inetgw_netmask(union olsr_ip_addr *mask, int prefixlen, bool zero) {
   uint8_t *ptr = hna_mask_to_hna_pointer(mask, prefixlen);
 
   /* copy the current settings for uplink/downlink into the mask */
-  memcpy(ptr, &smart_gateway_netmask, sizeof(smart_gateway_netmask) - prefixlen / 8);
+  memcpy( //
+      ptr, //
+      zero ? &smart_gateway_netmask_zero : &smart_gateway_netmask, //
+      (zero ? sizeof(smart_gateway_netmask_zero) : sizeof(smart_gateway_netmask)) - prefixlen / 8);
   if (olsr_cnf->has_ipv4_gateway) {
     ptr[GW_HNA_FLAGS] |= GW_HNA_FLAG_IPV4;
 
@@ -1028,6 +1035,13 @@ void refresh_smartgw_netmask(void) {
       ip[GW_HNA_V6PREFIXLEN] = olsr_cnf->smart_gw_prefix.prefix_len;
       memcpy(&ip[GW_HNA_V6PREFIX], &olsr_cnf->smart_gw_prefix.prefix, 8);
     }
+
+    {
+      uint8_t *ipz = (uint8_t *) &smart_gateway_netmask_zero;
+      memcpy(ipz, ip, sizeof(smart_gateway_netmask_zero));
+      ipz[GW_HNA_DOWNLINK] = serialize_gw_speed(0);
+      ipz[GW_HNA_UPLINK] = serialize_gw_speed(0);
+    }
   }
 }
 
index 114d73c..4354018 100644 (file)
@@ -185,7 +185,7 @@ void olsr_print_gateway_entries(void);
  * Tx Path Interface
  */
 
-void olsr_modifiy_inetgw_netmask(union olsr_ip_addr *mask, int prefixlen);
+void olsr_modifiy_inetgw_netmask(union olsr_ip_addr *mask, int prefixlen, bool zero);
 
 /*
  * Interface to adjust uplink/downlink speed