Some quick updated to make thes plugin work with the new interface and the new output...
authorAndreas Tonnesen <andreto@olsr.org>
Sun, 7 Nov 2004 10:54:19 +0000 (10:54 +0000)
committerAndreas Tonnesen <andreto@olsr.org>
Sun, 7 Nov 2004 10:54:19 +0000 (10:54 +0000)
lib/powerinfo/Makefile
lib/powerinfo/README_POWER
lib/powerinfo/src/olsr_plugin_io.h
lib/powerinfo/src/olsrd_plugin.c
lib/powerinfo/src/olsrd_plugin.h
lib/powerinfo/src/olsrd_power.c
lib/powerinfo/src/olsrd_power.h

index 48892ab..22931e1 100644 (file)
@@ -6,7 +6,7 @@
 #Alter this file to fit your needs
 
 CC ?= gcc
-NAME ?= olsrd_power.so.0.1
+NAME ?= olsrd_power.so.0.3
 LIBDIR ?= $(INSTALL_PREFIX)/usr/lib
 # -fPIC creates position independent code
 MYFLAGS ?= -Wall -fPIC -g # Uncomment -g for debugging
index 3c94a64..6eca43b 100644 (file)
@@ -21,7 +21,7 @@ plugins for the UniK olsr daemon.
 It gathers powerifno from the local node by polling
 the /proc/apm pseudofile. So to diffuse powerinfo
 about a node it needs to have APM enabled.
-All powerinfo is gathered in a database en you
+All powerinfo is gathered in a database and you
 can wiev the output by telneting to 127.0.0.1
 port 8888 on the local machine.
 
index 5e74e9c..277d1d0 100644 (file)
@@ -2,24 +2,24 @@
  * OLSR ad-hoc routing table management protocol
  * Copyright (C) 2004 Andreas T√łnnesen (andreto@ifi.uio.no)
  *
- * This file is part of olsrd-unik.
+ * This file is part of the olsr.org OLSR daemon.
  *
- * UniK olsrd is free software; you can redistribute it and/or modify
+ * 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.
  *
- * UniK olsrd is distributed in the hope that it will be useful,
+ * 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.
  *
  * You should have received a copy of the GNU General Public License
- * along with olsrd-unik; if not, write to the Free Software
+ * 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/09/21 19:08:57 kattemat Exp $
+ * $Id: olsr_plugin_io.h,v 1.4 2004/11/07 10:54:18 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
+ *                 - 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
 
 /* 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
 
 #endif
index 0f6c645..0e633be 100644 (file)
@@ -29,6 +29,9 @@
  *
  */
 
+/* $Id: olsrd_plugin.c,v 1.2 2004/11/07 10:54:19 kattemat Exp $ */
+
+
 /*
  * Dynamic linked library example for UniK OLSRd
  */
@@ -66,11 +69,14 @@ int
 fetch_olsrd_data();
 
 /*
- * Defines the version of the plugin interface that is used
+ * Returns the version of the plugin interface that is used
  * THIS IS NOT THE VERSION OF YOUR PLUGIN!
- * Do not alter unless you know what you are doing!
  */
-int plugin_interface_version;
+int 
+get_plugin_interface_version()
+{
+  return PLUGIN_INTERFACE_VERSION;
+}
 
 /**
  *Constructor
@@ -80,8 +86,6 @@ my_init()
 {
   /* Print plugin info to stdout */
   printf("%s\n", MOD_DESC);
-  /* Set interface version */
-  plugin_interface_version = PLUGIN_INTERFACE_VERSION;
 
   ifs = NULL;
 
@@ -170,16 +174,9 @@ fetch_olsrd_data()
 
 
   /* Packet buffer */
