Update of DLEP to RFC8175, tested against Rick Taylor's
authorHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Tue, 1 Aug 2017 12:37:40 +0000 (14:37 +0200)
committerHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Tue, 1 Aug 2017 12:37:40 +0000 (14:37 +0200)
DLEP router test harness.

24 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_interface.c
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_metric/metric.c
src-plugins/generic/dlep/ext_base_proto/proto.c
src-plugins/generic/dlep/ext_base_proto/proto_radio.c
src-plugins/generic/dlep/ext_base_proto/proto_router.c
src-plugins/generic/dlep/ext_l1_statistics/l1_statistics.c
src-plugins/generic/dlep/ext_l2_statistics/l2_statistics.c
src-plugins/generic/dlep/radio/dlep_radio.c
src-plugins/generic/dlep/radio/dlep_radio_interface.c
src-plugins/generic/dlep/radio/dlep_radio_session.c
src-plugins/generic/dlep/router/dlep_router.c
src-plugins/generic/dlep/router/dlep_router_interface.c
src-plugins/generic/dlep/router/dlep_router_session.c
src-plugins/subsystems/oonf_layer2.c
src-plugins/subsystems/oonf_layer2.h

index 285013e..bfe872e 100644 (file)
@@ -174,7 +174,7 @@ dlep_extension_get_ids(uint16_t *length) {
 int
 dlep_extension_router_process_peer_init_ack(
     struct dlep_extension *ext, struct dlep_session *session) {
-  if (session->restrict_signal != DLEP_PEER_INITIALIZATION_ACK) {
+  if (session->restrict_signal != DLEP_SESSION_INITIALIZATION_ACK) {
     /* ignore unless we are in initialization mode */
     return 0;
   }
index 6a6bd4d..a66373c 100644 (file)
@@ -61,7 +61,7 @@ struct dlep_extension;
  */
 struct dlep_extension_signal {
   /*! signal id */
-  uint16_t id;
+  int32_t id;
 
   /*! array of supported tlv ids */
   const uint16_t *supported_tlvs;
@@ -144,7 +144,7 @@ struct dlep_extension_tlv {
  */
 struct dlep_extension_implementation {
   /*! extension id */
-  uint16_t id;
+  int32_t id;
 
   /**
    * Callback for data processing
index 9a648cc..63556a9 100644 (file)
 #define DLEP_IANA_H_
 
 /*! IPv4 address for DLEP multicast discovery */
-#define DLEP_WELL_KNOWN_MULTICAST_ADDRESS "224.0.0.109"
+#define DLEP_WELL_KNOWN_MULTICAST_ADDRESS "224.0.0.117"
 
 /*! IPv6 address for DLEP multicast discovery */
-#define DLEP_WELL_KNOWN_MULTICAST_ADDRESS_6 "FF02::6D"
+#define DLEP_WELL_KNOWN_MULTICAST_ADDRESS_6 "FF02::1:7"
 
 /*! UDP port for DLEP multicast discovery */
-#define DLEP_WELL_KNOWN_MULTICAST_PORT_TXT "22222"
+#define DLEP_WELL_KNOWN_MULTICAST_PORT_TXT "854"
 
+/*! TCP port for DLEP radio server port */
+#define DLEP_WELL_KNOWN_SESSION_PORT_TXT   "854"
 /**
  * Generic DLEP Constant
  */
 enum {
   /*! DLEP IANA_PORT */
-  DLEP_PORT = 22222,//!< DLEP_PORT
+  DLEP_PORT = 854,//!< DLEP_PORT
 };
 
 /*! magic word for DLEP session */
-#define DLEP_DRAFT_17_PREFIX "DLEP"
+#define DLEP_RFC8175_PREFIX "DLEP"
 
 /**
  * Predefined DLEP extension IDs
@@ -80,10 +82,10 @@ enum dlep_extensions {
   DLEP_EXTENSION_BASE_METRIC     = -1,
 
   /*! Additional DLEP physical layer statistics */
-  DLEP_EXTENSION_L1_STATS        = 256,
+  DLEP_EXTENSION_L1_STATS        = 65520,
 
   /*! Additional DLEP link layer statistics */
-  DLEP_EXTENSION_L2_STATS        = 257,
+  DLEP_EXTENSION_L2_STATS        = 65521,
 };
 
 /**
@@ -99,35 +101,47 @@ enum dlep_signals {
   /*! control number to allow all DLEP signals */
   DLEP_ALL_SIGNALS                  = -1,
 
+  /*! constant added to UDP signals */
+  DLEP_IS_UDP_SIGNAL                = 65536,
+
+  /*! Do not use! */
+  DLEP_RESERVED_SIGNAL              =  0,
+
   /*! Router announces its presence (UDP) */
-  DLEP_PEER_DISCOVERY               =  1,
+  DLEP_UDP_PEER_DISCOVERY           =  1 + DLEP_IS_UDP_SIGNAL,
 
   /*! Radio announces the open DLEP session port(s) (UDP) */
-  DLEP_PEER_OFFER                   =  2,
+  DLEP_UDP_PEER_OFFER               =  2 + DLEP_IS_UDP_SIGNAL,
 
   /*! Router announcing the supported extensions */
-  DLEP_PEER_INITIALIZATION          =  3,
+  DLEP_SESSION_INITIALIZATION       =  1,
 
   /*! Radio announcing the supported extensions and default metrics */
-  DLEP_PEER_INITIALIZATION_ACK      =  4,
+  DLEP_SESSION_INITIALIZATION_ACK   =  2,
 
   /*! Radio update interface scope data */
-  DLEP_PEER_UPDATE                  =  5,
+  DLEP_PEER_UPDATE                  =  3,
 
   /*! Router acknowledges interface data update */
-  DLEP_PEER_UPDATE_ACK              =  6,
+  DLEP_PEER_UPDATE_ACK              =  4,
 
   /*! Radio/Router terminates DLEP session */
-  DLEP_PEER_TERMINATION             =  7,
+  DLEP_PEER_TERMINATION             =  5,
 
   /*! Radio/Router acknowledge end of DLEP session */
-  DLEP_PEER_TERMINATION_ACK         =  8,
+  DLEP_PEER_TERMINATION_ACK         =  6,
 
   /*! Radio announces a new neighbor with metrics */
-  DLEP_DESTINATION_UP               =  9,
+  DLEP_DESTINATION_UP               =  7,
 
   /*! Router acknowledges new neighbor */
-  DLEP_DESTINATION_UP_ACK           = 10,
+  DLEP_DESTINATION_UP_ACK           = 8,
+
+  /*! Router announce a new neighbor to the radio */
+  DLEP_DESTINATION_ANNOUNCE         = 9,
+
+  /*! Radio acknowledges the new neighbor */
+  DLEP_DESTINATION_ANNOUNCE_ACK     = 10,
 
   /*! Radio announces a lost neighbor */
   DLEP_DESTINATION_DOWN             = 11,
@@ -138,14 +152,14 @@ enum dlep_signals {
   /*! Radio announces new metrics for a neighbor */
   DLEP_DESTINATION_UPDATE           = 13,
 
-  /*! Radio/Router is still active */
-  DLEP_HEARTBEAT                    = 14,
-
   /*! Router demands a special link characteristic to a neighbor */
-  DLEP_LINK_CHARACTERISTICS_REQUEST = 15,
+  DLEP_LINK_CHARACTERISTICS_REQUEST = 14,
 
   /*! Radio acknowledges the changed link characterestics */
-  DLEP_LINK_CHARACTERISTICS_ACK     = 16,
+  DLEP_LINK_CHARACTERISTICS_ACK     = 15,
+
+  /*! Radio/Router is still active */
+  DLEP_HEARTBEAT                    = 16,
 };
 
 /**
@@ -201,33 +215,21 @@ enum dlep_tlvs {
   DLEP_LATENCY_TLV                 = 16,
 
   /*! resources (receive) */
-  DLEP_RESR_TLV                    = 17,
-
-  /*! resources (transmit) */
-  DLEP_REST_TLV                    = 18,
+  DLEP_RESOURCES_TLV               = 17,
 
   /*! relative link quality (receive) */
-  DLEP_RLQR_TLV                    = 19,
+  DLEP_RLQR_TLV                    = 18,
 
   /*! relative link quality (transmit) */
-  DLEP_RLQT_TLV                    = 20,
-
-  /*! timeout for link characteristic acknowledgement */
-  DLEP_LINK_CHAR_ACK_TIMER_TLV     = 21,
-
-  /*! grant more traffic credit to DLEP endpoint in octets */
-  DLEP_CREDIT_GRANT_TLV            = 22,
+  DLEP_RLQT_TLV                    = 19,
 
-  /*! current traffic credit window value in octets */
-  DLEP_CREDIT_WIN_STATUS_TLV       = 23,
-
-  /*! request more traffic credit */
-  DLEP_CREDIT_REQUEST_TLV          = 24,
+  /*! MTU of interface */
+  DLEP_MTU_TLV                     = 20,
 
   /* l1 statistics */
 
   /*! channel center frequency in Hz */
-  DLEP_FREQUENCY_TLV,
+  DLEP_FREQUENCY_TLV               = 65408,
 
   /*! channel bandwidth in Hz */
   DLEP_BANDWIDTH_TLV,
@@ -277,6 +279,13 @@ enum dlep_tlvs {
   DLEP_FRAMES_FAILED_TLV,
 };
 
+enum dlep_peer_type_flags {
+  /*! radio does not implement access control */
+  DLEP_PEER_TYPE_OPEN = 0,
+
+  /*! radio does implement access control */
+  DLEP_PEER_TYPE_SECURED = 1,
+};
 /**
  * Flags for IP address TLVs
  */
index 0337ff0..c997505 100644 (file)
@@ -58,7 +58,7 @@ static void _cb_receive_udp(struct oonf_packet_socket *,
     union netaddr_socket *from, void *ptr, size_t length);
 static void _cb_send_multicast(struct dlep_session *session, int af_family);
 
-static const char _DLEP_PREFIX[] = DLEP_DRAFT_17_PREFIX;
+static const char _DLEP_PREFIX[] = DLEP_RFC8175_PREFIX;
 
 /**
  * Add a new interface to this dlep instance
@@ -108,7 +108,7 @@ dlep_if_add(struct dlep_if *interf, const char *ifname,
   interf->session.cb_send_buffer = _cb_send_multicast;
   interf->session.cb_end_session = NULL;
   interf->session.restrict_signal =
-      radio ? DLEP_PEER_DISCOVERY : DLEP_PEER_OFFER;
+      radio ? DLEP_UDP_PEER_DISCOVERY : DLEP_UDP_PEER_OFFER;
   interf->session.writer.out = &interf->udp_out;
 
   /* inform all extension */
@@ -205,7 +205,7 @@ _cb_receive_udp(struct oonf_packet_socket *pkt,
   memcpy(&interf->session.remote_socket, from,
       sizeof(interf->session.remote_socket));
 
-  processed = dlep_session_process_buffer(&interf->session, buffer, length);
+  processed = dlep_session_process_buffer(&interf->session, buffer, length, true);
   if (processed < 0) {
     return ;
   }
index 9bb8f1c..7444c3c 100644 (file)
@@ -61,7 +61,7 @@
 int
 dlep_reader_heartbeat_tlv(uint64_t *interval,
     struct dlep_session *session, struct dlep_parser_value *value) {
-  uint16_t tmp;
+  uint32_t tmp;
   const uint8_t *ptr;
 
   if (!value) {
@@ -73,7 +73,7 @@ dlep_reader_heartbeat_tlv(uint64_t *interval,
 
   ptr = dlep_session_get_tlv_binary(session, value);
   memcpy(&tmp, ptr, sizeof(tmp));
-  *interval = 1000ull * ntohs(tmp);
+  *interval = ntohl(tmp);
   return 0;
 }
 
@@ -81,13 +81,14 @@ dlep_reader_heartbeat_tlv(uint64_t *interval,
  * Parse a DLEP peer type TLV
  * @param text pointer to buffer for peer type
  * @param text_length length of buffer for peer type
+ * @param secured_medium set to true if medium is secured, false otherwise
  * @param session dlep session
  * @param value dlep value to parse, NULL for using the first
  *   DLEP_PEER_TYPE_TLV value
  * @return -1 if an error happened, 0 otherwise
  */
 int
-dlep_reader_peer_type(char *text, size_t text_length,
+dlep_reader_peer_type(char *text, size_t text_length, bool *secured_medium,
     struct dlep_session *session, struct dlep_parser_value *value) {
   const uint8_t *ptr;
 
@@ -97,18 +98,23 @@ dlep_reader_peer_type(char *text, size_t text_length,
       return -1;
     }
   }
+  if (value->length == 0) {
+    return -1;
+  }
 
   ptr = dlep_session_get_tlv_binary(session, value);
 
-  if (value->length > 0 && text_length > 0) {
+  *secured_medium = (ptr[0] & DLEP_PEER_TYPE_SECURED) != 0;
+
+  if (value->length > 1 && text_length > 0) {
     /* generate a 0 terminated copy of the text */
-    if (text_length > value->length) {
-      memcpy(text, ptr, value->length);
-      text[value->length] = 0;
+    if (text_length-1u > value->length-1u) {
+      memcpy(text, &ptr[1], value->length-1u);
+      text[value->length-1u] = 0;
     }
     else {
-      memcpy(text, ptr, text_length-1);
-      text[text_length-1] = 0;
+      memcpy(text, &ptr[1], text_length-2u);
+      text[text_length-2u] = 0;
     }
   }
   return 0;
index 1d4beea..f84e64f 100644 (file)
@@ -55,7 +55,7 @@
 
 int dlep_reader_heartbeat_tlv(uint64_t *interval,
     struct dlep_session *session, struct dlep_parser_value *value);
-int dlep_reader_peer_type(char *text, size_t text_length,
+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);
index 2798ec8..67e96de 100644 (file)
@@ -67,17 +67,17 @@ static int _update_allowed_tlvs(struct dlep_session *session);
 static enum dlep_parser_error _parse_tlvstream(
     struct dlep_session *session, const uint8_t *buffer, size_t length);
 static enum dlep_parser_error _check_mandatory(struct dlep_session *session,
-    struct dlep_extension *ext, uint16_t signal_type);
+    struct dlep_extension *ext, int32_t signal_type);
 static enum dlep_parser_error _check_duplicate(struct dlep_session *session,
-    struct dlep_extension *ext, uint16_t signal_type);
+    struct dlep_extension *ext, int32_t signal_type);
 static enum dlep_parser_error _call_extension_processing(struct dlep_session *parser,
-    struct dlep_extension *ext, uint16_t signal_type);
+    struct dlep_extension *ext, int32_t signal_type);
 static struct dlep_parser_tlv *_add_session_tlv(
     struct dlep_session_parser *parser, uint16_t id);
 static enum dlep_parser_error _handle_extension(struct dlep_session *session,
-    struct dlep_extension *ext, uint16_t signal_type);
+    struct dlep_extension *ext, uint32_t signal_type);
 static enum dlep_parser_error _process_tlvs(struct dlep_session *,
-    uint16_t signal_type, uint16_t signal_length, const uint8_t *tlvs);
+    int32_t signal_type, uint16_t signal_length, const uint8_t *tlvs);
 static void _send_terminate(struct dlep_session *session);
 static void _cb_destination_timeout(struct oonf_timer_instance *);
 
@@ -303,7 +303,7 @@ dlep_session_process_tcp(struct oonf_stream_session *tcp_session,
 
   processed = dlep_session_process_buffer(session,
       abuf_getptr(&tcp_session->in),
-      abuf_getlen(&tcp_session->in));
+      abuf_getlen(&tcp_session->in), false);
 
   OONF_DEBUG(session->log_source,
       "Processed %" PRINTF_SSIZE_T_SPECIFIER " bytes", processed);
@@ -338,7 +338,7 @@ dlep_session_process_tcp(struct oonf_stream_session *tcp_session,
  */
 ssize_t
 dlep_session_process_buffer(
-    struct dlep_session *session, const void *buffer, size_t length) {
+    struct dlep_session *session, const void *buffer, size_t length, bool is_udp) {
   ssize_t result, offset;
   const char *ptr;
 
@@ -352,7 +352,7 @@ dlep_session_process_buffer(
         " %" PRINTF_SSIZE_T_SPECIFIER, offset);
 
     if ((result = dlep_session_process_signal(
-        session, &ptr[offset], length)) <= 0){
+        session, &ptr[offset], length, is_udp)) <= 0){
       if (result < 0) {
         return result;
       }
@@ -374,9 +374,10 @@ dlep_session_process_buffer(
  */
 size_t
 dlep_session_process_signal(struct dlep_session *session,
-    const void *ptr, size_t length) {
+    const void *ptr, size_t length, bool is_udp) {
   enum dlep_parser_error result;
-  uint16_t signal_type;
+  uint16_t original_signal_type;
+  int32_t signal_type;
   uint16_t signal_length;
   const uint8_t *buffer;
 #ifdef OONF_LOG_DEBUG_INFO
@@ -398,11 +399,15 @@ dlep_session_process_signal(struct dlep_session *session,
   buffer = ptr;
 
   /* copy data */
-  memcpy(&signal_type, &buffer[0], sizeof(signal_type));
+  memcpy(&original_signal_type, &buffer[0], sizeof(original_signal_type));
   memcpy(&signal_length, &buffer[2], sizeof(signal_length));
-  signal_type = ntohs(signal_type);
+  signal_type = ntohs(original_signal_type);
   signal_length = ntohs(signal_length);
 
+  if (is_udp) {
+    signal_type += DLEP_IS_UDP_SIGNAL;
+  }
+
   if (length < (size_t)signal_length + 4u) {
     /* not enough data for signal */
     OONF_DEBUG(session->log_source, "Not enough data to process"
@@ -415,7 +420,7 @@ dlep_session_process_signal(struct dlep_session *session,
   }
 
   OONF_DEBUG_HEX(session->log_source, buffer, signal_length + 4,
-      "Process signal %u from %s (%" PRINTF_SIZE_T_SPECIFIER" bytes)",
+      "Process signal %d from %s (%" PRINTF_SIZE_T_SPECIFIER" bytes)",
       signal_type,
       netaddr_socket_to_string(&nbuf, &session->remote_socket),
       length);
@@ -538,7 +543,7 @@ dlep_session_get_local_l2_neighbor(struct dlep_session *session,
  * @return -1 if an error happened, 0 otherwise
  */
 static int
-_generate_signal(struct dlep_session *session, uint16_t signal,
+_generate_signal(struct dlep_session *session, int32_t signal,
     const struct netaddr *neighbor) {
   struct dlep_extension *ext;
   size_t e,s;
@@ -555,8 +560,8 @@ _generate_signal(struct dlep_session *session, uint16_t signal,
 
   len = abuf_getlen(session->writer.out);
 
-  /* generate signal */
-  dlep_writer_start_signal(&session->writer, signal);
+  /* generate signal, mask out UDP/TCP difference */
+  dlep_writer_start_signal(&session->writer, signal & 65535);
   for (e=0; e<session->parser.extension_count; e++) {
     ext = session->parser.extensions[e];
 
@@ -600,7 +605,7 @@ _generate_signal(struct dlep_session *session, uint16_t signal,
  * @return -1 if an error happened, 0 otherwise
  */
 int
-dlep_session_generate_signal(struct dlep_session *session, uint16_t signal,
+dlep_session_generate_signal(struct dlep_session *session, int32_t signal,
     const struct netaddr *neighbor) {
   if (_generate_signal(session, signal, neighbor)) {
     OONF_WARN(session->log_source, "Could not generate signal %u", signal);
@@ -621,7 +626,7 @@ dlep_session_generate_signal(struct dlep_session *session, uint16_t signal,
  */
 int
 dlep_session_generate_signal_status(struct dlep_session *session,
-    uint16_t signal, const struct netaddr *neighbor,
+    int32_t signal, const struct netaddr *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);
@@ -733,7 +738,7 @@ _update_allowed_tlvs(struct dlep_session *session) {
  */
 static enum dlep_parser_error
 _handle_extension(struct dlep_session *session,
-    struct dlep_extension *ext, uint16_t signal_type) {
+    struct dlep_extension *ext, uint32_t signal_type) {
   enum dlep_parser_error result;
   bool active;
   size_t e;
@@ -780,7 +785,7 @@ _handle_extension(struct dlep_session *session,
  */
 static enum dlep_parser_error
 _process_tlvs(struct dlep_session *session,
-    uint16_t signal_type, uint16_t signal_length, const uint8_t *tlvs) {
+    int32_t signal_type, uint16_t signal_length, const uint8_t *tlvs) {
   enum dlep_parser_error result;
   struct dlep_extension *ext;
 
@@ -805,8 +810,8 @@ _process_tlvs(struct dlep_session *session,
  */
 static void
 _send_terminate(struct dlep_session *session) {
-  if (session->restrict_signal != DLEP_PEER_DISCOVERY
-      && session->restrict_signal != DLEP_PEER_OFFER) {
+  if (session->restrict_signal != DLEP_UDP_PEER_DISCOVERY
+      && session->restrict_signal != DLEP_UDP_PEER_OFFER) {
     dlep_session_generate_signal(session, DLEP_PEER_TERMINATION, NULL);
 
     session->restrict_signal = DLEP_PEER_TERMINATION_ACK;
@@ -888,8 +893,8 @@ _parse_tlvstream(struct dlep_session *session,
     /* check length */
     if (tlv->length_max < tlv_length || tlv->length_min > tlv_length) {
       OONF_WARN(session->log_source, "TLV %u has wrong size,"
-          " %"PRINTF_SIZE_T_SPECIFIER" is not between %u and %u",
-          tlv_type, idx + tlv_length, tlv->length_min, tlv->length_max);
+          " %d is not between %u and %u",
+          tlv_type, tlv_length, tlv->length_min, tlv->length_max);
       return DLEP_NEW_PARSER_ILLEGAL_TLV_LENGTH;
     }
 
@@ -940,7 +945,7 @@ _parse_tlvstream(struct dlep_session *session,
  */
 static enum dlep_parser_error
 _check_mandatory(struct dlep_session *session,
-    struct dlep_extension *ext, uint16_t signal_type) {
+    struct dlep_extension *ext, int32_t signal_type) {
   struct dlep_session_parser *parser;
   struct dlep_parser_tlv *tlv;
   struct dlep_extension_signal *extsig;
@@ -988,7 +993,7 @@ _check_mandatory(struct dlep_session *session,
  */
 static enum dlep_parser_error
 _check_duplicate(struct dlep_session *session,
-    struct dlep_extension *ext, uint16_t signal_type) {
+    struct dlep_extension *ext, int32_t signal_type) {
   struct dlep_session_parser *parser;
   struct dlep_parser_tlv *tlv;
   struct dlep_extension_signal *extsig;
@@ -1041,7 +1046,7 @@ _check_duplicate(struct dlep_session *session,
  */
 static enum dlep_parser_error
 _call_extension_processing(struct dlep_session *session,
-    struct dlep_extension *ext, uint16_t signal_type) {
+    struct dlep_extension *ext, int32_t signal_type) {
   size_t s;
 
   for (s=0; s<ext->signal_count; s++) {
index 9d9e8a3..4073803 100644 (file)
@@ -227,7 +227,7 @@ struct dlep_local_neighbor {
  */
 struct dlep_session_config {
   /*! peer type of local session */
-  const char *peer_type;
+  char *peer_type;
 
   /*! discovery interval */
   uint64_t discovery_interval;
@@ -316,13 +316,13 @@ 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);
+    struct dlep_session *session, const void *buffer, size_t length, bool is_udp);
 size_t dlep_session_process_signal(struct dlep_session *session,
-    const void *buffer, size_t length);
+    const void *buffer, size_t length, bool is_udp);
 int dlep_session_generate_signal(struct dlep_session *session,
-    uint16_t signal, const struct netaddr *neighbor);
+    int32_t signal, const struct netaddr *neighbor);
 int dlep_session_generate_signal_status(struct dlep_session *session,
-    uint16_t signal, const struct netaddr *neighbor,
+    int32_t signal, const struct netaddr *neighbor,
     enum dlep_status status, const char *msg);
 struct dlep_parser_value *dlep_session_get_tlv_value(
     struct dlep_session *session, uint16_t tlvtype);
index 6891118..b62b63e 100644 (file)
@@ -153,9 +153,9 @@ dlep_writer_finish_signal(struct dlep_writer *writer,
  */
 void
 dlep_writer_add_heartbeat_tlv(struct dlep_writer *writer, uint64_t interval) {
-  uint16_t value;
+  uint32_t value;
 
-  value = htons(interval / 1000);
+  value = htonl(interval);
 
   dlep_writer_add_tlv(writer, DLEP_HEARTBEAT_INTERVAL_TLV,
       &value, sizeof(value));
@@ -165,12 +165,17 @@ dlep_writer_add_heartbeat_tlv(struct dlep_writer *writer, uint64_t interval) {
  * Write a DLEP peer type TLV
  * @param writer dlep writer
  * @param peer_type ZERO terminated peer type
+ * @param access_control true if radio implements access control, false otherwise
  */
 void
 dlep_writer_add_peer_type_tlv(struct dlep_writer *writer,
-    const char *peer_type) {
-  dlep_writer_add_tlv(writer, DLEP_PEER_TYPE_TLV,
-      peer_type, strlen(peer_type));
+    const char *peer_type, bool access_control) {
+  char flags;
+
+  flags = access_control ? DLEP_PEER_TYPE_SECURED : DLEP_PEER_TYPE_OPEN;
+
+  dlep_writer_add_tlv2(writer, DLEP_PEER_TYPE_TLV,
+      &flags, sizeof(flags), peer_type, strlen(peer_type));
 }
 
 /**
index ae73941..a9d4c92 100644 (file)
@@ -66,7 +66,7 @@ int dlep_writer_finish_signal(struct dlep_writer *writer,
 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);
+    const char *peer_type, bool access_control);
 int dlep_writer_add_mac_tlv(struct dlep_writer *writer,
     const struct netaddr *mac);
 void dlep_writer_add_ipv4_tlv(struct dlep_writer *writer,
index 25565ca..eac922f 100644 (file)
 #include "dlep/ext_base_metric/metric.h"
 
 /* peer initialization ack */
-static const uint16_t _peer_initack_tlvs[] = {
+static const uint16_t _session_initack_tlvs[] = {
     DLEP_MDRR_TLV,
     DLEP_MDRT_TLV,
     DLEP_CDRR_TLV,
     DLEP_CDRT_TLV,
     DLEP_LATENCY_TLV,
-    DLEP_RESR_TLV,
-    DLEP_REST_TLV,
+    DLEP_RESOURCES_TLV,
     DLEP_RLQR_TLV,
     DLEP_RLQT_TLV,
+    DLEP_MTU_TLV,
 };
-static const uint16_t _peer_initack_mandatory[] = {
+static const uint16_t _session_initack_mandatory[] = {
     DLEP_MDRR_TLV,
     DLEP_MDRT_TLV,
     DLEP_CDRR_TLV,
     DLEP_CDRT_TLV,
+    DLEP_LATENCY_TLV,
 };
 
 /* peer update */
@@ -81,8 +82,7 @@ static const uint16_t _peer_update_tlvs[] = {
     DLEP_CDRR_TLV,
     DLEP_CDRT_TLV,
     DLEP_LATENCY_TLV,
-    DLEP_RESR_TLV,
-    DLEP_REST_TLV,
+    DLEP_RESOURCES_TLV,
     DLEP_RLQR_TLV,
     DLEP_RLQT_TLV,
 };
@@ -95,8 +95,7 @@ static const uint16_t _dst_tlvs[] = {
     DLEP_CDRR_TLV,
     DLEP_CDRT_TLV,
     DLEP_LATENCY_TLV,
-    DLEP_RESR_TLV,
-    DLEP_REST_TLV,
+    DLEP_RESOURCES_TLV,
     DLEP_RLQR_TLV,
     DLEP_RLQT_TLV,
 };
@@ -108,11 +107,11 @@ static const uint16_t _dst_mandatory[] = {
 /* supported signals of this extension */
 static struct dlep_extension_signal _signals[] = {
     {
-        .id = DLEP_PEER_INITIALIZATION_ACK,
-        .supported_tlvs = _peer_initack_tlvs,
-        .supported_tlv_count = ARRAYSIZE(_peer_initack_tlvs),
-        .mandatory_tlvs = _peer_initack_mandatory,
-        .mandatory_tlv_count = ARRAYSIZE(_peer_initack_mandatory),
+        .id = DLEP_SESSION_INITIALIZATION_ACK,
+        .supported_tlvs = _session_initack_tlvs,
+        .supported_tlv_count = ARRAYSIZE(_session_initack_tlvs),
+        .mandatory_tlvs = _session_initack_mandatory,
+        .mandatory_tlv_count = ARRAYSIZE(_session_initack_mandatory),
         .add_radio_tlvs = dlep_extension_radio_write_peer_init_ack,
         .process_router = dlep_extension_router_process_peer_init_ack,
     },
@@ -151,8 +150,7 @@ static struct dlep_extension_tlv _tlvs[] = {
     { DLEP_CDRR_TLV, 8,8 },
     { DLEP_CDRT_TLV, 8,8 },
     { DLEP_LATENCY_TLV, 8,8 },
-    { DLEP_RESR_TLV, 1,1 },
-    { DLEP_REST_TLV, 1,1 },
+    { DLEP_RESOURCES_TLV, 1,1 },
     { DLEP_RLQR_TLV, 1,1 },
     { DLEP_RLQT_TLV, 1,1 },
 };
@@ -207,19 +205,15 @@ static struct dlep_neighbor_mapping _neigh_mappings[] = {
         .layer2   = OONF_LAYER2_NEIGH_LATENCY,
         .length   = 8,
 
+        .mandatory     = true,
+        .default_value = 1,
+
         .from_tlv      = dlep_reader_map_identity,
         .to_tlv        = dlep_writer_map_identity,
     },
     {
-        .dlep          = DLEP_RESR_TLV,
-        .layer2        = OONF_LAYER2_NEIGH_RX_RESOURCES,
-        .length        = 1,
-        .from_tlv      = dlep_reader_map_identity,
-        .to_tlv        = dlep_writer_map_identity,
-    },
-    {
-        .dlep          = DLEP_REST_TLV,
-        .layer2        = OONF_LAYER2_NEIGH_TX_RESOURCES,
+        .dlep          = DLEP_RESOURCES_TLV,
+        .layer2        = OONF_LAYER2_NEIGH_RESOURCES,
         .length        = 1,
         .from_tlv      = dlep_reader_map_identity,
         .to_tlv        = dlep_writer_map_identity,
@@ -251,7 +245,6 @@ static struct dlep_extension _base_metric = {
   .tlv_count = ARRAYSIZE(_tlvs),
   .neigh_mapping = _neigh_mappings,
   .neigh_mapping_count = ARRAYSIZE(_neigh_mappings),
-
 };
 
 /**
index fa27cdd..629738b 100644 (file)
 static void _cb_local_heartbeat(struct oonf_timer_instance *);
 static void _cb_remote_heartbeat(struct oonf_timer_instance *);
 
-/* peer discovery */
+/* UDP peer discovery */
 
-/* peer offer */
+/* UDP peer offer */
 static const uint16_t _peer_offer_tlvs[] = {
     DLEP_PEER_TYPE_TLV,
     DLEP_IPV4_CONPOINT_TLV,
     DLEP_IPV6_CONPOINT_TLV,
 };
 
-/* peer initialization */
-static const uint16_t _peer_init_tlvs[] = {
+/* session initialization */
+static const uint16_t _session_init_tlvs[] = {
     DLEP_HEARTBEAT_INTERVAL_TLV,
     DLEP_PEER_TYPE_TLV,
     DLEP_EXTENSIONS_SUPPORTED_TLV,
 };
-static const uint16_t _peer_init_mandatory[] = {
+static const uint16_t _session_init_mandatory[] = {
     DLEP_HEARTBEAT_INTERVAL_TLV,
+    DLEP_PEER_TYPE_TLV,
 };
 
-/* peer initialization ack */
-static const uint16_t _peer_initack_tlvs[] = {
+/* session initialization ack */
+static const uint16_t _session_initack_tlvs[] = {
     DLEP_HEARTBEAT_INTERVAL_TLV,
     DLEP_STATUS_TLV,
     DLEP_PEER_TYPE_TLV,
     DLEP_EXTENSIONS_SUPPORTED_TLV,
 };
-static const uint16_t _peer_initack_mandatory[] = {
+static const uint16_t _session_initack_mandatory[] = {
     DLEP_HEARTBEAT_INTERVAL_TLV,
+    DLEP_STATUS_TLV,
+    DLEP_PEER_TYPE_TLV,
 };
 
 /* peer update */
@@ -181,7 +184,6 @@ static const uint16_t _linkchar_req_tlvs[] = {
     DLEP_CDRR_TLV,
     DLEP_CDRT_TLV,
     DLEP_LATENCY_TLV,
-    DLEP_LINK_CHAR_ACK_TIMER_TLV,
 };
 static const uint16_t _linkchar_req_mandatory[] = {
     DLEP_MAC_ADDRESS_TLV,
@@ -195,8 +197,7 @@ static const uint16_t _linkchar_ack_tlvs[] = {
     DLEP_CDRR_TLV,
     DLEP_CDRT_TLV,
     DLEP_LATENCY_TLV,
-    DLEP_RESR_TLV,
-    DLEP_REST_TLV,
+    DLEP_RESOURCES_TLV,
     DLEP_RLQR_TLV,
     DLEP_RLQT_TLV,
     DLEP_STATUS_TLV,
@@ -208,26 +209,26 @@ static const uint16_t _linkchar_ack_mandatory[] = {
 /* supported signals of this extension */
 static struct dlep_extension_signal _signals[] = {
     {
-        .id = DLEP_PEER_DISCOVERY,
+        .id = DLEP_UDP_PEER_DISCOVERY,
     },
     {
-        .id = DLEP_PEER_OFFER,
+        .id = DLEP_UDP_PEER_OFFER,
         .supported_tlvs = _peer_offer_tlvs,
         .supported_tlv_count = ARRAYSIZE(_peer_offer_tlvs),
     },
     {
-        .id = DLEP_PEER_INITIALIZATION,
-        .supported_tlvs = _peer_init_tlvs,
-        .supported_tlv_count = ARRAYSIZE(_peer_init_tlvs),
-        .mandatory_tlvs = _peer_init_mandatory,
-        .mandatory_tlv_count = ARRAYSIZE(_peer_init_mandatory),
+        .id = DLEP_SESSION_INITIALIZATION,
+        .supported_tlvs = _session_init_tlvs,
+        .supported_tlv_count = ARRAYSIZE(_session_init_tlvs),
+        .mandatory_tlvs = _session_init_mandatory,
+        .mandatory_tlv_count = ARRAYSIZE(_session_init_mandatory),
     },
     {
-        .id = DLEP_PEER_INITIALIZATION_ACK,
-        .supported_tlvs = _peer_initack_tlvs,
-        .supported_tlv_count = ARRAYSIZE(_peer_initack_tlvs),
-        .mandatory_tlvs = _peer_initack_mandatory,
-        .mandatory_tlv_count = ARRAYSIZE(_peer_initack_mandatory),
+        .id = DLEP_SESSION_INITIALIZATION_ACK,
+        .supported_tlvs = _session_initack_tlvs,
+        .supported_tlv_count = ARRAYSIZE(_session_initack_tlvs),
+        .mandatory_tlvs = _session_initack_mandatory,
+        .mandatory_tlv_count = ARRAYSIZE(_session_initack_mandatory),
     },
     {
         .id = DLEP_PEER_UPDATE,
@@ -315,7 +316,7 @@ static struct dlep_extension_tlv _tlvs[] = {
     { DLEP_IPV4_CONPOINT_TLV, 5,7 },
     { DLEP_IPV6_CONPOINT_TLV, 17,19 },
     { DLEP_PEER_TYPE_TLV, 1,255 },
-    { DLEP_HEARTBEAT_INTERVAL_TLV, 2,2 },
+    { DLEP_HEARTBEAT_INTERVAL_TLV, 4,4 },
     { DLEP_EXTENSIONS_SUPPORTED_TLV, 2, 65534 },
     { DLEP_MAC_ADDRESS_TLV, 6,8 },
     { DLEP_IPV4_ADDRESS_TLV, 5,5 },
@@ -327,11 +328,9 @@ static struct dlep_extension_tlv _tlvs[] = {
     { DLEP_CDRR_TLV, 8,8 },
     { DLEP_CDRT_TLV, 8,8 },
     { DLEP_LATENCY_TLV, 8,8 },
-    { DLEP_RESR_TLV, 1,1 },
-    { DLEP_REST_TLV, 1,1 },
+    { DLEP_RESOURCES_TLV, 1,1 },
     { DLEP_RLQR_TLV, 1,1 },
     { DLEP_RLQT_TLV, 1,1 },
-    { DLEP_LINK_CHAR_ACK_TIMER_TLV, 1,1 },
 };
 
 static struct dlep_neighbor_mapping _neigh_mappings[] = {
@@ -371,15 +370,8 @@ static struct dlep_neighbor_mapping _neigh_mappings[] = {
         .to_tlv   = dlep_writer_map_identity,
     },
     {
-        .dlep     = DLEP_RESR_TLV,
-        .layer2   = OONF_LAYER2_NEIGH_RX_RESOURCES,
-        .length   = 1,
-        .from_tlv = dlep_reader_map_identity,
-        .to_tlv   = dlep_writer_map_identity,
-    },
-    {
-        .dlep     = DLEP_REST_TLV,
-        .layer2   = OONF_LAYER2_NEIGH_TX_RESOURCES,
+        .dlep     = DLEP_RESOURCES_TLV,
+        .layer2   = OONF_LAYER2_NEIGH_RESOURCES,
         .length   = 1,
         .from_tlv = dlep_reader_map_identity,
         .to_tlv   = dlep_writer_map_identity,
@@ -494,10 +486,12 @@ dlep_base_proto_print_status(struct dlep_session *session) {
 void
 dlep_base_proto_print_peer_type(struct dlep_session *session) {
   char text[256];
+  bool secure;
 
-  if (!dlep_reader_peer_type(text, sizeof(text), session, NULL)) {
+  if (!dlep_reader_peer_type(text, sizeof(text), &secure, session, NULL)) {
     OONF_DEBUG(session->log_source,
-        "Remote peer type: %s", text);
+        "Remote peer type (%s): %s",
+        secure ? "secure" : "open", text);
   }
 }
 
index 9ed0b7b..b9da398 100644 (file)
@@ -78,7 +78,7 @@ static int _radio_process_link_char_request(struct dlep_extension *, struct dlep
 
 static int _radio_write_peer_offer(struct dlep_extension *,
     struct dlep_session *session, const struct netaddr *);
-static int _radio_write_peer_init_ack(struct dlep_extension *,
+static int _radio_write_session_init_ack(struct dlep_extension *,
     struct dlep_session *session, const struct netaddr *);
 
 static void _l2_neigh_added_to_session(struct dlep_session *session,
@@ -98,20 +98,20 @@ static void _cb_destination_timeout(struct dlep_session *,
 
 static struct dlep_extension_implementation _radio_signals[] = {
     {
-        .id = DLEP_PEER_DISCOVERY,
+        .id = DLEP_UDP_PEER_DISCOVERY,
         .process = _radio_process_peer_discovery
     },
     {
-        .id = DLEP_PEER_OFFER,
+        .id = DLEP_UDP_PEER_OFFER,
         .add_tlvs = _radio_write_peer_offer,
     },
     {
-        .id = DLEP_PEER_INITIALIZATION,
+        .id = DLEP_SESSION_INITIALIZATION,
         .process = _radio_process_peer_init,
     },
     {
-        .id = DLEP_PEER_INITIALIZATION_ACK,
-        .add_tlvs = _radio_write_peer_init_ack,
+        .id = DLEP_SESSION_INITIALIZATION_ACK,
+        .add_tlvs = _radio_write_session_init_ack,
     },
     {
         .id = DLEP_PEER_UPDATE,
@@ -205,7 +205,7 @@ dlep_base_proto_radio_init(void) {
  */
 static void
 _cb_init_radio(struct dlep_session *session) {
-  if (session->restrict_signal == DLEP_PEER_INITIALIZATION) {
+  if (session->restrict_signal == DLEP_SESSION_INITIALIZATION) {
     /*
      * we are waiting for a Peer Init,
      */
@@ -235,11 +235,11 @@ static int
 _radio_process_peer_discovery(
     struct dlep_extension *ext __attribute__((unused)),
     struct dlep_session *session) {
-  if (session->restrict_signal != DLEP_PEER_DISCOVERY) {
+  if (session->restrict_signal != DLEP_UDP_PEER_DISCOVERY) {
     /* ignore unless we are in discovery mode */
     return 0;
   }
-  return dlep_session_generate_signal(session, DLEP_PEER_OFFER, NULL);
+  return dlep_session_generate_signal(session, DLEP_UDP_PEER_OFFER, NULL);
 }
 
 /**
@@ -262,7 +262,7 @@ _radio_process_peer_init(
   struct netaddr_str nbuf;
 #endif
 
-  if (session->restrict_signal != DLEP_PEER_INITIALIZATION) {
+  if (session->restrict_signal != DLEP_SESSION_INITIALIZATION) {
     /* ignore unless we are in initialization mode */
     return 0;
   }
@@ -296,7 +296,7 @@ _radio_process_peer_init(
   }
 
   if (dlep_session_generate_signal(
-      session, DLEP_PEER_INITIALIZATION_ACK, NULL)) {
+      session, DLEP_SESSION_INITIALIZATION_ACK, NULL)) {
     return -1;
   }
 
@@ -494,6 +494,9 @@ _radio_write_peer_offer(
     const struct netaddr *addr __attribute__((unused))) {
   struct dlep_radio_if *radio_if;
   struct netaddr local_addr;
+#ifdef OONF_LOG_DEBUG_INFO
+  struct netaddr_str nbuf;
+#endif
 
   radio_if = dlep_radio_get_by_layer2_if(
       session->l2_listener.data->name);
@@ -502,6 +505,8 @@ _radio_write_peer_offer(
     return 0;
   }
 
+  OONF_DEBUG(session->log_source, "Local IPv4 socket: %s",
+      netaddr_socket_to_string(&nbuf, &radio_if->tcp.socket_v4.local_socket));
   netaddr_from_socket(&local_addr, &radio_if->tcp.socket_v4.local_socket);
   if (netaddr_get_address_family(&local_addr) == AF_INET) {
     /* no support for TLS at the moment */
@@ -509,6 +514,8 @@ _radio_write_peer_offer(
         &local_addr, radio_if->tcp_config.port, false);
   }
 
+  OONF_DEBUG(session->log_source, "Local IPv6 socket: %s",
+      netaddr_socket_to_string(&nbuf, &radio_if->tcp.socket_v6.local_socket));
   netaddr_from_socket(&local_addr, &radio_if->tcp.socket_v6.local_socket);
   if (netaddr_get_address_family(&local_addr) == AF_INET6) {
     /* no support for TLS at the moment */
@@ -526,7 +533,7 @@ _radio_write_peer_offer(
  * @return -1 if an error happened, 0 otherwise
  */
 static int
-_radio_write_peer_init_ack(
+_radio_write_session_init_ack(
     struct dlep_extension *ext __attribute__((unused)),
     struct dlep_session *session,
     const struct netaddr *addr __attribute__((unused))) {
@@ -535,7 +542,7 @@ _radio_write_peer_init_ack(
 
   /* write heartbeat interval */
   dlep_writer_add_heartbeat_tlv(&session->writer,
-      session->remote_heartbeat_interval);
+      session->cfg.heartbeat_interval);
 
   /* write supported extensions */
   ext_ids = dlep_extension_get_ids(&ext_count);
@@ -544,10 +551,11 @@ _radio_write_peer_init_ack(
         &session->writer, ext_ids, ext_count);
   }
 
-  if (session->cfg.peer_type) {
-    dlep_writer_add_peer_type_tlv(
-        &session->writer, session->cfg.peer_type);
-  }
+  /* TODO: check what router will report as flags */
+  dlep_writer_add_peer_type_tlv(
+      &session->writer, session->cfg.peer_type, false);
+
+  dlep_writer_add_status(&session->writer, DLEP_STATUS_OKAY, "");
 
   return 0;
 }
index 422c2df..d9198ad 100644 (file)
@@ -76,24 +76,24 @@ static int _router_process_link_char_ack(struct dlep_extension *, struct dlep_se
 
 static int _router_write_peer_discovery(struct dlep_extension *,
     struct dlep_session *session, const struct netaddr *);
-static int _router_write_peer_init(struct dlep_extension *,
+static int _router_write_session_init(struct dlep_extension *,
     struct dlep_session *session, const struct netaddr *);
 
 static struct dlep_extension_implementation _router_signals[] = {
     {
-        .id = DLEP_PEER_DISCOVERY,
+        .id = DLEP_UDP_PEER_DISCOVERY,
         .add_tlvs = _router_write_peer_discovery,
     },
     {
-        .id = DLEP_PEER_OFFER,
+        .id = DLEP_UDP_PEER_OFFER,
         .process = _router_process_peer_offer,
     },
     {
-        .id = DLEP_PEER_INITIALIZATION,
-        .add_tlvs = _router_write_peer_init,
+        .id = DLEP_SESSION_INITIALIZATION,
+        .add_tlvs = _router_write_session_init,
     },
     {
-        .id = DLEP_PEER_INITIALIZATION_ACK,
+        .id = DLEP_SESSION_INITIALIZATION_ACK,
         .process = _router_process_peer_init_ack,
     },
     {
@@ -173,12 +173,12 @@ dlep_base_proto_router_init(void) {
  */
 static void
 _cb_init_router(struct dlep_session *session) {
-  if (session->restrict_signal == DLEP_PEER_INITIALIZATION_ACK) {
+  if (session->restrict_signal == DLEP_SESSION_INITIALIZATION_ACK) {
     /*
      * we are waiting for a Peer Init Ack,
      * so we need to send a Peer Init
      */
-    dlep_session_generate_signal(session, DLEP_PEER_INITIALIZATION, NULL);
+    dlep_session_generate_signal(session, DLEP_SESSION_INITIALIZATION, NULL);
     session->cb_send_buffer(session, 0);
 
     session->remote_heartbeat_interval = session->cfg.heartbeat_interval;
@@ -193,7 +193,7 @@ _cb_init_router(struct dlep_session *session) {
 static void
 _cb_apply_router(struct dlep_session *session) {
   OONF_DEBUG(session->log_source, "Initialize base router session");
-  if (session->restrict_signal == DLEP_PEER_OFFER) {
+  if (session->restrict_signal == DLEP_UDP_PEER_OFFER) {
     /*
      * we are waiting for a Peer Offer,
      * so we need to send Peer Discovery messages
@@ -242,10 +242,10 @@ _cb_create_peer_discovery(struct oonf_timer_instance *ptr) {
 
   OONF_DEBUG(session->log_source, "Generate peer discovery");
 
-  dlep_session_generate_signal(session, DLEP_PEER_DISCOVERY, NULL);
+  dlep_session_generate_signal(session, DLEP_UDP_PEER_DISCOVERY, NULL);
   session->cb_send_buffer(session, AF_INET);
 
-  dlep_session_generate_signal(session, DLEP_PEER_DISCOVERY, NULL);
+  dlep_session_generate_signal(session, DLEP_UDP_PEER_DISCOVERY, NULL);
   session->cb_send_buffer(session, AF_INET6);
 }
 
@@ -269,7 +269,7 @@ _router_process_peer_offer(
   bool tls;
   struct os_interface *ifdata;
 
-  if (session->restrict_signal != DLEP_PEER_OFFER) {
+  if (session->restrict_signal != DLEP_UDP_PEER_OFFER) {
     /* ignore unless we are in discovery mode */
     return 0;
   }
@@ -366,7 +366,7 @@ _router_process_peer_init_ack(
   const uint8_t *ptr;
   int result;
 
-  if (session->restrict_signal != DLEP_PEER_INITIALIZATION_ACK) {
+  if (session->restrict_signal != DLEP_SESSION_INITIALIZATION_ACK) {
     /* ignore unless we are in initialization mode */
     return 0;
   }
@@ -641,7 +641,7 @@ _router_write_peer_discovery(
     struct dlep_extension *ext __attribute__((unused)),
     struct dlep_session *session,
     const struct netaddr *addr __attribute__((unused))) {
-  if (session->restrict_signal != DLEP_PEER_OFFER) {
+  if (session->restrict_signal != DLEP_UDP_PEER_OFFER) {
     return -1;
   }
   return 0;
@@ -655,7 +655,7 @@ _router_write_peer_discovery(
  * @return -1 if an error happened, 0 otherwise
  */
 static int
-_router_write_peer_init(
+_router_write_session_init(
     struct dlep_extension *ext __attribute__((unused)),
     struct dlep_session *session,
     const struct netaddr *addr __attribute__((unused))) {
@@ -672,10 +672,9 @@ _router_write_peer_init(
   dlep_writer_add_heartbeat_tlv(&session->writer,
       session->cfg.heartbeat_interval);
 
-  if (session->cfg.peer_type) {
-    dlep_writer_add_peer_type_tlv(
-        &session->writer, session->cfg.peer_type);
-  }
+  /* TODO: report if radio has secured the medium */
+  dlep_writer_add_peer_type_tlv(
+      &session->writer, session->cfg.peer_type, false);
 
   return 0;
 }
index 45ee4fa..4a8c9b6 100644 (file)
@@ -112,7 +112,7 @@ static const uint16_t _dst_mandatory[] = {
 /* supported signals of this extension */
 static struct dlep_extension_signal _signals[] = {
     {
-        .id = DLEP_PEER_INITIALIZATION_ACK,
+        .id = DLEP_SESSION_INITIALIZATION_ACK,
         .supported_tlvs = _peer_initack_tlvs,
         .supported_tlv_count = ARRAYSIZE(_peer_initack_tlvs),
         .mandatory_tlvs = _peer_initack_mandatory,
index 2ed2a6a..f556c72 100644 (file)
@@ -97,7 +97,7 @@ static const uint16_t _dst_mandatory[] = {
 /* supported signals of this extension */
 static struct dlep_extension_signal _signals[] = {
     {
-        .id = DLEP_PEER_INITIALIZATION_ACK,
+        .id = DLEP_SESSION_INITIALIZATION_ACK,
         .supported_tlvs = _peer_initack_tlvs,
         .supported_tlv_count = ARRAYSIZE(_peer_initack_tlvs),
         .mandatory_tlvs = _peer_initack_mandatory,
index a5782d5..a2ba6ad 100644 (file)
@@ -78,6 +78,9 @@ static struct cfg_schema_entry _radio_entries[] = {
   CFG_MAP_STRING_ARRAY(dlep_radio_if, interf.udp_config.interface, "datapath_if", "",
      "Name of interface to talk to dlep router (default is section name)", IF_NAMESIZE),
 
+  CFG_MAP_STRING(dlep_radio_if, interf.session.cfg.peer_type, "peer_type", "OONF DLEP Radio",
+    "Identification string of DLEP radio endpoint"),
+
   CFG_MAP_NETADDR_V4(dlep_radio_if, interf.udp_config.multicast_v4, "discovery_mc_v4",
     DLEP_WELL_KNOWN_MULTICAST_ADDRESS, "IPv4 address to send discovery UDP packet to", false, false),
   CFG_MAP_NETADDR_V6(dlep_radio_if, interf.udp_config.multicast_v6, "discovery_mc_v6",
@@ -88,7 +91,7 @@ static struct cfg_schema_entry _radio_entries[] = {
     "Filter to determine the binding of the UDP discovery socket"),
 
   CFG_MAP_INT32_MINMAX(dlep_radio_if, tcp_config.port, "session_port",
-    "12345", "Server port for DLEP tcp sessions", 0, false, 1, 65535),
+      DLEP_WELL_KNOWN_SESSION_PORT_TXT, "Server port for DLEP tcp sessions", 0, false, 1, 65535),
   CFG_MAP_ACL_V46(dlep_radio_if, tcp_config.bindto, "session_bindto", "224.0.0.1\0fe80::/10",
       "Filter to determine the binding of the TCP server socket"),
   CFG_MAP_CLOCK_MINMAX(dlep_radio_if, interf.session.cfg.heartbeat_interval,
@@ -182,6 +185,7 @@ _cb_config_changed(void) {
   struct dlep_radio_if *interface;
   const char *ifname;
   char ifbuf[IF_NAMESIZE];
+  int error;
 
   ifname = cfg_get_phy_if(ifbuf, _radio_section.section_name);
 
@@ -201,10 +205,11 @@ _cb_config_changed(void) {
   }
 
   /* read configuration */
-  if (cfg_schema_tobin(interface, _radio_section.post,
-      _radio_entries, ARRAYSIZE(_radio_entries))) {
+  error = cfg_schema_tobin(interface, _radio_section.post,
+      _radio_entries, ARRAYSIZE(_radio_entries));
+  if (error) {
     OONF_WARN(LOG_DLEP_RADIO, "Could not convert "
-        OONF_DLEP_RADIO_SUBSYSTEM " config to bin");
+        OONF_DLEP_RADIO_SUBSYSTEM " config to bin (%d)", error);
     return;
   }
 
index 46a3e56..f0d665c 100644 (file)
@@ -211,6 +211,7 @@ dlep_radio_remove_interface(struct dlep_radio_if *interface) {
   avl_remove(&_interface_tree, &interface->interf._node);
 
   /* free memory */
+  free (interface->interf.session.cfg.peer_type);
   abuf_free(&interface->interf.udp_out);
   oonf_class_free(&_interface_class, interface);
 }
index 2f2ae7d..a9c5a5b 100644 (file)
@@ -133,7 +133,7 @@ _cb_incoming_tcp(struct oonf_stream_session *tcp_session) {
       &tcp_session->out, true, LOG_DLEP_RADIO)) {
     return -1;
   }
-  radio_session->session.restrict_signal = DLEP_PEER_INITIALIZATION;
+  radio_session->session.restrict_signal = DLEP_SESSION_INITIALIZATION;
   radio_session->session.cb_send_buffer = _cb_send_buffer;
   radio_session->session.cb_end_session = _cb_end_session;
   memcpy(&radio_session->session.cfg, &interface->interf.session.cfg,
index f8ae32a..fee79b5 100644 (file)
@@ -74,6 +74,9 @@ static void _cb_config_changed(void);
 
 /* configuration */
 static struct cfg_schema_entry _router_entries[] = {
+  CFG_MAP_STRING(dlep_router_if, interf.session.cfg.peer_type, "peer_type", "OONF DLEP Router",
+    "Identification string of DLEP router endpoint"),
+
   CFG_MAP_NETADDR_V4(dlep_router_if, interf.udp_config.multicast_v4, "discovery_mc_v4",
     DLEP_WELL_KNOWN_MULTICAST_ADDRESS, "IPv4 address to send discovery UDP packet to", false, false),
   CFG_MAP_NETADDR_V6(dlep_router_if, interf.udp_config.multicast_v6, "discovery_mc_v6",
index 570cbef..7578cf8 100644 (file)
@@ -204,6 +204,7 @@ dlep_router_remove_interface(struct dlep_router_if *interface) {
   dlep_if_remove(&interface->interf);
 
   /* remove session */
+  free (interface->interf.session.cfg.peer_type);
   avl_remove(&_interface_tree, &interface->interf._node);
   oonf_class_free(&_router_if_class, interface);
 }
index 5515645..6d2283d 100644 (file)
@@ -172,7 +172,7 @@ dlep_router_add_session(struct dlep_router_if *interf,
     dlep_router_remove_session(router_session);
     return NULL;
   }
-  router_session->session.restrict_signal = DLEP_PEER_INITIALIZATION_ACK;
+  router_session->session.restrict_signal = DLEP_SESSION_INITIALIZATION_ACK;
   router_session->session.cb_send_buffer = _cb_send_buffer;
   router_session->session.cb_end_session = _cb_end_session;
   memcpy(&router_session->session.cfg, &interf->interf.session.cfg,
index 4491b3c..dd4cd60 100644 (file)
@@ -95,8 +95,7 @@ static const struct oonf_layer2_metadata _oonf_layer2_metadata_neigh[OONF_LAYER2
   [OONF_LAYER2_NEIGH_TX_RETRIES]     = { .key = "tx_retries" },
   [OONF_LAYER2_NEIGH_TX_FAILED]      = { .key = "tx_failed" },
   [OONF_LAYER2_NEIGH_LATENCY]        = { .key = "latency", .unit = "s", .fraction = 6 },
-  [OONF_LAYER2_NEIGH_TX_RESOURCES]   = { .key = "tx_resources" },
-  [OONF_LAYER2_NEIGH_RX_RESOURCES]   = { .key = "rx_resources" },
+  [OONF_LAYER2_NEIGH_RESOURCES]      = { .key = "resources" },
   [OONF_LAYER2_NEIGH_TX_RLQ]         = { .key = "tx_rlq" },
   [OONF_LAYER2_NEIGH_RX_RLQ]         = { .key = "rx_rlq" },
 };
@@ -112,6 +111,7 @@ static const struct oonf_layer2_metadata _oonf_layer2_metadata_net[OONF_LAYER2_N
   [OONF_LAYER2_NET_CHANNEL_BUSY]    = { .key = "ch_busy", .unit="s", .fraction = 9 },
   [OONF_LAYER2_NET_CHANNEL_RX]      = { .key = "ch_rx", .unit="s", .fraction = 9 },
   [OONF_LAYER2_NET_CHANNEL_TX]      = { .key = "ch_tx", .unit="s", .fraction = 9 },
+  [OONF_LAYER2_NET_MTU]             = { .key = "mtu", .unit="byte" },
 };
 
 static const char *oonf_layer2_network_type[OONF_LAYER2_TYPE_COUNT] = {
index ff85d6a..a9cbf60 100644 (file)
@@ -134,6 +134,9 @@ enum oonf_layer2_network_index {
   /*! total time in ns the channel was transmitting */
   OONF_LAYER2_NET_CHANNEL_TX,
 
+  /*! maixmum size of an IP packet for this interface */
+  OONF_LAYER2_NET_MTU,
+
   /*! number of layer2 network metrics */
   OONF_LAYER2_NET_COUNT,
 };
@@ -196,11 +199,8 @@ enum oonf_layer2_neighbor_index {
   /*! latency to neighbor in microseconds */
   OONF_LAYER2_NEIGH_LATENCY,
 
-  /*! available transmission resources (0-100) */
-  OONF_LAYER2_NEIGH_TX_RESOURCES,
-
-  /*! available receiver resources (0-100) */
-  OONF_LAYER2_NEIGH_RX_RESOURCES,
+  /*! available resources of radio (0-100) */
+  OONF_LAYER2_NEIGH_RESOURCES,
 
   /*! relative transmission link quality (0-100) */
   OONF_LAYER2_NEIGH_TX_RLQ,