Add support for Link-ID to layer2 database
authorHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Mon, 9 Apr 2018 11:30:45 +0000 (13:30 +0200)
committerHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Mon, 9 Apr 2018 11:30:45 +0000 (13:30 +0200)
19 files changed:
src-plugins/generic/dlep/dlep_extension.c
src-plugins/generic/dlep/dlep_extension.h
src-plugins/generic/dlep/dlep_iana.h
src-plugins/generic/dlep/dlep_reader.c
src-plugins/generic/dlep/dlep_reader.h
src-plugins/generic/dlep/dlep_session.c
src-plugins/generic/dlep/dlep_session.h
src-plugins/generic/dlep/dlep_writer.c
src-plugins/generic/dlep/dlep_writer.h
src-plugins/generic/dlep/ext_base_ip/ip.c
src-plugins/generic/dlep/ext_base_proto/proto.c
src-plugins/generic/dlep/ext_base_proto/proto.h
src-plugins/generic/dlep/ext_base_proto/proto_radio.c
src-plugins/generic/dlep/ext_base_proto/proto_router.c
src-plugins/generic/layer2_generator/layer2_generator.c
src-plugins/generic/layer2info/layer2info.c
src-plugins/nhdp/neighbor_probing/neighbor_probing.c
src-plugins/subsystems/oonf_layer2.c
src-plugins/subsystems/oonf_layer2.h