-  if(!olsr_plugin_io(GETD__PACKET, &buffer, sizeof(buffer)))
+  if(!olsr_plugin_io(GETF__NET_OUTBUFFER_PUSH, &net_outbuffer_push, sizeof(net_outbuffer_push)))
   {
-    buffer = NULL;
-    retval = 0;
-  }
-
-  /* Packet buffer size */
-  if(!olsr_plugin_io(GETD__OUTPUTSIZE, &outputsize, sizeof(outputsize)))
-  {
-    outputsize = NULL;
+    net_outbuffer_push = NULL;
     retval = 0;
   }
 
@@ -300,14 +297,6 @@ fetch_olsrd_data()
     retval = 0;
   }
 
-
-  /* Remove socket from OLSR select function */
-  if(!olsr_plugin_io(GETF__REMOVE_OLSR_SOCKET, &remove_olsr_socket, sizeof(remove_olsr_socket)))
-  {
-    remove_olsr_socket = NULL;
-    retval = 0;
-  }
-
   /* Neighbor link status lookup */
   if(!olsr_plugin_io(GETF__CHECK_NEIGHBOR_LINK, &check_neighbor_link, sizeof(check_neighbor_link)))
   {
@@ -316,6 +305,13 @@ fetch_olsrd_data()
   }
 
 
+  /* Apm info */
+  if(!olsr_plugin_io(GETF__APM_READ, &apm_read, sizeof(apm_read)))
+  {
+    apm_read = NULL;
+    retval = 0;
+  }
+
   return retval;
 
 }
index acd0396..e360a97 100644 (file)
@@ -29,6 +29,8 @@
  *
  */
 
+/* $Id: olsrd_plugin.h,v 1.3 2004/11/07 10:54:19 kattemat Exp $ */
+
 /*
  * Dynamic linked library example for UniK OLSRd
  */
  *****************************************************************************/
 
 #define PLUGIN_NAME    "OLSRD Powerstatus plugin"
-#define PLUGIN_VERSION "0.1"
+#define PLUGIN_VERSION "0.3"
 #define PLUGIN_AUTHOR   "Andreas T√łnnesen"
 #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR
-#define PLUGIN_INTERFACE_VERSION 1
+#define PLUGIN_INTERFACE_VERSION 2
 
 /* The type of message you will use */
 #define MESSAGE_TYPE 128
@@ -99,11 +101,6 @@ union olsr_ip_addr
   struct in6_addr v6;
 };
 
-union hna_netmask
-{
-  olsr_u32_t v4;
-  olsr_u16_t v6;
-};
 
 #define MAX_TTL               0xff
 
@@ -120,12 +117,6 @@ union hna_netmask
 #define MAX_LINK              4
 
 
-/*
- * Mantissa scaling factor
- */
-
-#define VTIME_SCALE_FACTOR    0.0625
-
 
 /*
  * Hashing
@@ -140,6 +131,13 @@ union hna_netmask
 /****************************************************************************
  *                          INTERFACE SECTION                               *
  ****************************************************************************/
+struct vtimes
+{
+  olsr_u8_t hello;
+  olsr_u8_t tc;
+  olsr_u8_t mid;
+  olsr_u8_t hna;
+};
 
 /**
  *A struct containing all necessary information about each
@@ -157,18 +155,37 @@ struct interface
   /* IP independent */
   union         olsr_ip_addr ip_addr;
   int           olsr_socket;                    /* The broadcast socket for this interface */
-  int          int_metric;                     /* init's routing entry */
+  int          int_metric;                     /* metric of interface */
   int           int_mtu;                        /* MTU of interface */
   int          int_flags;                      /* see below */
   char         *int_name;                      /* from kernel if structure */
   int           if_index;                       /* Kernels index of this interface */
-  int           if_nr;                          /* This interfaces number internally*/
+  int           if_nr;                          /* This interfaces index internally*/
   int           is_wireless;                    /* wireless interface or not*/
-  olsr_u16_t    olsr_seqnum;                    /* Sequence numbers*/
+  olsr_u16_t    olsr_seqnum;                    /* Olsr message seqno */
+
+  float         hello_etime;
+  struct        vtimes valtimes;
+
   struct       interface *int_next;
 };
 
 
