Updates for the new outputbufferscheme
authorAndreas Tonnesen <andreto@olsr.org>
Thu, 18 Nov 2004 21:57:35 +0000 (21:57 +0000)
committerAndreas Tonnesen <andreto@olsr.org>
Thu, 18 Nov 2004 21:57:35 +0000 (21:57 +0000)
lib/secure/src/olsr_plugin_io.h
lib/secure/src/olsrd_plugin.c
lib/secure/src/olsrd_plugin.h
lib/secure/src/olsrd_secure.c

index 485422d..a778beb 100644 (file)
@@ -1,37 +1,25 @@
-
 /*
- * Secure OLSR plugin
- * http://www.olsr.org
+ * OLSR ad-hoc routing table management protocol
+ * Copyright (C) 2004 Andreas T√łnnesen (andreto@ifi.uio.no)
  *
- * Copyright (c) 2004, Andreas T√łnnesen(andreto@olsr.org)
- * All rights reserved.
+ * This file is part of the olsr.org OLSR daemon.
  *
- * Redistribution and use in source and binary forms, with or 
- * without modification, are permitted provided that the following 
- * conditions are met:
+ * olsr.org is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
  *
- * * Redistributions of source code must retain the above copyright 
- *   notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright 
- *   notice, this list of conditions and the following disclaimer in 
- *   the documentation and/or other materials provided with the 
- *   distribution.
- * * Neither the name of olsrd, olsr.org nor the names of its 
- *   contributors may be used to endorse or promote products derived 
- *   from this software without specific prior written permission.
+ * olsr.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
  *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
- *POSSIBILITY OF SUCH DAMAGE.
+ * You should have received a copy of the GNU General Public License
+ * along with olsr.org; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * 
+ * 
+ * $Id: olsr_plugin_io.h,v 1.3 2004/11/18 21:57:35 kattemat Exp $
  *
  */
 
  *                 interface struct.
  *                 Added GETF__ADD_IFCHGF and GETF__DEL_IFCHGF.
  *                 - Andreas
- *
+ *         0.4.8 : GETF__APM_READ added
+ *                 GETD__OLSR_CNF added
+ *                 GETD_PACKET removed
+ *                 GETD_MAXMESSAGESIZE removed
+ *                 GETD_OUTPUTSIZE removed
+ *                 GETF__NET_OUTBUFFER_PUSH added
+ *                 GETD__ROUTINGTABLE added
+ *                 GETD__HNA_ROUTES added
+ *                 GETD__MID_SET added
+ *                 GETF__NET_RESERVE_BUFSPACE added 
+ *                 GETF__NET_OUTBUFFER_PUSH_RESERVED added
+ *                 - Andreas
  */
 
 /*
 #ifndef _OLSR_PLUGIN_IO
 #define _OLSR_PLUGIN_IO
 
-/* Data fetching - starts at 100 */
-#define GETD__PACKET                               100                            
-#define GETD__OUTPUTSIZE                           101
+/* Data fetching - starts at 100 (used to anyway) */
 #define GETD__IFNET                                102
 #define GETD__NOW                                  103
 #define GETD__PARSER_ENTRIES                       104
 #define GETD__OLSR_SOCKET_ENTRIES                  105
-#define GETD__MAXMESSAGESIZE                       106
 #define GETD__NEIGHBORTABLE                        108
 #define GETD__TWO_HOP_NEIGHBORTABLE                109
 #define GETD__TC_TABLE                             110
 #define GETD__HNA_SET                              111
+#define GETD__OLSR_CNF                             112
+#define GETD__ROUTINGTABLE                         113
+#define GETD__HNA_ROUTES                           114
+#define GETD__MID_SET                              115
 
 /* Function fetching - starts at 500 */
 #define GETF__OLSR_REGISTER_SCHEDULER_EVENT        500
 #define GETF__OLSR_HASHING                         528
 #define GETF__ADD_IFCHGF                           529
 #define GETF__DEL_IFCHGF                           530
+#define GETF__APM_READ                             531
+#define GETF__NET_OUTBUFFER_PUSH                   532
+#define GETF__NET_RESERVE_BUFSPACE                 533
+#define GETF__NET_OUTBUFFER_PUSH_RESERVED          534
 
 #endif
index eac66eb..da711e2 100644 (file)
@@ -33,7 +33,7 @@
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
  * POSSIBILITY OF SUCH DAMAGE.
  *