index f716400..16607e3 100644 (file)
@@ -247,7 +247,7 @@ dlep_extension_router_process_destination(struct dlep_extension *ext, struct dle
  */
 int
 dlep_extension_radio_write_session_init_ack(
-  struct dlep_extension *ext, struct dlep_session *session, const struct netaddr *neigh __attribute__((unused))) {
+  struct dlep_extension *ext, struct dlep_session *session, const struct oonf_layer2_neigh_key *neigh __attribute__((unused))) {
   const struct oonf_layer2_metadata *meta;
   struct oonf_layer2_net *l2net;
   struct oonf_layer2_data *l2data;
@@ -321,7 +321,7 @@ dlep_extension_radio_write_session_init_ack(
  */
 int
 dlep_extension_radio_write_session_update(
-  struct dlep_extension *ext, struct dlep_session *session, const struct netaddr *neigh __attribute__((unused))) {
+  struct dlep_extension *ext, struct dlep_session *session, const struct oonf_layer2_neigh_key *neigh __attribute__((unused))) {
   struct oonf_layer2_net *l2net;
   int result;
 
@@ -355,9 +355,9 @@ dlep_extension_radio_write_session_update(
  */
 int
 dlep_extension_radio_write_destination(
-  struct dlep_extension *ext, struct dlep_session *session, const struct netaddr *neigh) {
+  struct dlep_extension *ext, struct dlep_session *session, const struct oonf_layer2_neigh_key *neigh) {
   struct oonf_layer2_neigh *l2neigh;
-  struct netaddr_str nbuf;
+  union oonf_layer2_neigh_key_str nbuf;
   int result;
 
   l2neigh = dlep_session_get_local_l2_neighbor(session, neigh);
@@ -365,16 +365,15 @@ dlep_extension_radio_write_destination(
     OONF_WARN(session->log_source,
       "Could not find l2neigh "
       "for neighbor %s",
-      netaddr_to_string(&nbuf, neigh));
+      oonf_layer2_neigh_key_to_string(&nbuf, neigh, true));
     return -1;
   }
 
   result = dlep_writer_map_l2neigh_data(&session->writer, ext, l2neigh->data, l2neigh->network->neighdata);
   if (result) {
     OONF_WARN(session->log_source,
-      "tlv mapping for extension %d"
-      " and neighbor %s failed: %d",
-      ext->id, netaddr_to_string(&nbuf, neigh), result);
+      "tlv mapping for extension %d and neighbor %s failed: %d",
+      ext->id, oonf_layer2_neigh_key_to_string(&nbuf, neigh, true), result);
     return result;
   }
   return 0;
index 7b19b50..8e7d943 100644 (file)
@@ -104,7 +104,7 @@ struct dlep_extension_signal {
    * @param neigh neighbor used for this signal, might be NULL
    * @return -1 if an error happened, 0 otherwise
    */
-  int (*add_radio_tlvs)(struct dlep_extension *ext, struct dlep_session *session, const struct netaddr *neigh);
+  int (*add_radio_tlvs)(struct dlep_extension *ext, struct dlep_session *session, const struct oonf_layer2_neigh_key *neigh);
 
   /**
    * Callback to add TLVs to the extended router signal
@@ -113,7 +113,7 @@ struct dlep_extension_signal {
    * @param neigh neighbor used for this signal, might be NULL
    * @return -1 if an error happened, 0 otherwise
    */
-  int (*add_router_tlvs)(struct dlep_extension *ext, struct dlep_session *session, const struct netaddr *neigh);
+  int (*add_router_tlvs)(struct dlep_extension *ext, struct dlep_session *session, const struct oonf_layer2_neigh_key *neigh);
 };
 
 /**
@@ -157,7 +157,7 @@ struct dlep_extension_implementation {
    * @param neigh neighbor used for this signal, might be NULL
    * @return -1 if an error happened, 0 otherwise
    */
-  int (*add_tlvs)(struct dlep_extension *ext, struct dlep_session *session, const struct netaddr *neigh);
+  int (*add_tlvs)(struct dlep_extension *ext, struct dlep_session *session, const struct oonf_layer2_neigh_key *neigh);
 };
 
 /**
@@ -341,11 +341,11 @@ EXPORT int dlep_extension_router_process_session_init_ack(struct dlep_extension
 EXPORT int dlep_extension_router_process_session_update(struct dlep_extension *, struct dlep_session *session);
 EXPORT int dlep_extension_router_process_destination(struct dlep_extension *, struct dlep_session *session);
 EXPORT int dlep_extension_radio_write_session_init_ack(
-  struct dlep_extension *ext, struct dlep_session *session, const struct netaddr *neigh);
+  struct dlep_extension *ext, struct dlep_session *session, const struct oonf_layer2_neigh_key *neigh);
 EXPORT int dlep_extension_radio_write_session_update(
-  struct dlep_extension *ext, struct dlep_session *session, const struct netaddr *neigh);
+  struct dlep_extension *ext, struct dlep_session *session, const struct oonf_layer2_neigh_key *neigh);
 EXPORT int dlep_extension_radio_write_destination(
-  struct dlep_extension *ext, struct dlep_session *session, const struct netaddr *neigh);
+  struct dlep_extension *ext, struct dlep_session *session, const struct oonf_layer2_neigh_key *neigh);
 
 /**
  * @param id dlep extension id
index 5e82875..6f00e35 100644 (file)
@@ -236,6 +236,10 @@ enum dlep_tlvs
   /*! MTU of interface */
   DLEP_MTU_TLV = 20,
 
+  /*! link ID TLV */
+  DLEP_LID_TLV = 21,
+
+
   /* l1 statistics */
 
   /*! channel center frequency in Hz */
index e6a6470..123dfe8 100644 (file)
@@ -143,6 +143,31 @@ dlep_reader_mac_tlv(struct netaddr *mac, struct dlep_session *session, struct dl
 }
 
 /**
+ * Parse a DLEP link-id TLV
+ * @param key pointer to link-id storage
+ * @param session dlep session
+ * @param value dlep value to parse, NULL for using the first
+ *   DLEP_LID_TLV value
+ * @return -1 if an error happened, 0 otherwise
+ */
+int
+dlep_reader_lid_tlv(struct oonf_layer2_neigh_key *key, struct dlep_session *session, struct dlep_parser_value *value) {
+  const uint8_t *ptr;
+
+  if (!value) {
+    value = dlep_session_get_tlv_value(session, DLEP_LID_TLV);
+    if (!value) {
+      return -1;
+    }
+  }
+
+  ptr = dlep_session_get_tlv_binary(session, value);
+  memcpy(key->link_id, ptr, value->length);
+  key->link_id_length = value->length;
+  return 0;
+}
+
+/**
  * Parse DLEP IPv4 address TLV
  * @param ipv4 pointer to address storage
  * @param add pointer to boolean for flag storage
index 8558731..69fb933 100644 (file)
@@ -57,6 +57,7 @@ int dlep_reader_heartbeat_tlv(uint64_t *interval, struct dlep_session *session,
 int dlep_reader_peer_type(
   char *text, size_t text_length, bool *secured, struct dlep_session *session, struct dlep_parser_value *value);
 int dlep_reader_mac_tlv(struct netaddr *mac, struct dlep_session *session, struct dlep_parser_value *value);
+int dlep_reader_lid_tlv(struct oonf_layer2_neigh_key *lid, struct dlep_session *session, struct dlep_parser_value *value);
 int dlep_reader_ipv4_tlv(
   struct netaddr *ipv4, bool *add, struct dlep_session *session, struct dlep_parser_value *value);
 int dlep_reader_ipv6_tlv(
index 14bf837..c0a18e2 100644 (file)
@@ -456,13 +456,13 @@ dlep_session_process_signal(struct dlep_session *session, const void *ptr, size_
 /**
  * Add a neighbor to the local DLEP storage
  * @param session dlep session
- * @param neigh neighbor MAC address
+ * @param key neighbor key (MAC plus link id)
  * @return pointer to dlep neighbor, NULL if out of memory
  */
 struct dlep_local_neighbor *
-dlep_session_add_local_neighbor(struct dlep_session *session, const struct netaddr *neigh) {
+dlep_session_add_local_neighbor(struct dlep_session *session, const struct oonf_layer2_neigh_key *key) {
   struct dlep_local_neighbor *local;
-  if ((local = dlep_session_get_local_neighbor(session, neigh))) {
+  if ((local = dlep_session_get_local_neighbor(session, key))) {
     return local;
   }
 
@@ -472,8 +472,8 @@ dlep_session_add_local_neighbor(struct dlep_session *session, const struct netad
   }
 
   /* hook into tree */
-  memcpy(&local->addr, neigh, sizeof(local->addr));
-  local->_node.key = &local->addr;
+  memcpy(&local->key, key, sizeof(*key));
+  local->_node.key = &local->key;
   avl_insert(&session->local_neighbor_tree, &local->_node);
 
   /* initialize timer */
@@ -502,21 +502,22 @@ dlep_session_remove_local_neighbor(struct dlep_session *session, struct dlep_loc
 /**
  * Get the layer2 neigbor for a DLEP session MAC address
  * @param session dlep session
- * @param neigh MAC address of neighbor
+ * @param key neighbor key (MAC address plus link id)
  * @return layer2 neighbor, NULL if not found
  */
 struct oonf_layer2_neigh *
-dlep_session_get_local_l2_neighbor(struct dlep_session *session, const struct netaddr *neigh) {
+dlep_session_get_local_l2_neighbor(struct dlep_session *session, const struct oonf_layer2_neigh_key *key) {
   struct dlep_local_neighbor *dlep_neigh;
   struct oonf_layer2_neigh *l2neigh;
   struct oonf_layer2_net *l2net;
 #ifdef OONF_LOG_INFO
-  struct netaddr_str nbuf1, nbuf2;
+  union oonf_layer2_neigh_key_str nbuf1, nbuf2;
 #endif
 
-  dlep_neigh = dlep_session_get_local_neighbor(session, neigh);
+  dlep_neigh = dlep_session_get_local_neighbor(session, key);
   if (!dlep_neigh) {
-    OONF_INFO(session->log_source, "Could not find local neighbor for %s", netaddr_to_string(&nbuf1, neigh));
+    OONF_INFO(session->log_source, "Could not find local neighbor for %s",
+              oonf_layer2_neigh_key_to_string(&nbuf1, key, true));
     return NULL;
   }
 
@@ -526,12 +527,12 @@ dlep_session_get_local_l2_neighbor(struct dlep_session *session, const struct ne
     return NULL;
   }
 
-  l2neigh = oonf_layer2_neigh_get(l2net, &dlep_neigh->neigh_addr);
+  l2neigh = oonf_layer2_neigh_get_lid(l2net, &dlep_neigh->neigh_key);
   if (!l2neigh) {
     OONF_INFO(session->log_source,
-      "Could not find l2neigh "
-      "for neighbor %s (%s)",
-      netaddr_to_string(&nbuf1, neigh), netaddr_to_string(&nbuf2, &dlep_neigh->neigh_addr));
+      "Could not find l2neigh for neighbor %s (%s)",
+      oonf_layer2_neigh_key_to_string(&nbuf1, key, true),
+      oonf_layer2_neigh_key_to_string(&nbuf2, &dlep_neigh->neigh_key, true));
     return NULL;
   }
   return l2neigh;
@@ -542,7 +543,7 @@ dlep_session_get_l2_from_neighbor(struct dlep_local_neighbor *dlep_neigh) {
   struct oonf_layer2_neigh *l2neigh;
   struct oonf_layer2_net *l2net;
 #ifdef OONF_LOG_INFO
-  struct netaddr_str nbuf;
+  union oonf_layer2_neigh_key_str nbuf;
 #endif
 
   l2net = oonf_layer2_net_get(dlep_neigh->session->l2_listener.name);
@@ -552,12 +553,11 @@ dlep_session_get_l2_from_neighbor(struct dlep_local_neighbor *dlep_neigh) {
     return NULL;
   }
 
-  l2neigh = oonf_layer2_neigh_get(l2net, &dlep_neigh->neigh_addr);
+  l2neigh = oonf_layer2_neigh_get_lid(l2net, &dlep_neigh->neigh_key);
   if (!l2neigh) {
     OONF_INFO(dlep_neigh->session->log_source,
-      "Could not find l2neigh "
-      "for neighbor %s",
-      netaddr_to_string(&nbuf, &dlep_neigh->neigh_addr));
+      "Could not find l2neigh for neighbor %s",
+      oonf_layer2_neigh_key_to_string(&nbuf, &dlep_neigh->neigh_key, true));
     return NULL;
   }
   return l2neigh;
@@ -572,17 +572,19 @@ dlep_session_get_l2_from_neighbor(struct dlep_local_neighbor *dlep_neigh) {
  * @return -1 if an error happened, 0 otherwise
  */
 static int
-_generate_signal(struct dlep_session *session, int32_t signal, const struct netaddr *neighbor) {
+_generate_signal(struct dlep_session *session, int32_t signal, const struct oonf_layer2_neigh_key *neighbor) {
   struct dlep_extension *ext;
   size_t e, s;
 
   size_t len;
 #ifdef OONF_LOG_DEBUG_INFO
-  struct netaddr_str nbuf1, nbuf2;
+  union oonf_layer2_neigh_key_str nkbuf;
+  struct netaddr_str nbuf2;
 #endif
 
-  OONF_DEBUG(session->log_source, "Generate signal %u for %s on %s (%s)", signal, netaddr_to_string(&nbuf1, neighbor),
-    session->l2_listener.name, netaddr_socket_to_string(&nbuf2, &session->remote_socket));
+  OONF_DEBUG(session->log_source, "Generate signal %u for %s on %s (%s)", signal,
+             oonf_layer2_neigh_key_to_string(&nkbuf, neighbor, true),
+             session->l2_listener.name, netaddr_socket_to_string(&nbuf2, &session->remote_socket));
 
   len = abuf_getlen(session->writer.out);
 
@@ -623,12 +625,12 @@ _generate_signal(struct dlep_session *session, int32_t signal, const struct neta
  * Generate a DLEP signal/message
  * @param session dlep session
  * @param signal signal id
- * @param neighbor neighbor MAC address the signal should refer to,
+ * @param neighbor neighbor MAC address (plus link id) the signal should refer to,
  *   might be NULL
  * @return -1 if an error happened, 0 otherwise
  */
 int
-dlep_session_generate_signal(struct dlep_session *session, int32_t signal, const struct netaddr *neighbor) {
+dlep_session_generate_signal(struct dlep_session *session, int32_t signal, const struct oonf_layer2_neigh_key *neighbor) {
   if (_generate_signal(session, signal, neighbor)) {
     OONF_WARN(session->log_source, "Could not generate signal %u", signal);
     return -1;
@@ -640,14 +642,14 @@ dlep_session_generate_signal(struct dlep_session *session, int32_t signal, const
  * Generate a DLEP signal/message with a DLEP status TLV
  * @param session dlep session
  * @param signal signal id
- * @param neighbor neighbor MAC address the signal should refer to,
+ * @param neighbor neighbor MAC address (plus link id) the signal should refer to,
  *   might be NULL
  * @param status DLEP status code
  * @param msg ZERO terminated DLEP status text
  * @return -1 if an error happened, 0 otherwise
  */
 int
-dlep_session_generate_signal_status(struct dlep_session *session, int32_t signal, const struct netaddr *neighbor,
+dlep_session_generate_signal_status(struct dlep_session *session, int32_t signal, const struct oonf_layer2_neigh_key *neighbor,
   enum dlep_status status, const char *msg) {
   if (_generate_signal(session, signal, neighbor)) {
     OONF_WARN(session->log_source, "Could not generate signal %u", signal);
index 4528665..bd79366 100644 (file)
@@ -205,8 +205,9 @@ struct dlep_local_neighbor {
   /**
    * mac address of the endpoint of the neighbor
    * (might be proxied ethernet)
+   * it might also have a link ID
    */
-  struct netaddr addr;
+  struct oonf_layer2_neigh_key key;
 
   /*! state of neighbor */
   enum dlep_neighbor_state state;
@@ -217,8 +218,8 @@ struct dlep_local_neighbor {
   /*! true if iterative updates are be used for destination IPs */
   bool destination_ip_iterative;
 
-  /*! mac address of the neighbors wireless interface */
-  struct netaddr neigh_addr;
+  /*! mac address (plus link ID) of the neighbors wireless interface */
+  struct oonf_layer2_neigh_key neigh_key;
 
   /*! back-pointer to dlep session */
   struct dlep_session *session;
@@ -347,14 +348,14 @@ enum oonf_stream_session_state dlep_session_process_tcp(
   struct oonf_stream_session *tcp_session, struct dlep_session *session);
 ssize_t dlep_session_process_buffer(struct dlep_session *session, const void *buffer, size_t length, bool is_udp);
 ssize_t dlep_session_process_signal(struct dlep_session *session, const void *buffer, size_t length, bool is_udp);
-int dlep_session_generate_signal(struct dlep_session *session, int32_t signal, const struct netaddr *neighbor);
-int dlep_session_generate_signal_status(struct dlep_session *session, int32_t signal, const struct netaddr *neighbor,
+int dlep_session_generate_signal(struct dlep_session *session, int32_t signal, const struct oonf_layer2_neigh_key *neighbor);
+int dlep_session_generate_signal_status(struct dlep_session *session, int32_t signal, const struct oonf_layer2_neigh_key *neighbor,
   enum dlep_status status, const char *msg);
 struct dlep_parser_value *dlep_session_get_tlv_value(struct dlep_session *session, uint16_t tlvtype);
 
-struct dlep_local_neighbor *dlep_session_add_local_neighbor(struct dlep_session *session, const struct netaddr *neigh);
+struct dlep_local_neighbor *dlep_session_add_local_neighbor(struct dlep_session *session, const struct oonf_layer2_neigh_key *key);
 void dlep_session_remove_local_neighbor(struct dlep_session *session, struct dlep_local_neighbor *local);
-struct oonf_layer2_neigh *dlep_session_get_local_l2_neighbor(struct dlep_session *session, const struct netaddr *neigh);
+struct oonf_layer2_neigh *dlep_session_get_local_l2_neighbor(struct dlep_session *session, const struct oonf_layer2_neigh_key *key);
 struct oonf_layer2_neigh *dlep_session_get_l2_from_neighbor(struct dlep_local_neighbor *dlep_neigh);
 
 /**
@@ -422,13 +423,13 @@ dlep_session_get_tlv_binary(struct dlep_session *session, struct dlep_parser_val
 /**
  * Get a DLEP neighbor
  * @param session dlep session
- * @param neigh neighbor MAC address
+ * @param key neighbor MAC address plus link ID
  * @return DLEP neighbor, NULL if not found
  */
 static INLINE struct dlep_local_neighbor *
-dlep_session_get_local_neighbor(struct dlep_session *session, const struct netaddr *neigh) {
+dlep_session_get_local_neighbor(struct dlep_session *session, const struct oonf_layer2_neigh_key *key) {
   struct dlep_local_neighbor *local;
-  return avl_find_element(&session->local_neighbor_tree, neigh, local, _node);
+  return avl_find_element(&session->local_neighbor_tree, key, local, _node);
 }
 
 #endif /* _DLEP_SESSION_H_ */
index e67f9da..d5c59c4 100644 (file)
@@ -172,14 +172,14 @@ dlep_writer_add_peer_type_tlv(struct dlep_writer *writer, const char *peer_type,
 /**
  * Write a DLEP MAC address TLV
  * @param writer dlep writer
- * @param mac mac address
+ * @param mac_lid mac address/LID
  * @return -1 if address was wrong type, 0 otherwise
  */
 int
-dlep_writer_add_mac_tlv(struct dlep_writer *writer, const struct netaddr *mac) {
+dlep_writer_add_mac_lid_tlv(struct dlep_writer *writer, const struct oonf_layer2_neigh_key *mac_lid) {
   uint8_t value[8];
 
-  switch (netaddr_get_address_family(mac)) {
+  switch (netaddr_get_address_family(&mac_lid->addr)) {
     case AF_MAC48:
     case AF_EUI64:
       break;
@@ -187,9 +187,10 @@ dlep_writer_add_mac_tlv(struct dlep_writer *writer, const struct netaddr *mac) {
       return -1;
   }
 
-  netaddr_to_binary(value, mac, 8);
+  netaddr_to_binary(value, &mac_lid->addr, 8);
 
-  dlep_writer_add_tlv(writer, DLEP_MAC_ADDRESS_TLV, value, netaddr_get_binlength(mac));
+  dlep_writer_add_tlv(writer, DLEP_MAC_ADDRESS_TLV, value, netaddr_get_binlength(&mac_lid->addr));
+  dlep_writer_add_tlv(writer, DLEP_LID_TLV, mac_lid->link_id, mac_lid->link_id_length);
   return 0;
 }
 
index 457d7be..ff4ded0 100644 (file)
@@ -61,7 +61,7 @@ void dlep_writer_add_tlv2(
 int dlep_writer_finish_signal(struct dlep_writer *writer, enum oonf_log_source source);
 void dlep_writer_add_heartbeat_tlv(struct dlep_writer *writer, uint64_t interval);
 void dlep_writer_add_peer_type_tlv(struct dlep_writer *writer, const char *peer_type, bool access_control);
-int dlep_writer_add_mac_tlv(struct dlep_writer *writer, const struct netaddr *mac);
+int dlep_writer_add_mac_lid_tlv(struct dlep_writer *writer, const struct oonf_layer2_neigh_key *mac_lid);
 int dlep_writer_add_ip_tlv(struct dlep_writer *writer, const struct netaddr *ipv4, bool add);
 void dlep_writer_add_ipv4_conpoint_tlv(struct dlep_writer *writer, const struct netaddr *addr, uint16_t port, bool tls);
 void dlep_writer_add_ipv6_conpoint_tlv(struct dlep_writer *writer, const struct netaddr *addr, uint16_t port, bool tls);
index 3170c96..6f89c94 100644 (file)
@@ -70,9 +70,9 @@ struct _prefix_storage {
 static void _cb_session_init(struct dlep_session *session);
 static void _cb_session_cleanup(struct dlep_session *session);
 static int _radio_write_session_update(
-  struct dlep_extension *ext, struct dlep_session *session, const struct netaddr *neigh);
+  struct dlep_extension *ext, struct dlep_session *session, const struct oonf_layer2_neigh_key *neigh);
 static int _radio_write_destination_update(
-  struct dlep_extension *ext, struct dlep_session *session, const struct netaddr *neigh);
+  struct dlep_extension *ext, struct dlep_session *session, const struct oonf_layer2_neigh_key *neigh);
 static enum dlep_parser_error _router_process_session_update(struct dlep_extension *ext, struct dlep_session *session);
 static enum dlep_parser_error _router_process_destination_update(
   struct dlep_extension *ext, struct dlep_session *session);
@@ -209,7 +209,7 @@ _cb_session_init(struct dlep_session *session) {
   }
 
   avl_for_each_element(&l2net->neighbors, l2neigh, _node) {
-    dlep_neighbor = dlep_session_add_local_neighbor(session, &l2neigh->addr);
+    dlep_neighbor = dlep_session_add_local_neighbor(session, &l2neigh->key);
     if (dlep_neighbor) {
       avl_for_each_element(&l2neigh->remote_neighbor_ips, l2neigh_ip, _neigh_node) {
         _add_prefix(&dlep_neighbor->_ip_prefix_modification, &l2neigh_ip->ip, true);
@@ -240,7 +240,7 @@ _cb_session_cleanup(struct dlep_session *session) {
 
 static int
 _radio_write_session_update(struct dlep_extension *ext __attribute__((unused)), struct dlep_session *session,
-  const struct netaddr *neigh __attribute__((unused))) {
+  const struct oonf_layer2_neigh_key *neigh __attribute__((unused))) {
   struct _prefix_storage *storage, *storage_it;
 
   struct netaddr_str nbuf;
@@ -264,29 +264,31 @@ _radio_write_session_update(struct dlep_extension *ext __attribute__((unused)),
 }
 
 static int
-_radio_write_destination_update(
-  struct dlep_extension *ext __attribute__((unused)), struct dlep_session *session, const struct netaddr *neigh) {
+_radio_write_destination_update(struct dlep_extension *ext __attribute__((unused)), struct dlep_session *session,
+    const struct oonf_layer2_neigh_key *neigh) {
   struct dlep_local_neighbor *dlep_neigh;
   struct _prefix_storage *storage, *storage_it;
 
-  struct netaddr_str nbuf1, nbuf2;
+  union oonf_layer2_neigh_key_str nkbuf;
+  struct netaddr_str nbuf1;
 
   dlep_neigh = dlep_session_get_local_neighbor(session, neigh);
   if (!dlep_neigh) {
     OONF_WARN(session->log_source,
-      "Could not find dlep_neighbor "
-      "for neighbor %s",
-      netaddr_to_string(&nbuf1, neigh));
+      "Could not find dlep_neighbor for neighbor %s",
+      oonf_layer2_neigh_key_to_string(&nkbuf, neigh, true));
     return -1;
   }
 
   /* send every attached IP towards the router */
   avl_for_each_element(&dlep_neigh->_ip_prefix_modification, storage, _node) {
     OONF_INFO(session->log_source, "add '%s' (%s) to destination update %s",
-      netaddr_to_string(&nbuf1, &storage->prefix), storage->add ? "add" : "remove", netaddr_to_string(&nbuf2, neigh));
+      netaddr_to_string(&nbuf1, &storage->prefix), storage->add ? "add" : "remove",
+      oonf_layer2_neigh_key_to_string(&nkbuf, neigh, true));
     if (dlep_writer_add_ip_tlv(&session->writer, &storage->prefix, storage->add)) {
       OONF_WARN(session->log_source, "Cannot add '%s' (%s) to destination update %s",
-        netaddr_to_string(&nbuf1, &storage->prefix), storage->add ? "add" : "remove", netaddr_to_string(&nbuf2, neigh));
+        netaddr_to_string(&nbuf1, &storage->prefix), storage->add ? "add" : "remove",
+        oonf_layer2_neigh_key_to_string(&nkbuf, neigh, true));
       return -1;
     }
   }
@@ -493,7 +495,7 @@ _cb_remove_if_ip(void *ptr) {
 }
 
 static void
-_modify_neigh_ip(const char *if_name, struct netaddr *neighbor, struct netaddr *prefix, bool add) {
+_modify_neigh_ip(const char *if_name, struct oonf_layer2_neigh_key *neighbor, struct netaddr *prefix, bool add) {
   struct dlep_radio_if *radio_interf;
   struct dlep_local_neighbor *dlep_neighbor;
   struct dlep_radio_session *radio_session;
@@ -513,11 +515,11 @@ _modify_neigh_ip(const char *if_name, struct netaddr *neighbor, struct netaddr *
 static void
 _cb_add_neigh_ip(void *ptr) {
   struct oonf_layer2_neighbor_address *neigh_ip = ptr;
-  _modify_neigh_ip(neigh_ip->l2neigh->network->name, &neigh_ip->l2neigh->addr, &neigh_ip->ip, true);
+  _modify_neigh_ip(neigh_ip->l2neigh->network->name, &neigh_ip->l2neigh->key, &neigh_ip->ip, true);
 }
 
 static void
 _cb_remove_neigh_ip(void *ptr) {
   struct oonf_layer2_neighbor_address *neigh_ip = ptr;
-  _modify_neigh_ip(neigh_ip->l2neigh->network->name, &neigh_ip->l2neigh->addr, &neigh_ip->ip, false);
+  _modify_neigh_ip(neigh_ip->l2neigh->network->name, &neigh_ip->l2neigh->key, &neigh_ip->ip, false);
 }
index 281d2c5..17ff8d0 100644 (file)
@@ -536,7 +536,7 @@ dlep_base_proto_process_heartbeat(struct dlep_extension *ext __attribute__((unus
 }
 
 /**
- * Write the mac address TLV into the DLEP message
+ * Write the mac address (and LID) TLV into the DLEP message
  * @param ext (this) dlep extension
  * @param session dlep session
  * @param neigh mac address to write into TLV
@@ -544,8 +544,8 @@ dlep_base_proto_process_heartbeat(struct dlep_extension *ext __attribute__((unus
  */
 int
 dlep_base_proto_write_mac_only(
-  struct dlep_extension *ext __attribute__((unused)), struct dlep_session *session, const struct netaddr *neigh) {
-  if (dlep_writer_add_mac_tlv(&session->writer, neigh)) {
+  struct dlep_extension *ext __attribute__((unused)), struct dlep_session *session, const struct oonf_layer2_neigh_key *neigh) {
+  if (dlep_writer_add_mac_lid_tlv(&session->writer, neigh)) {
     return -1;
   }
   return 0;
index b138d83..4cf287b 100644 (file)
@@ -49,6 +49,7 @@
 #include "common/common_types.h"
 #include "common/netaddr.h"
 
+#include "subsystems/oonf_layer2.h"
 #include "dlep/dlep_extension.h"
 #include "dlep/dlep_session.h"
 
@@ -61,6 +62,7 @@ void dlep_base_proto_print_peer_type(struct dlep_session *session);
 int dlep_base_proto_process_session_termination(struct dlep_extension *, struct dlep_session *);
 int dlep_base_proto_process_session_termination_ack(struct dlep_extension *, struct dlep_session *);
 int dlep_base_proto_process_heartbeat(struct dlep_extension *, struct dlep_session *);
-int dlep_base_proto_write_mac_only(struct dlep_extension *, struct dlep_session *session, const struct netaddr *neigh);
+int dlep_base_proto_write_mac_only(struct dlep_extension *, struct dlep_session *session,
+    const struct oonf_layer2_neigh_key *neigh);
 
 #endif /* _PROTO_H_ */
index c3228d6..2003f66 100644 (file)
@@ -73,13 +73,13 @@ static int _radio_process_destination_up_ack(struct dlep_extension *, struct dle
 static int _radio_process_destination_down_ack(struct dlep_extension *, struct dlep_session *);
 static int _radio_process_link_char_request(struct dlep_extension *, struct dlep_session *);
 
-static int _radio_write_peer_offer(struct dlep_extension *, struct dlep_session *session, const struct netaddr *);
-static int _radio_write_session_init_ack(struct dlep_extension *, struct dlep_session *session, const struct netaddr *);
+static int _radio_write_peer_offer(struct dlep_extension *, struct dlep_session *session, const struct oonf_layer2_neigh_key *);
+static int _radio_write_session_init_ack(struct dlep_extension *, struct dlep_session *session, const struct oonf_layer2_neigh_key *);
 
 static void _l2_neigh_added_to_session(
-  struct dlep_session *session, struct oonf_layer2_neigh *l2neigh, const struct netaddr *mac);
+  struct dlep_session *session, struct oonf_layer2_neigh *l2neigh, const struct oonf_layer2_neigh_key *mac);
 static void _l2_neigh_added(
-  struct oonf_layer2_neigh *l2neigh, struct oonf_layer2_destination *l2dest, const struct netaddr *mac);
+  struct oonf_layer2_neigh *l2neigh, struct oonf_layer2_destination *l2dest, const struct oonf_layer2_neigh_key *mac);
 
 static void _cb_l2_net_changed(void *);
 
@@ -251,9 +251,11 @@ _radio_process_session_init(struct dlep_extension *ext __attribute__((unused)),
   struct oonf_layer2_neigh *l2neigh;
   struct oonf_layer2_destination *l2dest;
   struct dlep_parser_value *value;
+  struct oonf_layer2_neigh_key l2key;
   const uint8_t *ptr;
 
 #ifdef OONF_LOG_DEBUG_INFO
+  union oonf_layer2_neigh_key_str nkbuf;
   struct netaddr_str nbuf;
 #endif
 
@@ -297,14 +299,18 @@ _radio_process_session_init(struct dlep_extension *ext __attribute__((unused)),
   if (l2net) {
     avl_for_each_element(&l2net->neighbors, l2neigh, _node) {
       if (session->cfg.send_neighbors) {
-        OONF_DEBUG(session->log_source, "Add local neighbor: %s", netaddr_to_string(&nbuf, &l2neigh->addr));
-        _l2_neigh_added_to_session(session, l2neigh, &l2neigh->addr);
+        OONF_DEBUG(session->log_source, "Add local neighbor: %s",
+                   oonf_layer2_neigh_key_to_string(&nkbuf, &l2neigh->key, true));
+        _l2_neigh_added_to_session(session, l2neigh, &l2neigh->key);
       }
 
       if (session->cfg.send_proxied) {
+        memcpy(&l2key, &l2neigh->key, sizeof(l2key));
+
         avl_for_each_element(&l2neigh->destinations, l2dest, _node) {
+          memcpy(&l2key.addr, &l2dest->destination, sizeof(l2key.addr));
           OONF_DEBUG(session->log_source, "Add proxied neighbor: %s", netaddr_to_string(&nbuf, &l2dest->destination));
-          _l2_neigh_added_to_session(session, l2neigh, &l2dest->destination);
+          _l2_neigh_added_to_session(session, l2neigh, &l2key);
         }
       }
     }
@@ -357,19 +363,22 @@ _radio_process_session_update_ack(struct dlep_extension *ext __attribute__((unus
 static int
 _radio_process_destination_up_ack(struct dlep_extension *ext __attribute__((unused)), struct dlep_session *session) {
   struct dlep_local_neighbor *local;
-  struct netaddr mac;
-  if (dlep_reader_mac_tlv(&mac, session, NULL)) {
+  struct oonf_layer2_neigh_key mac_lid;
+
+  memset(&mac_lid, 0, sizeof(mac_lid));
+  if (dlep_reader_mac_tlv(&mac_lid.addr, session, NULL)) {
     return -1;
   }
+  dlep_reader_lid_tlv(&mac_lid, session, NULL);
 
   if (dlep_base_proto_print_status(session) == DLEP_STATUS_OKAY) {
-    local = dlep_session_get_local_neighbor(session, &mac);
+    local = dlep_session_get_local_neighbor(session, &mac_lid);
     if (local->state == DLEP_NEIGHBOR_UP_SENT) {
       local->state = DLEP_NEIGHBOR_UP_ACKED;
       oonf_timer_stop(&local->_ack_timeout);
 
       if (local->changed) {
-        dlep_session_generate_signal(session, DLEP_DESTINATION_UPDATE, &mac);
+        dlep_session_generate_signal(session, DLEP_DESTINATION_UPDATE, &mac_lid);
         local->changed = false;
       }
     }
@@ -386,14 +395,16 @@ _radio_process_destination_up_ack(struct dlep_extension *ext __attribute__((unus
 static int
 _radio_process_destination_down_ack(struct dlep_extension *ext __attribute__((unused)), struct dlep_session *session) {
   struct dlep_local_neighbor *local;
-  struct netaddr mac;
-  if (dlep_reader_mac_tlv(&mac, session, NULL)) {
-    OONF_INFO(session->log_source, "Could not read MAC tlv");
+  struct oonf_layer2_neigh_key mac_lid;
+
+  memset(&mac_lid, 0, sizeof(mac_lid));
+  if (dlep_reader_mac_tlv(&mac_lid.addr, session, NULL)) {
     return -1;
   }
+  dlep_reader_lid_tlv(&mac_lid, session, NULL);
 
   if (dlep_base_proto_print_status(session) == DLEP_STATUS_OKAY) {
-    local = dlep_session_get_local_neighbor(session, &mac);
+    local = dlep_session_get_local_neighbor(session, &mac_lid);
     if (local->state == DLEP_NEIGHBOR_DOWN_SENT) {
       dlep_session_remove_local_neighbor(session, local);
     }
@@ -423,7 +434,7 @@ _radio_process_link_char_request(
  */
 static int
 _radio_write_peer_offer(struct dlep_extension *ext __attribute__((unused)), struct dlep_session *session,
-  const struct netaddr *addr __attribute__((unused))) {
+  const struct oonf_layer2_neigh_key *addr __attribute__((unused))) {
   struct dlep_radio_if *radio_if;
   struct netaddr local_addr;
 #ifdef OONF_LOG_DEBUG_INFO
@@ -463,7 +474,7 @@ _radio_write_peer_offer(struct dlep_extension *ext __attribute__((unused)), stru
  */
 static int
 _radio_write_session_init_ack(struct dlep_extension *ext __attribute__((unused)), struct dlep_session *session,
-  const struct netaddr *addr __attribute__((unused))) {
+  const struct oonf_layer2_neigh_key *addr __attribute__((unused))) {
   const uint16_t *ext_ids;
   uint16_t ext_count;
 
@@ -491,13 +502,13 @@ _radio_write_session_init_ack(struct dlep_extension *ext __attribute__((unused))
  * @param mac MAC address of other endpoint
  */
 static void
-_l2_neigh_added_to_session(struct dlep_session *session, struct oonf_layer2_neigh *l2neigh, const struct netaddr *mac) {
+_l2_neigh_added_to_session(struct dlep_session *session, struct oonf_layer2_neigh *l2neigh, const struct oonf_layer2_neigh_key *mac) {
   struct dlep_local_neighbor *local;
 
   local = dlep_session_add_local_neighbor(session, mac);
 
   if (local) {
-    memcpy(&local->neigh_addr, &l2neigh->addr, sizeof(local->neigh_addr));
+    memcpy(&local->neigh_key, &l2neigh->key, sizeof(local->neigh_key));
 
     dlep_session_generate_signal(session, DLEP_DESTINATION_UP, mac);
     local->state = DLEP_NEIGHBOR_UP_SENT;
@@ -509,10 +520,11 @@ _l2_neigh_added_to_session(struct dlep_session *session, struct oonf_layer2_neig
  * Helper function triggered for a new layer2 neighbor
  * @param l2neigh layer2 neighbor
  * @param l2dest layer2 destination (might be NULL)
- * @param mac MAC address of other endpoint
+ * @param mac MAC address (plus link id) of other endpoint
  */
 static void
-_l2_neigh_added(struct oonf_layer2_neigh *l2neigh, struct oonf_layer2_destination *l2dest, const struct netaddr *mac) {
+_l2_neigh_added(struct oonf_layer2_neigh *l2neigh, struct oonf_layer2_destination *l2dest,
+                const struct oonf_layer2_neigh_key *mac) {
   struct dlep_radio_if *radio_if;
   struct dlep_radio_session *radio_session;
 
@@ -540,7 +552,7 @@ _l2_neigh_added(struct oonf_layer2_neigh *l2neigh, struct oonf_layer2_destinatio
  */
 static void
 _l2_neigh_changed(
-  struct oonf_layer2_neigh *l2neigh, struct oonf_layer2_destination *l2dest, const struct netaddr *mac) {
+  struct oonf_layer2_neigh *l2neigh, struct oonf_layer2_destination *l2dest, const struct oonf_layer2_neigh_key *mac) {
   struct dlep_radio_if *radio_if;
   struct dlep_radio_session *radio_session;
   struct dlep_local_neighbor *local;
@@ -561,7 +573,7 @@ _l2_neigh_changed(
     local = dlep_session_add_local_neighbor(&radio_session->session, mac);
 
     if (local) {
-      memcpy(&local->neigh_addr, &l2neigh->addr, sizeof(local->neigh_addr));
+      memcpy(&local->neigh_key, &l2neigh->key, sizeof(local->neigh_key));
 
       switch (local->state) {
         case DLEP_NEIGHBOR_UP_SENT:
@@ -594,7 +606,7 @@ _l2_neigh_changed(
  */
 static void
 _l2_neigh_removed(
-  struct oonf_layer2_neigh *l2neigh, struct oonf_layer2_destination *l2dest, const struct netaddr *mac) {
+  struct oonf_layer2_neigh *l2neigh, struct oonf_layer2_destination *l2dest, const struct oonf_layer2_neigh_key *mac) {
   struct dlep_radio_if *radio_if;
   struct dlep_radio_session *radio_session;
   struct dlep_local_neighbor *local;
@@ -617,8 +629,8 @@ _l2_neigh_removed(
       continue;
     }
 
-    if ((l2dest && netaddr_cmp(&l2neigh->addr, &local->neigh_addr) == 0) ||
-        (!l2dest && netaddr_is_unspec(&local->neigh_addr))) {
+    if ((l2dest && memcmp(&l2neigh->key, &local->neigh_key, sizeof(l2neigh->key)) == 0) ||
+        (!l2dest && netaddr_is_unspec(&local->neigh_key.addr))) {
       dlep_session_generate_signal(&radio_session->session, DLEP_DESTINATION_DOWN, mac);
       local->state = DLEP_NEIGHBOR_DOWN_SENT;
       oonf_timer_set(&local->_ack_timeout, radio_session->session.cfg.heartbeat_interval * 2);
@@ -654,7 +666,7 @@ static void
 _cb_l2_neigh_added(void *ptr) {
   struct oonf_layer2_neigh *l2neigh = ptr;
 
-  _l2_neigh_added(l2neigh, NULL, &l2neigh->addr);
+  _l2_neigh_added(l2neigh, NULL, &l2neigh->key);
 }
 
 /**
@@ -665,12 +677,15 @@ static void
 _cb_l2_neigh_changed(void *ptr) {
   struct oonf_layer2_neigh *l2neigh;
   struct oonf_layer2_destination *l2dst;
+  struct oonf_layer2_neigh_key dst_key;
 
   l2neigh = ptr;
-  _l2_neigh_changed(l2neigh, NULL, &l2neigh->addr);
+  _l2_neigh_changed(l2neigh, NULL, &l2neigh->key);
 
+  memcpy(&dst_key, &l2neigh->key, sizeof(dst_key));
   avl_for_each_element(&l2neigh->destinations, l2dst, _node) {
-    _l2_neigh_changed(l2neigh, l2dst, &l2dst->destination);
+    memcpy(&dst_key.addr, &l2dst->destination, sizeof(dst_key.addr));
+    _l2_neigh_changed(l2neigh, l2dst, &dst_key);
   }
 }
 
@@ -682,7 +697,7 @@ static void
 _cb_l2_neigh_removed(void *ptr) {
   struct oonf_layer2_neigh *l2neigh = ptr;
 
-  _l2_neigh_removed(l2neigh, NULL, &l2neigh->addr);
+  _l2_neigh_removed(l2neigh, NULL, &l2neigh->key);
 }
 
 /**
@@ -692,8 +707,11 @@ _cb_l2_neigh_removed(void *ptr) {
 static void
 _cb_l2_dst_added(void *ptr) {
   struct oonf_layer2_destination *l2dst = ptr;
+  struct oonf_layer2_neigh_key dst_key;
 
-  _l2_neigh_added(l2dst->neighbor, NULL, &l2dst->destination);
+  memcpy(&dst_key, &l2dst->neighbor->key, sizeof(dst_key));
+  memcpy(&dst_key.addr, &l2dst->destination, sizeof(dst_key.addr));
+  _l2_neigh_added(l2dst->neighbor, NULL, &dst_key);
 }
 
 /**
@@ -703,8 +721,11 @@ _cb_l2_dst_added(void *ptr) {
 static void
 _cb_l2_dst_removed(void *ptr) {
   struct oonf_layer2_destination *l2dst = ptr;
+  struct oonf_layer2_neigh_key dst_key;
 
-  _l2_neigh_removed(l2dst->neighbor, NULL, &l2dst->destination);
+  memcpy(&dst_key, &l2dst->neighbor->key, sizeof(dst_key));
+  memcpy(&dst_key.addr, &l2dst->destination, sizeof(dst_key.addr));
+  _l2_neigh_removed(l2dst->neighbor, NULL, &dst_key);
 }
 
 /**
index 8c51828..783f4b0 100644 (file)
@@ -74,8 +74,8 @@ static int _router_process_destination_down_ack(struct dlep_extension *, struct
 static int _router_process_destination_update(struct dlep_extension *, struct dlep_session *);
 static int _router_process_link_char_ack(struct dlep_extension *, struct dlep_session *);
 
-static int _router_write_peer_discovery(struct dlep_extension *, struct dlep_session *session, const struct netaddr *);
-static int _router_write_session_init(struct dlep_extension *, struct dlep_session *session, const struct netaddr *);
+static int _router_write_peer_discovery(struct dlep_extension *, struct dlep_session *session, const struct oonf_layer2_neigh_key *);
+static int _router_write_session_init(struct dlep_extension *, struct dlep_session *session, const struct oonf_layer2_neigh_key *);
 
 static struct dlep_extension_implementation _router_signals[] = {
   {
@@ -453,23 +453,24 @@ static int
 _router_process_destination_up(struct dlep_extension *ext __attribute__((unused)), struct dlep_session *session) {
   struct oonf_layer2_net *l2net;
   struct oonf_layer2_neigh *l2neigh;
-  struct netaddr mac;
   int result;
+  struct oonf_layer2_neigh_key mac_lid;
 
-  if (dlep_reader_mac_tlv(&mac, session, NULL)) {
-    OONF_INFO(session->log_source, "mac tlv missing");
+  memset(&mac_lid, 0, sizeof(mac_lid));
+  if (dlep_reader_mac_tlv(&mac_lid.addr, session, NULL)) {
     return -1;
   }
+  dlep_reader_lid_tlv(&mac_lid, session, NULL);
 
   l2net = oonf_layer2_net_add(session->l2_listener.name);
   if (!l2net) {
     return dlep_session_generate_signal_status(
-      session, DLEP_DESTINATION_UP_ACK, &mac, DLEP_STATUS_REQUEST_DENIED, "Not enough memory");
+      session, DLEP_DESTINATION_UP_ACK, &mac_lid, DLEP_STATUS_REQUEST_DENIED, "Not enough memory");
   }
-  l2neigh = oonf_layer2_neigh_add(l2net, &mac);
+  l2neigh = oonf_layer2_neigh_add_lid(l2net, &mac_lid);
   if (!l2neigh) {
     return dlep_session_generate_signal_status(
-      session, DLEP_DESTINATION_UP_ACK, &mac, DLEP_STATUS_REQUEST_DENIED, "Not enough memory");
+      session, DLEP_DESTINATION_UP_ACK, &mac_lid, DLEP_STATUS_REQUEST_DENIED, "Not enough memory");
   }
 
   result = dlep_reader_map_l2neigh_data(l2neigh->data, session, _base);
@@ -479,7 +480,7 @@ _router_process_destination_up(struct dlep_extension *ext __attribute__((unused)
   }
 
   /* generate ACK */
-  return dlep_session_generate_signal_status (session, DLEP_DESTINATION_UP_ACK, &mac, DLEP_STATUS_OKAY, "Success");
+  return dlep_session_generate_signal_status (session, DLEP_DESTINATION_UP_ACK, &mac_lid, DLEP_STATUS_OKAY, "Success");
 }
 
 /**
@@ -504,18 +505,20 @@ static int
 _router_process_destination_down(struct dlep_extension *ext __attribute__((unused)), struct dlep_session *session) {
   struct oonf_layer2_net *l2net;
   struct oonf_layer2_neigh *l2neigh;
-  struct netaddr mac;
+  struct oonf_layer2_neigh_key mac_lid;
 
-  if (dlep_reader_mac_tlv(&mac, session, NULL)) {
+  memset(&mac_lid, 0, sizeof(mac_lid));
+  if (dlep_reader_mac_tlv(&mac_lid.addr, session, NULL)) {
     return -1;
   }
+  dlep_reader_lid_tlv(&mac_lid, session, NULL);
 
   l2net = oonf_layer2_net_get(session->l2_listener.name);
   if (!l2net) {
     return 0;
   }
 
-  l2neigh = oonf_layer2_neigh_get(l2net, &mac);
+  l2neigh = oonf_layer2_neigh_get_lid(l2net, &mac_lid);
   if (!l2neigh) {
     return 0;
   }
@@ -524,7 +527,7 @@ _router_process_destination_down(struct dlep_extension *ext __attribute__((unuse
   oonf_layer2_neigh_remove(l2neigh, session->l2_origin);
 
   /* generate ACK */
-  return dlep_session_generate_signal_status(session, DLEP_DESTINATION_DOWN_ACK, &mac, DLEP_STATUS_OKAY, "Success");
+  return dlep_session_generate_signal_status(session, DLEP_DESTINATION_DOWN_ACK, &mac_lid, DLEP_STATUS_OKAY, "Success");
 }
 
 /**
@@ -597,7 +600,7 @@ _router_process_link_char_ack(struct dlep_extension *ext __attribute__((unused))
  */
 static int
 _router_write_peer_discovery(struct dlep_extension *ext __attribute__((unused)), struct dlep_session *session,
-  const struct netaddr *addr __attribute__((unused))) {
+  const struct oonf_layer2_neigh_key *addr __attribute__((unused))) {
   if (session->restrict_signal != DLEP_UDP_PEER_OFFER) {
     return -1;
   }
@@ -613,7 +616,7 @@ _router_write_peer_discovery(struct dlep_extension *ext __attribute__((unused)),
  */
 static int
 _router_write_session_init(struct dlep_extension *ext __attribute__((unused)), struct dlep_session *session,
-  const struct netaddr *addr __attribute__((unused))) {
+  const struct oonf_layer2_neigh_key *addr __attribute__((unused))) {
   const uint16_t *ext_ids;
   uint16_t ext_count;
 
index b6ec489..57c1753 100644 (file)
@@ -242,7 +242,9 @@ _cb_l2gen_event(struct oonf_timer_instance *ptr __attribute((unused))) {
   if (netaddr_get_address_family(&_l2gen_config.destination) == AF_MAC48) {
     oonf_layer2_destination_add(neigh, &_l2gen_config.destination, &_origin);
   }
-  memcpy(&neigh->addr, &_l2gen_config.neighbor, sizeof(neigh->addr));
+  memcpy(&neigh->key.addr, &_l2gen_config.neighbor, sizeof(neigh->key.addr));
+  neigh->key.link_id[0] = event_counter & 0xff;
+  neigh->key.link_id_length = 1;
   neigh->last_seen = oonf_clock_getNow();
 
   for (neigh_idx = 0; neigh_idx < OONF_LAYER2_NEIGH_COUNT; neigh_idx++) {
index 2a2edd5..2c1c6be 100644 (file)
@@ -127,6 +127,9 @@ static int _cb_create_text_dst(struct oonf_viewer_template *);
 /*! template key for neighbor address */
 #define KEY_NEIGH_ADDR "neigh_addr"
 
+/*! template key for neighbor link-id */
+#define KEY_NEIGH_LID "neigh_lid"
+
 /*! template key for last time neighbor was active */
 #define KEY_NEIGH_LASTSEEN "neigh_lastseen"
 
@@ -168,6 +171,7 @@ static char _value_if_peer_ip_origin[IF_NAMESIZE];
 static char _value_if_data[OONF_LAYER2_NET_COUNT][64];
 static char _value_if_origin[OONF_LAYER2_NET_COUNT][IF_NAMESIZE];
 static struct netaddr_str _value_neigh_addr;
+static union oonf_layer2_neigh_key_str _value_neigh_key;
 static struct isonumber_str _value_neigh_lastseen;
 static struct netaddr_str _value_neigh_remote_ip;
 static char _value_neigh_remote_ip_origin[IF_NAMESIZE];
@@ -202,6 +206,7 @@ static struct abuf_template_data_entry _tde_if_origin[OONF_LAYER2_NET_COUNT];
 
 static struct abuf_template_data_entry _tde_neigh_key[] = {
   { KEY_NEIGH_ADDR, _value_neigh_addr.buf, true },
+  { KEY_NEIGH_LID, _value_neigh_key.buf, true },
 };
 
 static struct abuf_template_data_entry _tde_neigh[] = {
@@ -483,7 +488,8 @@ _initialize_if_origin_values(struct oonf_layer2_data *data) {
  */
 static void
 _initialize_neigh_values(struct oonf_layer2_neigh *neigh) {
-  netaddr_to_string(&_value_neigh_addr, &neigh->addr);
+  netaddr_to_string(&_value_neigh_addr, &neigh->key.addr);
+  oonf_layer2_neigh_key_to_string(&_value_neigh_key, &neigh->key, false);
 
   if (neigh->last_seen) {
     oonf_clock_toIntervalString(&_value_neigh_lastseen, -oonf_clock_get_relative(neigh->last_seen));
index bdffda3..5c6b5eb 100644 (file)
@@ -326,7 +326,7 @@ _cb_probe_link(struct oonf_timer_instance *ptr __attribute__((unused))) {
       if (last_tx_packets != ldata->last_tx_traffic) {
         /* advance timestamp */
         ldata->last_probe_check = oonf_clock_getNow();
-        OONF_DEBUG(LOG_PROBING, "Drop link %s (already has unicast traffic)", netaddr_to_string(&nbuf, &l2neigh->addr));
+        OONF_DEBUG(LOG_PROBING, "Drop link %s (already has unicast traffic)", netaddr_to_string(&nbuf, &l2neigh->key.addr));
         continue;
       }
 
index 6c8adf4..63c9026 100644 (file)
@@ -445,7 +445,7 @@ oonf_layer2_net_add(const char *ifname) {
   avl_insert(&_oonf_layer2_net_tree, &l2net->_node);
 
   /* initialize tree of neighbors, ips and proxies */
-  avl_init(&l2net->neighbors, avl_comp_netaddr, false);
+  avl_init(&l2net->neighbors, oonf_layer2_avlcmp_neigh_key, false);
   avl_init(&l2net->local_peer_ips, avl_comp_netaddr, false);
   avl_init(&l2net->remote_neighbor_ips, avl_comp_netaddr, true);
 
@@ -686,18 +686,18 @@ oonf_layer2_net_get_best_neighbor_match(const struct netaddr *addr) {
 /**
  * Add a layer-2 neighbor to a addr.
  * @param l2net layer-2 addr object
- * @param neigh mac address of layer-2 neighbor
+ * @param key unique key for neighbor
  * @return layer-2 neighbor object
  */
 struct oonf_layer2_neigh *
-oonf_layer2_neigh_add(struct oonf_layer2_net *l2net, const struct netaddr *neigh) {
+oonf_layer2_neigh_add_lid(struct oonf_layer2_net *l2net, const struct oonf_layer2_neigh_key *key) {
   struct oonf_layer2_neigh *l2neigh;
 
-  if (netaddr_get_address_family(neigh) != AF_MAC48 && netaddr_get_address_family(neigh) != AF_EUI64) {
+  if (netaddr_get_address_family(&key->addr) != AF_MAC48 && netaddr_get_address_family(&key->addr) != AF_EUI64) {
     return NULL;
   }
 
-  l2neigh = oonf_layer2_neigh_get(l2net, neigh);
+  l2neigh = oonf_layer2_neigh_get_lid(l2net, key);
   if (l2neigh) {
     return l2neigh;
   }
@@ -707,8 +707,8 @@ oonf_layer2_neigh_add(struct oonf_layer2_net *l2net, const struct netaddr *neigh
     return NULL;
   }
 
-  memcpy(&l2neigh->addr, neigh, sizeof(*neigh));
-  l2neigh->_node.key = &l2neigh->addr;
+  memcpy(&l2neigh->key, key, sizeof(*key));
+  l2neigh->_node.key = &l2neigh->key;
   l2neigh->network = l2net;
 
   avl_insert(&l2net->neighbors, &l2neigh->_node);
@@ -1094,6 +1094,67 @@ oonf_layer2_get_origin_tree(void) {
 }
 
 /**
+ * Compares two layer2 neighbor keys
+ * @param p1 pointer to first neighbor key
+ * @param p2 pointer to second neighbor key
+ * @return result of memcmp comparison
+ */
+int
+oonf_layer2_avlcmp_neigh_key(const void *p1, const void *p2) {
+  const struct oonf_layer2_neigh_key *k1 = p1;
+  const struct oonf_layer2_neigh_key *k2 = p2;
+
+  return memcmp(k1, k2, sizeof(*k1));
+}
+
+/**
+ * Converts a layer2 neighbor key into a string representation
+ * @param buf buffer for output string
+ * @param key layer2 neighbor key
+ * @param show_mac true to show MAC and Link ID, false to only show LID
+ * @return pointer to output string
+ */
+const char *
+oonf_layer2_neigh_key_to_string(union oonf_layer2_neigh_key_str *buf,
+    const struct oonf_layer2_neigh_key *key, bool show_mac) {
+  static const char HEX[17] = "0123456789ABCDEF";
+  size_t str_idx, lid_idx;
+
+  if (show_mac) {
+    netaddr_to_string(&buf->nbuf, &key->addr);
+  }
+  else {
+    buf->buf[0] = 0;
+  }
+
+  if (key->link_id_length == 0) {
+    return buf->buf;
+  }
+
+  str_idx = strlen(buf->buf);
+  lid_idx = 0;
+
+  if (show_mac) {
+    buf->buf[str_idx++] = ' ';
+    buf->buf[str_idx++] = '[';
+    buf->buf[str_idx++] = '0';
+    buf->buf[str_idx++] = 'x';
+  }
+
+  while (str_idx + 4 < sizeof(*buf) && lid_idx < key->link_id_length) {
+    buf->buf[str_idx++] = HEX[key->link_id[lid_idx] >> 4];
+    buf->buf[str_idx++] = HEX[key->link_id[lid_idx] & 15];
+    lid_idx++;
+  }
+
+  if (show_mac) {
+    buf->buf[str_idx++] = ']';
+    buf->buf[str_idx++] = 0;
+  }
+  return buf->buf;
+}
+
+/**
  * Removes a layer-2 addr object from the database.
  * @param l2net layer-2 addr object
  */
index ac5562c..6b2de33 100644 (file)
 /*! memory class for layer2 neighbor address */
 #define LAYER2_CLASS_NEIGHBOR_ADDRESS "layer2_neighbor_address"
 
+enum {
+  /*! maximum length of link id for layer2 neighbors */
+  OONF_LAYER2_MAX_LINK_ID = 16,
+};
+
 /* configuration Macros for Layer2 keys */
 
 /**
@@ -419,11 +424,33 @@ struct oonf_layer2_peer_address {
 };
 
 /**
+ * unique key of a layer2 neighbor
+ */
+struct oonf_layer2_neigh_key {
+  /*! mac address of the neighbor */
+  struct netaddr addr;
+
+  /*! length of link id in octets */
+  uint8_t link_id_length;
+
+  /*! stored link id of neighbor (padded with zero bytes) */
+  uint8_t link_id[OONF_LAYER2_MAX_LINK_ID];
+};
+
+/**
+ * String buffer for text representation of neighbor key
+ */
+union oonf_layer2_neigh_key_str {
+  struct netaddr_str nbuf;
+  char buf[sizeof(struct netaddr_str) + 5 + 16*2];
+};
+
+/**
  * representation of a remote layer2 neighbor
  */
 struct oonf_layer2_neigh {
   /*! remote mac address of neighbor */
-  struct netaddr addr;
+  struct oonf_layer2_neigh_key key;
 
   /*! back pointer to layer2 network */
   struct oonf_layer2_net *network;
@@ -509,7 +536,7 @@ EXPORT int oonf_layer2_net_remove_ip(struct oonf_layer2_peer_address *ip, const
 EXPORT struct oonf_layer2_neighbor_address *oonf_layer2_net_get_best_neighbor_match(const struct netaddr *addr);
 EXPORT struct avl_tree *oonf_layer2_net_get_remote_ip_tree(void);
 
-EXPORT struct oonf_layer2_neigh *oonf_layer2_neigh_add(struct oonf_layer2_net *, const struct netaddr *l2neigh);
+EXPORT struct oonf_layer2_neigh *oonf_layer2_neigh_add_lid(struct oonf_layer2_net *, const struct oonf_layer2_neigh_key *key);
 EXPORT bool oonf_layer2_neigh_cleanup(struct oonf_layer2_neigh *l2neigh, const struct oonf_layer2_origin *origin);
 EXPORT bool oonf_layer2_neigh_remove(struct oonf_layer2_neigh *l2neigh, const struct oonf_layer2_origin *origin);
 EXPORT bool oonf_layer2_neigh_commit(struct oonf_layer2_neigh *l2neigh);
@@ -539,6 +566,9 @@ EXPORT const char *oonf_layer2_net_get_type_name(enum oonf_layer2_network_type);
 
 EXPORT struct avl_tree *oonf_layer2_get_net_tree(void);
 EXPORT struct avl_tree *oonf_layer2_get_origin_tree(void);
+EXPORT int oonf_layer2_avlcmp_neigh_key(const void *p1, const void *p2);
+EXPORT const char *oonf_layer2_neigh_key_to_string(union oonf_layer2_neigh_key_str *buf,
+    const struct oonf_layer2_neigh_key *key, bool show_mac);
 
 /**
  * Checks if a layer2 originator is registered
@@ -585,6 +615,15 @@ oonf_layer2_net_get_remote_ip(const struct oonf_layer2_net *l2net, const struct
   return avl_find_element(&l2net->remote_neighbor_ips, addr, l2ip, _net_node);
 }
 
+static INLINE struct oonf_layer2_neigh *
+oonf_layer2_neigh_add(struct oonf_layer2_net *net, const struct netaddr *l2neigh) {
+  struct oonf_layer2_neigh_key key;
+
+  memset(&key, 0, sizeof(key));
+  memcpy(&key.addr, l2neigh, sizeof(*l2neigh));
+  return oonf_layer2_neigh_add_lid(net, &key);
+}
+
 /**
  * Get a layer-2 neighbor object from the database
  * @param l2net layer-2 network/interface object
@@ -594,7 +633,23 @@ oonf_layer2_net_get_remote_ip(const struct oonf_layer2_net *l2net, const struct
 static INLINE struct oonf_layer2_neigh *
 oonf_layer2_neigh_get(const struct oonf_layer2_net *l2net, const struct netaddr *addr) {
   struct oonf_layer2_neigh *l2neigh;
-  return avl_find_element(&l2net->neighbors, addr, l2neigh, _node);
+  struct oonf_layer2_neigh_key key;
+
+  memset(&key, 0, sizeof(key));
+  memcpy(&key.addr, addr, sizeof(*addr));
+  return avl_find_element(&l2net->neighbors, &key, l2neigh, _node);
+}
+
+/**
+ * Get a layer-2 neighbor object from the database
+ * @param l2net layer-2 network/interface object
+ * @param key unique key of remote neighbor
+ * @return layer-2 neighbor object, NULL if not found
+ */
+static INLINE struct oonf_layer2_neigh *
+oonf_layer2_neigh_get_lid(const struct oonf_layer2_net *l2net, const struct oonf_layer2_neigh_key *key) {
+  struct oonf_layer2_neigh *l2neigh;
+  return avl_find_element(&l2net->neighbors, key, l2neigh, _node);
 }
 
 /**