+
+
+/****************************************************************************
+ *                        POWERSTATUS SECTION                               *
+ ****************************************************************************/
+
+#define OLSR_BATTERY_POWERED  0
+#define OLSR_AC_POWERED       1
+
+struct olsr_apm_info
+{
+  int ac_line_status;
+  int battery_percentage;
+};
+
 /****************************************************************************
  *                            PACKET SECTION                                *
  ****************************************************************************/
@@ -223,26 +240,6 @@ struct olsrmsg6
 
 };
 
-/*
- * Generic OLSR packet - DO NOT ALTER
- */
-
-struct olsr 
-{
-  olsr_u16_t     olsr_packlen;         /* packet length */
-  olsr_u16_t     olsr_seqno;
-  struct olsrmsg  olsr_msg[1];          /* variable messages */
-};
-
-
-struct olsr6
-{
-  olsr_u16_t       olsr_packlen;        /* packet length */
-  olsr_u16_t       olsr_seqno;
-  struct olsrmsg6   olsr_msg[1];         /* variable messages */
-};
-
-
 /* 
  * ALWAYS USE THESE WRAPPERS TO
  * ENSURE IPv4 <-> IPv6 compability 
@@ -254,11 +251,7 @@ union olsr_message
   struct olsrmsg6 v6;
 };
 
-union olsr_packet
-{
-  struct olsr v4;
-  struct olsr6 v6;
-};
+
 
 
 /***************************************************************************
@@ -296,18 +289,19 @@ olsr_ip_to_string(union olsr_ip_addr *);
 int (*olsr_plugin_io)(int, void *, size_t);
 
 /* add a prser function */
-void (*olsr_parser_add_function)(void (*)(union olsr_message *, struct interface *, union olsr_ip_addr *), 
-                                int, int);
+void (*olsr_parser_add_function)(void (*)(union olsr_message *, struct interface *, union olsr_ip_addr *), int, int);
 
 /* Register a timeout function */
 int (*olsr_register_timeout_function)(void (*)());
 
 /* Register a scheduled event */
-int (*olsr_register_scheduler_event)(void (*)(), float, float, olsr_u8_t *);
+int (*olsr_register_scheduler_event)(void (*)(), void *, float, float, olsr_u8_t *);
 
 /* Get the next message seqno in line */
 olsr_u16_t (*get_msg_seqno)();
 
+int (*net_outbuffer_push)(struct interface *, olsr_u8_t *, olsr_u16_t);
+
 /* Transmit package */
 int (*net_output)(struct interface*);
 
@@ -324,9 +318,6 @@ int (*default_fwd)(union olsr_message *,
 /* Add a socket to the main olsrd select loop */
 void (*add_olsr_socket)(int, void(*)(int));
 
-/* Remove a socket from the main olsrd select loop */
-int (*remove_olsr_socket)(int, void(*)(int));
-
 /* get the link status to a neighbor */
 int (*check_neighbor_link)(union olsr_ip_addr *);
 
@@ -341,17 +332,7 @@ 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 *);
+int (*apm_read)(struct olsr_apm_info *);
 
 
 /****************************************************************************
@@ -374,10 +355,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 */
-
 
 /****************************************************************************
  *                Functions that the plugin MUST provide                    *
@@ -400,4 +377,8 @@ olsr_plugin_exit();
 int
 plugin_io(int, void *, size_t);
 
+/* Plugin interface version */
+int 
+get_plugin_interface_version();
+
 #endif
index 09f4ca5..3460258 100644 (file)
@@ -29,6 +29,8 @@
  *
  */
 
+/* $Id: olsrd_power.c,v 1.2 2004/11/07 10:54:19 kattemat Exp $ */
+
 /*
  * Dynamic linked library example for UniK OLSRd
  */
@@ -85,7 +87,7 @@ olsr_plugin_init()
 
   olsr_register_timeout_function(&olsr_timeout);
 