- * $Id: olsrd_plugin.c,v 1.3 2004/11/06 16:43:54 kattemat Exp $
+ * $Id: olsrd_plugin.c,v 1.4 2004/11/18 21:57:35 kattemat Exp $
  */
 
 
@@ -178,35 +178,23 @@ fetch_olsrd_data()
   int retval = 1;
 
 
-  /* Olsr debug output function */
-  if(!olsr_plugin_io(GETD__OUTPUTSIZE, 
-                    &outputsize, 
-                    sizeof(outputsize)))
+  if(!olsr_plugin_io(GETF__NET_RESERVE_BUFSPACE, 
+                    &net_reserve_bufspace, 
+                    sizeof(net_reserve_bufspace)))
   {
-    outputsize = NULL;
+    net_reserve_bufspace = NULL;
     retval = 0;
   }
 
-  /* Olsr debug output function */
-  if(!olsr_plugin_io(GETD__MAXMESSAGESIZE, 
-                    &maxmessagesize, 
-                    sizeof(maxmessagesize)))
+  if(!olsr_plugin_io(GETF__NET_OUTBUFFER_PUSH_RESERVED, 
+                    &net_outbuffer_push_reserved, 
+                    sizeof(net_outbuffer_push_reserved)))
   {
-    maxmessagesize = NULL;
+    net_outbuffer_push_reserved = NULL;
     retval = 0;
   }
 
-  /* Olsr debug output function */
-  if(!olsr_plugin_io(GETD__PACKET, 
-                    &buffer, 
-                    sizeof(buffer)))
-  {
-    buffer = NULL;
-    retval = 0;
-  }
 
-
-  /* Olsr debug output function */
   if(!olsr_plugin_io(GETF__OLSR_PRINTF, 
                     &olsr_printf, 
                     sizeof(olsr_printf)))
@@ -215,7 +203,6 @@ fetch_olsrd_data()
     retval = 0;
   }
 
-  /* Olsr debug output function */
   if(!olsr_plugin_io(GETD__NOW, 
                     &now, 
                     sizeof(now)))
@@ -224,7 +211,6 @@ fetch_olsrd_data()
     retval = 0;
   }
 
-  /* Olsr debug output function */
   if(!olsr_plugin_io(GETF__NET_OUTPUT, 
                     &net_output, 
                     sizeof(net_output)))
@@ -275,20 +261,6 @@ fetch_olsrd_data()
     retval = 0;
   }
 
