DLEP fixes for handling of IP addresses attached to sessions/neighbors
authorHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Thu, 23 Nov 2017 10:32:47 +0000 (11:32 +0100)
committerHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Thu, 23 Nov 2017 10:32:47 +0000 (11:32 +0100)
src-plugins/generic/dlep/dlep_reader.c
src-plugins/generic/dlep/dlep_session.h
src-plugins/generic/dlep/ext_base_ip/ip.c

index e1b0577..ea46b32 100644 (file)
@@ -219,7 +219,7 @@ dlep_reader_ipv4_subnet_tlv(struct netaddr *ipv4, bool *add,
 
   ptr = dlep_session_get_tlv_binary(session, value);
   *add = (ptr[0] & DLEP_IP_ADD) == DLEP_IP_ADD;
-  return netaddr_from_binary(ipv4, &ptr[1], 4, AF_INET);
+  return netaddr_from_binary_prefix(ipv4, &ptr[1], 4, AF_INET, ptr[5]);
 }
 
 /**
@@ -245,7 +245,7 @@ dlep_reader_ipv6_subnet_tlv(struct netaddr *ipv6, bool *add,
 
   ptr = dlep_session_get_tlv_binary(session, value);
   *add = (ptr[0] & DLEP_IP_ADD) == DLEP_IP_ADD;
-  return netaddr_from_binary(ipv6, &ptr[1], 16, AF_INET6);
+  return netaddr_from_binary_prefix(ipv6, &ptr[1], 16, AF_INET6, ptr[17]);
 }
 
 /**
index 494e47d..f1aa444 100644 (file)
@@ -329,9 +329,6 @@ struct dlep_session {
 
   /*! tree of modifications which should be put into the next peer update */
   struct avl_tree _ip_prefix_modification;
-
-  /*! tree of all dlep sessions of an interface */
-  struct avl_node _node;
 };
 
 void dlep_session_init(void);
index 1e1429a..d2e1a3f 100644 (file)
@@ -55,6 +55,8 @@
 #include "dlep/dlep_iana.h"
 #include "dlep/dlep_extension.h"
 #include "dlep/dlep_interface.h"
+#include "dlep/radio/dlep_radio_interface.h"
+#include "dlep/radio/dlep_radio_session.h"
 #include "dlep/dlep_reader.h"
 #include "dlep/dlep_writer.h"
 
@@ -355,7 +357,7 @@ _router_process_session_update(struct dlep_extension *ext __attribute((unused)),
   /* ipv6 subnet */
   value = dlep_session_get_tlv_value(session, DLEP_IPV6_SUBNET_TLV);
   while (value) {
-    if (dlep_reader_ipv4_tlv(&ip, &add_ip, session, value)) {
+    if (dlep_reader_ipv6_tlv(&ip, &add_ip, session, value)) {
       return -1;
     }
     _process_session_ip_tlvs(session->l2_origin, l2net, &ip, add_ip);
@@ -467,13 +469,13 @@ _add_prefix(struct avl_tree *tree, struct netaddr *addr, bool add) {
 
 static void
 _modify_if_ip(const char *if_name, struct netaddr *prefix, bool add) {
-  struct dlep_if *dlep_interface;
-  struct dlep_session *session;
+  struct dlep_radio_if *interf;
+  struct dlep_radio_session *radio_session;
 
-  avl_for_each_element(dlep_if_get_tree(true), dlep_interface, _node) {
-    if (strcmp(dlep_interface->l2_ifname, if_name) == 0) {
-      avl_for_each_element(&dlep_interface->session_tree, session, _node) {
-        _add_prefix(&session->_ip_prefix_modification, prefix, add);
+  avl_for_each_element(dlep_if_get_tree(true), interf, interf._node) {
+    if (strcmp(interf->interf.l2_ifname, if_name) == 0) {
+      avl_for_each_element(&interf->interf.session_tree, radio_session, _node) {
+        _add_prefix(&radio_session->session._ip_prefix_modification, prefix, add);
       }
     }
   }
@@ -494,14 +496,14 @@ _cb_remove_if_ip(void *ptr) {
 static void
 _modify_neigh_ip(const char *if_name, struct netaddr *neighbor,
     struct netaddr *prefix, bool add) {
-  struct dlep_if *dlep_interface;
+  struct dlep_radio_if *interf;
   struct dlep_local_neighbor *dlep_neighbor;
-  struct dlep_session *session;
+  struct dlep_radio_session *radio_session;
 
-  avl_for_each_element(dlep_if_get_tree(true), dlep_interface, _node) {
-    if (strcmp(dlep_interface->l2_ifname, if_name) == 0) {
-      avl_for_each_element(&dlep_interface->session_tree, session, _node) {
-        dlep_neighbor = dlep_session_get_local_neighbor(session, neighbor);
+  avl_for_each_element(dlep_if_get_tree(true), interf, interf._node) {
+    if (strcmp(interf->interf.l2_ifname, if_name) == 0) {
+      avl_for_each_element(&interf->interf.session_tree, radio_session, _node) {
+        dlep_neighbor = dlep_session_get_local_neighbor(&radio_session->session, neighbor);
         if (dlep_neighbor) {
           _add_prefix(&dlep_neighbor->_ip_prefix_modification, prefix, add);
         }