-  olsr_register_scheduler_event(&olsr_event, EMISSION_INTERVAL, 0, NULL);
+  olsr_register_scheduler_event(&olsr_event, NULL, EMISSION_INTERVAL, 0, NULL);
 
   return 1;
 }
@@ -240,10 +242,9 @@ olsr_timeout()
  *Scheduled event
  */
 void
-olsr_event()
+olsr_event(void *foo)
 {
-  union olsr_packet *packet;
-  union olsr_message *message;
+  union olsr_message *message = (union olsr_message*)buffer;
   struct interface *ifn;
 
   /* If we can't produce power info we do nothing */ 
@@ -252,16 +253,6 @@ olsr_event()
 
   olsr_printf(3, "PLUG-IN: Generating package - ");
 
-  /* Cast the char* buffer to the packetformat */
-  packet = (union olsr_packet*)buffer;
-
-  /* Fetch the message based on IPversion */
-  if(ipversion == AF_INET)
-    message = (union olsr_message *)packet->v4.olsr_msg;
-  else
-    message = (union olsr_message *)packet->v6.olsr_msg;
-
-
   /* looping trough interfaces */
   for (ifn = ifs; ifn ; ifn = ifn->int_next) 
     {
@@ -279,9 +270,16 @@ olsr_event()
          message->v4.seqno = htons(get_msg_seqno());
          
          get_powerstatus(&message->v4.msg);
-         
-         *outputsize = sizeof(struct olsrmsg) + sizeof(olsr_u32_t);
-         packet->v4.olsr_packlen = htons(*outputsize);
+
+         if(net_outbuffer_push(ifn, (olsr_u8_t *)message, sizeof(struct olsrmsg)) != sizeof(struct olsrmsg))
+           {
+
+             /* Send data and try again */
+             net_output(ifn);
+             if(net_outbuffer_push(ifn, (olsr_u8_t *)message, sizeof(struct olsrmsg)) != sizeof(struct olsrmsg))
+               olsr_printf(1, "Powerplugin: could not write to buffer for interface: %s\n", ifn->int_name);
+           }
+
        }
       else
        {
@@ -295,15 +293,19 @@ olsr_event()
          message->v6.seqno = htons(get_msg_seqno());
          
          get_powerstatus(&message->v6.msg);
-         
-         *outputsize = sizeof(struct olsrmsg6) + sizeof(olsr_u32_t);
-         packet->v6.olsr_packlen = htons(*outputsize);
+
+         if(net_outbuffer_push(ifn, (olsr_u8_t *)message, sizeof(struct olsrmsg6)) != sizeof(struct olsrmsg6))
+           {
+             /* Send data and try again */
+             net_output(ifn);
+             if(net_outbuffer_push(ifn, (olsr_u8_t *)message, sizeof(struct olsrmsg6)) != sizeof(struct olsrmsg6))
+               olsr_printf(1, "Powerplugin: could not write to buffer for interface: %s\n", ifn->int_name);
+           }
+
        }
 
-      /* Send data */
-      net_output(ifn);
     }
-  olsr_printf(3, "\n");
+  olsr_printf(2, "\n");
 
   /* Try to set up IPC socket if not already up */
   if(!ipc_open)
