Small extensions for tcp streams and rfc5444
authorHenning Rogge <hrogge@gmail.com>
Sun, 7 Jun 2015 13:26:35 +0000 (15:26 +0200)
committerHenning Rogge <hrogge@gmail.com>
Sun, 7 Jun 2015 13:27:05 +0000 (15:27 +0200)
src-plugins/subsystems/oonf_rfc5444.c
src-plugins/subsystems/oonf_rfc5444.h
src-plugins/subsystems/oonf_stream_socket.c
src-plugins/subsystems/oonf_stream_socket.h

index 9aa2516..fe7e360 100644 (file)
@@ -288,7 +288,7 @@ _init(void) {
 
   oonf_class_add(&_interface_memcookie);
   _rfc5444_unicast = oonf_rfc5444_add_interface(
-      _rfc5444_protocol, NULL, RFC5444_UNICAST_TARGET);
+      _rfc5444_protocol, NULL, RFC5444_UNICAST_INTERFACE);
   if (_rfc5444_unicast == NULL) {
     _cleanup();
     return -1;
@@ -701,8 +701,8 @@ oonf_rfc5444_reconfigure_interface(struct oonf_rfc5444_interface *interf,
       interf->_socket_config.protocol);
 
   OONF_DEBUG(LOG_RFC5444, "compare: '%s' == '%s'",
-      interf->name, RFC5444_UNICAST_TARGET);
-  if (strcmp(interf->name, RFC5444_UNICAST_TARGET) == 0) {
+      interf->name, RFC5444_UNICAST_INTERFACE);
+  if (strcmp(interf->name, RFC5444_UNICAST_INTERFACE) == 0) {
     /* unicast interface */
     netaddr_invalidate(&interf->_socket_config.multicast_v4);
     netaddr_invalidate(&interf->_socket_config.multicast_v6);
index c99bcf8..e1ba8c9 100644 (file)
@@ -85,7 +85,7 @@ enum {
 #define RFC5444_PROTOCOL "rfc5444_default"
 
 /* Interface name for unicast targets */
-#define RFC5444_UNICAST_TARGET OONF_INTERFACE_WILDCARD
+#define RFC5444_UNICAST_INTERFACE OONF_INTERFACE_WILDCARD
 
 /* classes for elements of RFC5444 */
 #define RFC5444_CLASS_PROTOCOL  "RFC5444 protocol"
@@ -260,6 +260,17 @@ EXPORT enum rfc5444_result oonf_rfc5444_send_all(
 
 EXPORT void oonf_rfc5444_block_output(bool block);
 
+/**
+ * Flush a target and send out the message/packet immediately
+ * @param target rfc5444 target
+ * @param force true to force an empty packet if necessary, false will only
+ *   flush if a message is in the buffer
+ */
+static INLINE void
+oonf_rfc5444_flush_target(struct oonf_rfc5444_target *target, bool force) {
+  rfc5444_writer_flush(&target->interface->protocol->writer, &target->rfc5444_target, force);
+}
+
 /**
  * @param writer pointer to rfc5444 writer
  * @return pointer to rfc5444 target used by message
index ef878cf..b443f47 100644 (file)
@@ -821,6 +821,13 @@ _cb_parse_connection(int fd, void *data, bool event_read, bool event_write) {
     }
   }
 
+  /* check for buffer underrun */
+  if (session->state == STREAM_SESSION_ACTIVE
+      && abuf_getlen(&session->out) == 0
+      && s_sock->config.buffer_underrun != NULL) {
+    session->state = s_sock->config.buffer_underrun(session);
+  }
+
   if (abuf_getlen(&session->out) == 0) {
     /* nothing to send anymore */
     OONF_DEBUG(LOG_STREAM, "  deactivating output in scheduler\n");
index da30f90..e8a5b35 100644 (file)
@@ -162,6 +162,12 @@ struct oonf_stream_config {
    * Called when new data will be available in the input buffer
    */
   enum oonf_stream_session_state (*receive_data)(struct oonf_stream_session *);
+
+  /*
+   * Called when we could write to the buffer but it is empty
+   */
+  enum oonf_stream_session_state (*buffer_underrun)(struct oonf_stream_session *);
+
 };
 
 /*