-  /* Add hna net IPv4 */
-  if(!olsr_plugin_io(GETF__ADD_LOCAL_HNA4_ENTRY, &add_local_hna4_entry, sizeof(add_local_hna4_entry)))
-  {
-    add_local_hna4_entry = NULL;
-    retval = 0;
-  }
-
-  /* Remove hna net IPv4 */
-  if(!olsr_plugin_io(GETF__REMOVE_LOCAL_HNA4_ENTRY, &remove_local_hna4_entry, sizeof(remove_local_hna4_entry)))
-  {
-    remove_local_hna4_entry = NULL;
-    retval = 0;
-  }
-
   /* Add packet transform function */
   if(!olsr_plugin_io(GETF__ADD_PTF, &add_ptf, sizeof(add_ptf)))
   {
index f687ab2..939e091 100644 (file)
@@ -33,7 +33,7 @@
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
  * POSSIBILITY OF SUCH DAMAGE.
  *
- * $Id: olsrd_plugin.h,v 1.3 2004/11/06 16:43:54 kattemat Exp $
+ * $Id: olsrd_plugin.h,v 1.4 2004/11/18 21:57:35 kattemat Exp $
  */
 
 
@@ -68,6 +68,8 @@
 /* The type of message you will use */
 #define MESSAGE_TYPE 10
 
+#define       MAXMESSAGESIZE          512
+
 /* The type of messages we will receive - can be set to promiscuous */
 #define PARSER_TYPE MESSAGE_TYPE
 
@@ -145,7 +147,6 @@ union hna_netmask
 
 #define MAXIFS         8 /* Maximum number of interfaces (from defs.h) in uOLSRd */
 
-#define        MAXMESSAGESIZE          512     /* max broadcast size */
 
 
 /****************************************************************************
@@ -430,18 +431,6 @@ int (*olsr_printf)(int, char *, ...);
 /* olsrd malloc wrapper */
 void *(*olsr_malloc)(size_t, const char *);
 
-/* Add hna net IPv4 */
-void (*add_local_hna4_entry)(union olsr_ip_addr *, union hna_netmask *);
-
-/* Remove hna net IPv4 */
-int (*remove_local_hna4_entry)(union olsr_ip_addr *, union hna_netmask *);
-
-/* Add hna net IPv6 */
-void (*add_local_hna6_entry)(union olsr_ip_addr *, union hna_netmask *);
-
-/* Remove hna net IPv6 */
-int (*remove_local_hna6_entry)(union olsr_ip_addr *, union hna_netmask *);
-
 /* Add a packet transform function */
 int (*add_ptf)(int(*)(char *, int *));
 
@@ -466,6 +455,9 @@ int (*add_ifchgf)(int(*)(struct interface *, int));
 /* Remove an ifchange function */
 int (*del_ifchgf)(int(*)(struct interface *, int));
 
+int (*net_reserve_bufspace)(struct interface *, int);
+
+int (*net_outbuffer_push_reserved)(struct interface *, olsr_u8_t *, olsr_u16_t);
 
 
 /****************************************************************************
@@ -488,10 +480,6 @@ union olsr_ip_addr *main_addr; /* Main address */
 size_t             ipsize;     /* Size of the ipadresses used */
 struct timeval     *now;       /* the olsrds schedulers idea of current time */
 
-/* Data that can be altered by your plugin */
-char               *buffer;    /* The packet buffer - put your packet here */
-int                *outputsize;/* Pointer to the outputsize - set the size of your packet here */
-int                *maxmessagesize;
 
 /****************************************************************************
  *                Functions that the plugin MUST provide                    *
index 002c86f..d8235de 100644 (file)
@@ -33,7 +33,7 @@
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
  * POSSIBILITY OF SUCH DAMAGE.
  *
- * $Id: olsrd_secure.c,v 1.3 2004/11/06 16:43:54 kattemat Exp $
+ * $Id: olsrd_secure.c,v 1.4 2004/11/18 21:57:35 kattemat Exp $
  */
 
 
@@ -99,17 +99,12 @@ olsr_plugin_init()
       remove_olsr_socket(ints->olsr_socket, olsr_input);
       add_olsr_socket(ints->olsr_socket, &packet_parser);
      
-      /* XXX Fix maxsize */
-
+      /* Reducing maxmessagesize */
+      net_reserve_bufspace(ints, sizeof(struct olsrmsg));
 
       ints = ints->int_next;
     }
 
-  /* Reducing maxmessagesize */
-
-  *maxmessagesize -= sizeof(struct olsrmsg);
-
-  printf("Maxmessagesize is now: %d\n", *maxmessagesize);
   /* Register timeout - poll every 2 seconds */
   olsr_register_scheduler_event(&timeout_timestamps, 2, 0 , NULL);
 
@@ -614,56 +609,54 @@ check_timestamp(union olsr_ip_addr *originator, time_t tstamp)
 int
 send_challenge(union olsr_ip_addr *new_host)
 {
-  struct challengemsg *cmsg;
+  struct challengemsg cmsg;
   struct stamp *entry;
   olsr_u32_t challenge, hash;
 
   olsr_printf(1, "[ENC]Building CHALLENGE message\n");
 
-  cmsg = (struct challengemsg *)&buffer[4];
   /* Set the size including OLSR packet size */
-  *outputsize = sizeof(struct challengemsg) + 4;
 
 
   challenge = rand() << 16;
   challenge |= rand();
 
   /* Fill challengemessage */
-  cmsg->olsr_msgtype = TYPE_CHALLENGE;
-  cmsg->olsr_vtime = 0;
-  cmsg->olsr_msgsize = htons(sizeof(struct challengemsg));
-  memcpy(&cmsg->originator, main_addr, ipsize);
-  cmsg->ttl = 1;
-  cmsg->hopcnt = 0;
-  cmsg->seqno = htons(get_msg_seqno());
+  cmsg.olsr_msgtype = TYPE_CHALLENGE;
+  cmsg.olsr_vtime = 0;
+  cmsg.olsr_msgsize = htons(sizeof(struct challengemsg));
+  memcpy(&cmsg.originator, main_addr, ipsize);
+  cmsg.ttl = 1;
+  cmsg.hopcnt = 0;
+  cmsg.seqno = htons(get_msg_seqno());
 
   /* Fill subheader */
-  memcpy(&cmsg->destination, new_host, ipsize);
-  cmsg->challenge = htonl(challenge);
+  memcpy(&cmsg.destination, new_host, ipsize);
+  cmsg.challenge = htonl(challenge);
 
   olsr_printf(3, "[ENC]Size: %d\n", sizeof(struct challengemsg));
 
   /* Create packet + key cache */
   /* First the OLSR packet + signature message - digest */
-  memcpy(checksum_cache, cmsg, sizeof(struct challengemsg) - SIGNATURE_SIZE);
+  memcpy(checksum_cache, &cmsg, sizeof(struct challengemsg) - SIGNATURE_SIZE);
   /* Then the key */
   memcpy(&checksum_cache[sizeof(struct challengemsg) - SIGNATURE_SIZE], aes_key, KEYLENGTH);
 
   /* Create the SHA1 hash */
   SHA1(checksum_cache, 
        (sizeof(struct challengemsg) - SIGNATURE_SIZE) + KEYLENGTH, 
-       cmsg->signature);
+       cmsg.signature);
 
   olsr_printf(3, "[ENC]Sending timestamp request to %s challenge 0x%x\n", 
              olsr_ip_to_string(new_host),
              challenge);
 