@@ -417,7 +419,7 @@ update_power_entry(union olsr_ip_addr *originator, struct powermsg *message, dou
 
   olsr_printf(1, "New power entry %s: ", olsr_ip_to_string(originator));
 
-  if(message->source_type == SOURCE_BATTERY)
+  if(message->source_type == OLSR_BATTERY_POWERED)
     olsr_printf(1, "BATTERY P: %d%% T: %d mins\n",
           message->percentage,
           message->time_left);
@@ -471,7 +473,7 @@ print_power_table()
        sprintf(buf, "[%s]: ", olsr_ip_to_string(&entry->originator));
        ipc_send(buf, strlen(buf));
 
-       if(entry->source_type == SOURCE_BATTERY)
+       if(entry->source_type == OLSR_BATTERY_POWERED)
          {
            sprintf(buf,
                    "BATTERY P: %d%% T: %d mins\n",
@@ -524,15 +526,15 @@ get_powerstatus(struct powermsg *msg)
 
   if(apm_info.ac_line_status)
     {
-      msg->source_type = SOURCE_AC;
+      msg->source_type = OLSR_AC_POWERED;
       msg->percentage = 0;
       msg->time_left = 0;
     }
   else
     {
-      msg->source_type = SOURCE_BATTERY;
-      msg->percentage = apm_info.battery_percentage;
-      msg->time_left = apm_info.battery_time;
+      msg->source_type = OLSR_BATTERY_POWERED;
+      msg->percentage = apm_info.ac_line_status;
+      msg->time_left = 0;
     }
 
   return 1;
@@ -541,71 +543,6 @@ get_powerstatus(struct powermsg *msg)
 
 
 
-
-
-int
-apm_read(struct olsr_apm_info *ainfo)
-{
-  char buffer[100];
-  char units[10];
-  FILE *apm_procfile;
-
-  /* Open procfile */
-  if((apm_procfile = fopen(APM_PROC, "r")) == NULL)
-    return -1;
-
-
-  fgets(buffer, sizeof(buffer) - 1, apm_procfile);
-  if(buffer == NULL)
-    {
-      /* Try re-opening the file */
-      if((apm_procfile = fopen(APM_PROC, "r")) < 0)
-       return -1;
-      fgets(buffer, sizeof(buffer) - 1, apm_procfile);
-      if(buffer == NULL)
-       {
-         /* Giving up */
-         fprintf(stderr, "OLSRD-POWER: Could not read APM info");
-         return -1;
-       }
-    }
-
-  buffer[sizeof(buffer) - 1] = '\0';
-
-
-  /* Get the info */
-  sscanf(buffer, "%s %d.%d %x %x %x %x %d%% %d %s\n",
-        ainfo->driver_version,
-        &ainfo->apm_version_major,
-        &ainfo->apm_version_minor,
-        &ainfo->apm_flags,
-        &ainfo->ac_line_status,
-        &ainfo->battery_status,
-        &ainfo->battery_flags,
-        &ainfo->battery_percentage,
-        &ainfo->battery_time,
-        units);
-
-  ainfo->using_minutes = !strncmp(units, "min", 3) ? 1 : 0;
-
-  /*
-   * Should take care of old APM type info here
-   */
-
-  /*
-   * Fix possible percentage error
-   */
-  if(ainfo->battery_percentage > 100)
-    ainfo->battery_percentage = -1;
-
-  fclose(apm_procfile);
-
-  return 0;
-}
-
-
-
-
 /*************************************************************
  *                 TOOLS DERIVED FROM OLSRD                  *
  *************************************************************/
index 0125aea..6c795fb 100644 (file)
@@ -59,31 +59,11 @@ struct pwrentry
 struct pwrentry list[HASHSIZE];
 
 
-#define SOURCE_AC      0
-#define SOURCE_BATTERY 1
-
 int has_apm;
 
-#define APM_PROC "/proc/apm"
-
-
-struct olsr_apm_info
-{
-  char driver_version[10];
-  int apm_version_major;
-  int apm_version_minor;
-  int apm_flags;
-  int ac_line_status;
-  int battery_status;
-  int battery_flags;
-  int battery_percentage;
-  int battery_time;
-  int using_minutes;
-};
+/* set buffer to size of IPv6 message */
+static char buffer[sizeof(struct olsrmsg6)];
 
-/*
- * "Private" functions.
- */
 
 /* Timeout function to register with the sceduler */
 void
@@ -95,10 +75,7 @@ olsr_parser(union olsr_message *, struct interface *, union olsr_ip_addr *);
 
 /* Event function to register with the sceduler */
 void
-olsr_event();
-
-int 
-apm_read(struct olsr_apm_info *);
+olsr_event(void *);
 
 void
 ipc_action(int fd);