-  /* Send the request */
+  /* Add to buffer */
+  net_outbuffer_push(olsr_in_if, (olsr_u8_t *)&cmsg, sizeof(struct challengemsg));
 
+  /* Send the request */
   net_output(olsr_in_if);
 
-  *outputsize = 0;
-
   /* Create new entry */
   entry = malloc(sizeof(struct stamp));
   
@@ -977,16 +970,11 @@ parse_challenge(char *in_msg)
 int
 send_cres(union olsr_ip_addr *to, union olsr_ip_addr *from, olsr_u32_t chal_in, struct stamp *entry)
 {
-  struct c_respmsg *crmsg;
+  struct c_respmsg crmsg;
   olsr_u32_t challenge;
 
   olsr_printf(1, "[ENC]Building CRESPONSE message\n");
 
-  crmsg = (struct c_respmsg *)&buffer[4];
-  /* Set the size including OLSR packet size */
-  *outputsize = sizeof(struct c_respmsg) + 4;
-
-
   challenge = rand() << 16;
   challenge |= rand();
 
@@ -995,21 +983,21 @@ send_cres(union olsr_ip_addr *to, union olsr_ip_addr *from, olsr_u32_t chal_in,
   olsr_printf(3, "[ENC]Challenge-response: 0x%x\n", challenge);
 
   /* Fill challengemessage */
-  crmsg->olsr_msgtype = TYPE_CRESPONSE;
-  crmsg->olsr_vtime = 0;
-  crmsg->olsr_msgsize = htons(sizeof(struct c_respmsg));
-  memcpy(&crmsg->originator, main_addr, ipsize);
-  crmsg->ttl = 1;
-  crmsg->hopcnt = 0;
-  crmsg->seqno = htons(get_msg_seqno());
+  crmsg.olsr_msgtype = TYPE_CRESPONSE;
+  crmsg.olsr_vtime = 0;
+  crmsg.olsr_msgsize = htons(sizeof(struct c_respmsg));
+  memcpy(&crmsg.originator, main_addr, ipsize);
+  crmsg.ttl = 1;
+  crmsg.hopcnt = 0;
+  crmsg.seqno = htons(get_msg_seqno());
 
   /* set timestamp */
-  crmsg->timestamp = now->tv_sec;
-  olsr_printf(3, "[ENC]Timestamp %d\n", crmsg->timestamp);
+  crmsg.timestamp = now->tv_sec;
+  olsr_printf(3, "[ENC]Timestamp %d\n", crmsg.timestamp);
 
   /* Fill subheader */
-  memcpy(&crmsg->destination, to, ipsize);
-  crmsg->challenge = htonl(challenge);
+  memcpy(&crmsg.destination, to, ipsize);
+  crmsg.challenge = htonl(challenge);
 
   /* Create digest of received challenge + IP */
 
@@ -1022,32 +1010,31 @@ send_cres(union olsr_ip_addr *to, union olsr_ip_addr *from, olsr_u32_t chal_in,
   /* Create the SHA1 hash */
   SHA1(checksum_cache, 
        sizeof(olsr_u32_t) + ipsize, 
-       crmsg->res_sig);
+       crmsg.res_sig);
 
 
   /* Now create the digest of the message and the key */
 
   /* Create packet + key cache */
   /* First the OLSR packet + signature message - digest */
-  memcpy(checksum_cache, crmsg, sizeof(struct c_respmsg) - SIGNATURE_SIZE);
+  memcpy(checksum_cache, &crmsg, sizeof(struct c_respmsg) - SIGNATURE_SIZE);
   /* Then the key */
   memcpy(&checksum_cache[sizeof(struct c_respmsg) - SIGNATURE_SIZE], aes_key, KEYLENGTH);
 
   /* Create the SHA1 hash */
   SHA1(checksum_cache, 
        (sizeof(struct c_respmsg) - SIGNATURE_SIZE) + KEYLENGTH, 
-       crmsg->signature);
+       crmsg.signature);
 
   olsr_printf(3, "[ENC]Sending challenge response to %s challenge 0x%x\n", 
              olsr_ip_to_string(to),
              challenge);
 
+  /* Add to buffer */
+  net_outbuffer_push(olsr_in_if, &crmsg, sizeof(struct c_respmsg));
   /* Send the request */
-
   net_output(olsr_in_if);
 
-  *outputsize = 0;
-
   return 1;
 }
 
@@ -1064,30 +1051,26 @@ send_cres(union olsr_ip_addr *to, union olsr_ip_addr *from, olsr_u32_t chal_in,
 int
 send_rres(union olsr_ip_addr *to, union olsr_ip_addr *from, olsr_u32_t chal_in)
 {
-  struct r_respmsg *rrmsg;
+  struct r_respmsg rrmsg;
 
   olsr_printf(1, "[ENC]Building RRESPONSE message\n");
 
-  rrmsg = (struct r_respmsg *)&buffer[4];
-  /* Set the size including OLSR packet size */
-  *outputsize = sizeof(struct r_respmsg) + 4;
-
 
   /* Fill challengemessage */
-  rrmsg->olsr_msgtype = TYPE_RRESPONSE;
-  rrmsg->olsr_vtime = 0;
-  rrmsg->olsr_msgsize = htons(sizeof(struct r_respmsg));
-  memcpy(&rrmsg->originator, main_addr, ipsize);
-  rrmsg->ttl = 1;
-  rrmsg->hopcnt = 0;
-  rrmsg->seqno = htons(get_msg_seqno());
+  rrmsg.olsr_msgtype = TYPE_RRESPONSE;
+  rrmsg.olsr_vtime = 0;
+  rrmsg.olsr_msgsize = htons(sizeof(struct r_respmsg));
+  memcpy(&rrmsg.originator, main_addr, ipsize);
+  rrmsg.ttl = 1;
+  rrmsg.hopcnt = 0;
+  rrmsg.seqno = htons(get_msg_seqno());
 
   /* set timestamp */
-  rrmsg->timestamp = now->tv_sec;
-  olsr_printf(3, "[ENC]Timestamp %d\n", rrmsg->timestamp);
+  rrmsg.timestamp = now->tv_sec;
+  olsr_printf(3, "[ENC]Timestamp %d\n", rrmsg.timestamp);
 
   /* Fill subheader */
-  memcpy(&rrmsg->destination, to, ipsize);
+  memcpy(&rrmsg.destination, to, ipsize);
 
   /* Create digest of received challenge + IP */
 
@@ -1100,31 +1083,31 @@ send_rres(union olsr_ip_addr *to, union olsr_ip_addr *from, olsr_u32_t chal_in)
   /* Create the SHA1 hash */
   SHA1(checksum_cache, 
        sizeof(olsr_u32_t) + ipsize, 
-       rrmsg->res_sig);
+       rrmsg.res_sig);
 
 
   /* Now create the digest of the message and the key */
 
   /* Create packet + key cache */
   /* First the OLSR packet + signature message - digest */
-  memcpy(checksum_cache, rrmsg, sizeof(struct r_respmsg) - SIGNATURE_SIZE);
+  memcpy(checksum_cache, &rrmsg, sizeof(struct r_respmsg) - SIGNATURE_SIZE);
   /* Then the key */
   memcpy(&checksum_cache[sizeof(struct r_respmsg) - SIGNATURE_SIZE], aes_key, KEYLENGTH);
 
   /* Create the SHA1 hash */
   SHA1(checksum_cache, 
        (sizeof(struct r_respmsg) - SIGNATURE_SIZE) + KEYLENGTH, 
-       rrmsg->signature);
+       rrmsg.signature);
 
   olsr_printf(3, "[ENC]Sending response response to %s\n", 
              olsr_ip_to_string(to));
 
-  /* Send the request */
+  /* add to buffer */
+  net_outbuffer_push(olsr_in_if, &rrmsg, sizeof(struct r_respmsg));
 
+  /* Send the request */
   net_output(olsr_in_if);
 
-  *outputsize = 0;
-
   return 1;
 }