Initial addittion of pgraph plugin
authorAndreas Tonnesen <andreto@olsr.org>
Wed, 13 Jul 2005 21:45:50 +0000 (21:45 +0000)
committerAndreas Tonnesen <andreto@olsr.org>
Wed, 13 Jul 2005 21:45:50 +0000 (21:45 +0000)
Makefile
lib/pgraph/Makefile [new file with mode: 0644]
lib/pgraph/README-OLSR [new file with mode: 0755]
lib/pgraph/src/olsrd_pgraph.c [new file with mode: 0755]
lib/pgraph/src/olsrd_pgraph.h [new file with mode: 0755]
lib/pgraph/src/olsrd_plugin.c [new file with mode: 0755]
lib/pgraph/version-script.txt [new file with mode: 0755]

index 84730a6..e83766f 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -35,7 +35,7 @@
 # to the project. For more information see the website or contact
 # the copyright holders.
 #
-# $Id: Makefile,v 1.64 2005/06/05 15:16:49 kattemat Exp $
+# $Id: Makefile,v 1.65 2005/07/13 21:45:50 kattemat Exp $
 
 TOPDIR = .
 include Makefile.inc
@@ -154,5 +154,10 @@ secure:
                $(MAKE) -C lib/secure
                $(MAKE) -C lib/secure install
 
+pgraph:
+               $(MAKE) -C lib/pgraph clean
+               $(MAKE) -C lib/pgraph 
+               $(MAKE) -C lib/pgraph install 
+
 build_all:     cfgparser olsrd libs
 install_all:   install install_libs
diff --git a/lib/pgraph/Makefile b/lib/pgraph/Makefile
new file mode 100644 (file)
index 0000000..1803ae5
--- /dev/null
@@ -0,0 +1,57 @@
+# The olsr.org Optimized Link-State Routing daemon(olsrd)
+# Copyright (c) 2004, Andreas Tønnesen(andreto@olsr.org)
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without 
+# modification, are permitted provided that the following conditions 
+# are met:
+#
+# * 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 olsr.org, olsrd nor the names of its 
+#   contributors may be used to endorse or promote products derived 
+#   from this software without specific prior written permission.
+#
+# 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.
+#
+# Visit http://www.olsr.org for more information.
+#
+# If you find this software useful feel free to make a donation
+# to the project. For more information see the website or contact
+# the copyright holders.
+#
+# $Id: Makefile,v 1.1 2005/07/13 21:45:07 kattemat Exp $
+
+OLSRD_PLUGIN = true
+PLUGIN_NAME =  olsrd_pgraph
+PLUGIN_VER =   1.1
+
+TOPDIR = ../..
+include $(TOPDIR)/Makefile.inc
+
+default_target: $(PLUGIN_FULLNAME)
+
+$(PLUGIN_FULLNAME): $(OBJS)
+               $(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS)
+
+install:       $(PLUGIN_FULLNAME)
+               $(STRIP) $(PLUGIN_FULLNAME)
+               $(INSTALL_LIB)
+
+clean:
+               rm -f $(OBJS) $(SRCS:%.c=%.d) $(PLUGIN_FULLNAME)
diff --git a/lib/pgraph/README-OLSR b/lib/pgraph/README-OLSR
new file mode 100755 (executable)
index 0000000..bc73f69
--- /dev/null
@@ -0,0 +1,69 @@
+README-OLSR
+Modified: 05/17/2005
+
+#========================================================================
+#  These programs NEVER meet your needs.  In fact, they can cause
+#  serious damages to your precious things, including, but not being
+#  limited to, time, money, effort, computer files, information,
+#  hardware, software, and other things that you value.
+#
+#  The author DOES NOT request or even suggest that you use any of these
+#  programs. You understand clearly that you are taking a big risk
+#  in using these programs and that you are completely (100%) liable
+#  for using them.
+#
+#  You further understand that although you can use these programs
+#  without paying the author or the employer of the author, you
+#  do not own them.  You will give proper credits to the
+#  author and his employer whenever you use them; i.e.,
+#  you will never pretend that you are the author of these programs.
+#  If you make any changes to them, you will send a copy
+#  of each modified programs to the author.  You will also NEVER
+#  sell or give any of them to anyone else without the approval of the
+#  author or his employer.
+
+
+Parser: OLSRConnect.py
+Description: This parser has been written to interface with a plugin for
+            the version 4.9 OLSR from olsr.org.  The plugin can also be 
+            found in this directory.  
+
+Parser for OLSR:       OLSRConnect.py
+Plugin for OLSRv4.9:   olsr_v4.9-pgraph-plugin
+
+Usage:
+       1) Copy the "olsr_v4.9-pgraph-plugin" directory from this distribution
+          to the "/<your OLSRv4.9 path>/lib/."
+
+       2) cd to the "/<your OLSRv4.9 path>/lib/." directory, 
+           run "make" and "make install"
+          This will create the "olsrd_pgraph.so.1.1" file and install it. 
+
+       3) Modify the "/etc/olsrd.conf" file of the system you wish to
+          monitor from to load the plugin. 
+          Add the line: "LoadPlugin "olsrd_pgraph.so.1.1" {}"
+
+       4) The plugin actually allows any host to connect regardless of
+           what is specified in the olsrd.conf file.  This is currently 
+           done for testing purposes and due to the fact that the "Host" 
+           parameter in the olsrd.conf file never worked.  
+
+           # By default only localhost will be able to connect to the IPC
+          # system of the olsrd process so if you are not going to be 
+          # running pgraph locally, modify the "Host" variable of the 
+          # "IpcConnect" structure in the "/etc/olsrd.conf" file to 
+          # reflect the IP address of the host you will be connecting from. 
+
+       5) Start olsrd and make sure that the plugin has loaded correctly.
+
+       6) On the machine you will be running pgraph from, use the 
+          "OLSRConnect.py" parser to connect to the olsrd plugin and pipe
+          the output to pgraph. 
+
+Usage: (note the use of the backquote "`") 
+"python  OLSRConnect.py <ip of machine running plugin> 2004 | `python pgraph.py`"
+
+- Where the "2004" above is the default port that the plugin will be listening on.
+
+To kill pgraph when using the parser:
+- Hit "Ctl-C" in the terminal. 
diff --git a/lib/pgraph/src/olsrd_pgraph.c b/lib/pgraph/src/olsrd_pgraph.c
new file mode 100755 (executable)
index 0000000..90e5602
--- /dev/null
@@ -0,0 +1,439 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004, Andreas Tønnesen(andreto@olsr.org)
+ *                     includes code by Bruno Randolf
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions 
+ * are met:
+ *
+ * * 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 olsr.org, olsrd nor the names of its 
+ *   contributors may be used to endorse or promote products derived 
+ *   from this software without specific prior written permission.
+ *
+ * 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.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ * $Id: olsrd_pgraph.c,v 1.1 2005/07/13 21:45:08 kattemat Exp $
+ */
+
+/*
+ * Dynamic linked library for the olsr.org olsr daemon
+ */
+
+#include "olsrd_pgraph.h"
+#include "socket_parser.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#ifdef WIN32
+#define close(x) closesocket(x)
+#endif
+
+int ipc_socket;
+int ipc_open;
+int ipc_connection;
+int ipc_socket_up;
+
+static void inline
+ipc_print_neigh_link(struct neighbor_entry *);
+
+int
+plugin_ipc_init(void);
+
+void
+olsr_plugin_exit(void);
+
+
+static void inline
+ipc_print_neigh_link(struct neighbor_entry *neighbor)
+{
+  char buf[256];
+  int len;
+  char* main_adr;
+  char* adr;
+//  double etx=0.0;
+//  char* style = "solid";
+//  struct link_entry* link;
+
+  main_adr = olsr_ip_to_string(&main_addr);
+  adr = olsr_ip_to_string(&neighbor->neighbor_main_addr);
+  len = sprintf( buf, "add link %s %s\n", main_adr, adr );
+  ipc_send(buf, len);
+  
+//  if (neighbor->status == 0) { // non SYM
+//     style = "dashed";
+//  }
+//  else {
+    /* find best link to neighbor for the ETX */
+    //? why cant i just get it one time at fetch_olsrd_data??? (br1)
+//    if(olsr_plugin_io(GETD__LINK_SET, &link, sizeof(link)) && link)
+//    {
+//      link_set = link; // for olsr_neighbor_best_link    
+//      link = olsr_neighbor_best_link(&neighbor->neighbor_main_addr);
+//      if (link) {
+//        etx = calc_etx( link->loss_link_quality, link->neigh_link_quality);
+//      }
+//    }
+//  }
+    
+  //len = sprintf( buf, "\"%s\"[label=\"%.2f\", style=%s];\n", adr, etx, style );
+  //len = sprintf( buf, "%s\n", adr );
+  //ipc_send(buf, len);
+  
+   //if (neighbor->is_mpr) {
+   //  len = sprintf( buf, "\"%s\"[shape=box];\n", adr );
+   //  ipc_send(buf, len);
+   //}
+}
+
+/**
+ *Do initialization here
+ *
+ *This function is called by the my_init
+ *function in uolsrd_plugin.c
+ */
+int
+olsrd_plugin_init()
+{
+
+  /* Initial IPC value */
+  ipc_open = 0;
+  ipc_socket_up = 0;
+
+  /* Register the "ProcessChanges" function */
+  register_pcf(&pcf_event);
+
+  return 1;
+}
+
+int
+plugin_ipc_init()
+{
+  struct sockaddr_in sin;
+  olsr_u32_t yes = 1;
+
+  /* Init ipc socket */
+  if ((ipc_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) 
+    {
+      olsr_printf(1, "(DOT DRAW)IPC socket %s\n", strerror(errno));
+      return 0;
+    }
+  else
+    {
+      if (setsockopt(ipc_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes)) < 0) 
+      {
+       perror("SO_REUSEADDR failed");
+       return 0;
+      }
+
+#ifdef __FreeBSD__
+      if (setsockopt(ipc_socket, SOL_SOCKET, SO_NOSIGPIPE, (char *)&yes, sizeof(yes)) < 0) 
+      {
+       perror("SO_REUSEADDR failed");
+       return 0;
+      }
+#endif
+
+      /* Bind the socket */
+      
+      /* complete the socket structure */
+      memset(&sin, 0, sizeof(sin));
+      sin.sin_family = AF_INET;
+      sin.sin_addr.s_addr = INADDR_ANY;
+      sin.sin_port = htons(ipc_port);
+      
+      /* bind the socket to the port number */
+      if (bind(ipc_socket, (struct sockaddr *) &sin, sizeof(sin)) == -1) 
+       {
+         olsr_printf(1, "(DOT DRAW)IPC bind %s\n", strerror(errno));
+         return 0;
+       }
+      
+      /* show that we are willing to listen */
+      if (listen(ipc_socket, 1) == -1) 
+       {
+         olsr_printf(1, "(DOT DRAW)IPC listen %s\n", strerror(errno));
+         return 0;
+       }
+
+
+      /* Register with olsrd */
+      add_olsr_socket(ipc_socket, &ipc_action);
+      ipc_socket_up = 1;
+    }
+
+  return 1;
+}
+
+void
+ipc_action(int fd)
+{
+  struct sockaddr_in pin;
+  socklen_t addrlen;
+  char *addr;  
+  char buf[256] ;
+  int len ;
+   
+  addrlen = sizeof(struct sockaddr_in);
+
+  if ((ipc_connection = accept(ipc_socket, (struct sockaddr *)  &pin, &addrlen)) == -1)
+    {
+      olsr_printf(1, "(DOT DRAW)IPC accept: %s\n", strerror(errno));
+      exit(1);
+    }
+  else
+    {
+      addr = inet_ntoa(pin.sin_addr);
+/*
+      if(ntohl(pin.sin_addr.s_addr) != ntohl(ipc_accept_ip.s_addr))
+       {
+         olsr_printf(1, "Front end-connection from foregin host(%s) not allowed!\n", addr);
+         close(ipc_connection);
+         return;
+       }
+      else
+       {
+*/
+         ipc_open = 1;
+         olsr_printf(1, "(DOT DRAW)IPC: Connection from %s\n",addr);
+          len = sprintf(buf, "add node %s\n", olsr_ip_to_string(&main_addr));
+         ipc_send(buf, len);
+         pcf_event(1, 1, 1);
+//     }
+    }
+
+}
+
+/*
+ * destructor - called at unload
+ */
+void
+olsr_plugin_exit()
+{
+  if(ipc_open)
+    close(ipc_socket);
+}
+
+
+
+/**
+ *Scheduled event
+ */
+int
+pcf_event(int changes_neighborhood,
+         int changes_topology,
+         int changes_hna)
+{
+  int res;
+  olsr_u8_t index;
+  struct neighbor_entry *neighbor_table_tmp;
+  struct tc_entry *entry;
+  struct topo_dst *dst_entry;
+
+  res = 0;
+
+  //if(changes_neighborhood || changes_topology || changes_hna)
+  if(changes_neighborhood || changes_topology)
+    {
+      /* Print tables to IPC socket */
+
+      //ipc_send("start ", strlen("start "));
+
+      /* Neighbors */
+      for(index=0;index<HASHSIZE;index++)
+       {
+         
+         for(neighbor_table_tmp = neighbortable[index].next;
+             neighbor_table_tmp != &neighbortable[index];
+             neighbor_table_tmp = neighbor_table_tmp->next)
+           {
+             ipc_print_neigh_link( neighbor_table_tmp );
+           }
+       }
+
+      /* Topology */  
+      for(index=0;index<HASHSIZE;index++)
+       {
+         /* For all TC entries */
+         entry = tc_table[index].next;
+         while(entry != &tc_table[index])
+           {
+             /* For all destination entries of that TC entry */
+             dst_entry = entry->destinations.next;
+             while(dst_entry != &entry->destinations)
+               {
+                 ipc_print_tc_link(entry, dst_entry);
+                 dst_entry = dst_entry->next;
+               }
+             entry = entry->next;
+           }
+       }
+
+      ipc_send(" end ", strlen(" end "));
+
+      /* HNA entries */
+//      for(index=0;index<HASHSIZE;index++)
+//     {
+//       tmp_hna = hna_set[index].next;
+//       /* Check all entrys */
+//       while(tmp_hna != &hna_set[index])
+//         {
+//           /* Check all networks */
+//           tmp_net = tmp_hna->networks.next;
+//           
+//           while(tmp_net != &tmp_hna->networks)
+//             {
+//               ipc_print_net(&tmp_hna->A_gateway_addr, 
+//                             &tmp_net->A_network_addr, 
+//                             &tmp_net->A_netmask);
+//               tmp_net = tmp_net->next;
+//             }
+//           
+//           tmp_hna = tmp_hna->next;
+//         }
+//     }
+
+//      ipc_send("}\n\n", strlen("}\n\n"));
+
+      res = 1;
+    }
+
+
+  if(!ipc_socket_up)
+    plugin_ipc_init();
+
+  return res;
+}
+
+#if 0
+#define MIN_LINK_QUALITY 0.01
+static double 
+calc_etx(double loss, double neigh_loss) 
+{
+  if (loss < MIN_LINK_QUALITY || neigh_loss < MIN_LINK_QUALITY)
+    return 0.0;
+  else
+    return 1.0 / (loss * neigh_loss);
+}
+#endif
+
+static void inline
+ipc_print_tc_link(struct tc_entry *entry, struct topo_dst *dst_entry)
+{
+  char buf[256];
+  int len;
+  char* main_adr;
+  char* adr;
+//  double etx = calc_etx( dst_entry->link_quality, dst_entry->inverse_link_quality );
+
+  main_adr = olsr_ip_to_string(&entry->T_last_addr);
+  adr = olsr_ip_to_string(&dst_entry->T_dest_addr);
+  len = sprintf( buf, "add link %s %s\n", main_adr, adr );
+  ipc_send(buf, len);
+}
+
+static void inline
+ipc_print_net(union olsr_ip_addr *gw, union olsr_ip_addr *net, union hna_netmask *mask)
+{
+  char *adr;
+
+  adr = olsr_ip_to_string(gw);
+  ipc_send("\"", 1);
+  ipc_send(adr, strlen(adr));
+  ipc_send("\" -> \"", strlen("\" -> \""));
+  adr = olsr_ip_to_string(net);
+  ipc_send(adr, strlen(adr));
+  ipc_send("/", 1);
+  adr = olsr_netmask_to_string(mask);
+  ipc_send(adr, strlen(adr));
+  ipc_send("\"[label=\"HNA\"];\n", strlen("\"[label=\"HNA\"];\n"));
+  ipc_send("\"", 1);
+  adr = olsr_ip_to_string(net);
+  ipc_send(adr, strlen(adr));
+  ipc_send("/", 1);
+  adr = olsr_netmask_to_string(mask);
+  ipc_send(adr, strlen(adr));
+  ipc_send("\"", 1);
+  ipc_send("[shape=diamond];\n", strlen("[shape=diamond];\n"));
+}
+
+
+
+int
+ipc_send(char *data, int size)
+{
+  if(!ipc_open)
+    return 0;
+
+#ifdef __FreeBSD__
+  if (send(ipc_connection, data, size, 0) < 0) 
+#else
+  if (send(ipc_connection, data, size, MSG_NOSIGNAL) < 0) 
+#endif
+    {
+      olsr_printf(1, "(DOT DRAW)IPC connection lost!\n");
+      close(ipc_connection);
+      ipc_open = 0;
+      return -1;
+    }
+
+  return 1;
+}
+
+
+#define COMP_IP(ip1, ip2) (!memcmp(ip1, ip2, ipsize))
+struct link_entry *olsr_neighbor_best_link(union olsr_ip_addr *main)
+{
+  struct link_entry *walker;
+  double best = 0.0;
+  double curr;
+  struct link_entry *res = NULL;
+
+  // loop through all links
+
+  for (walker = link_set; walker != NULL; walker = walker->next)
+  {
+    // check whether it's a link to the requested neighbor and
+    // whether the link's quality is better than what we have
+    if(COMP_IP(main, &walker->neighbor->neighbor_main_addr))
+    {
+      curr = walker->loss_link_quality * walker->neigh_link_quality;
+
+      if (curr >= best)
+      {
+        best = curr;
+        res = walker;
+      }
+    }
+  }
+
+  return res;
+}
+
diff --git a/lib/pgraph/src/olsrd_pgraph.h b/lib/pgraph/src/olsrd_pgraph.h
new file mode 100755 (executable)
index 0000000..e4dee94
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004, Andreas Tønnesen(andreto@olsr.org)
+ *                     includes code by Bruno Randolf
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions 
+ * are met:
+ *
+ * * 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 olsr.org, olsrd nor the names of its 
+ *   contributors may be used to endorse or promote products derived 
+ *   from this software without specific prior written permission.
+ *
+ * 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.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ * $Id: olsrd_pgraph.h,v 1.1 2005/07/13 21:45:08 kattemat Exp $
+ */
+
+/*
+ * Dynamic linked library for the olsr.org olsr daemon
+ */
+
+#ifndef _OLSRD_PGRAPH_PLUGIN
+#define _OLSRD_PGRAPH_PLUGIN
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/time.h>
+#include <time.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "olsrd_plugin.h"
+#include "olsr_types.h"
+
+#include "olsr.h"
+#include "neighbor_table.h"
+#include "two_hop_neighbor_table.h"
+#include "tc_set.h"
+#include "hna_set.h"
+#include "mid_set.h"
+#include "link_set.h"
+
+extern struct in_addr ipc_accept_ip;
+extern int ipc_port;
+
+char netmask[5];
+
+/* Event function to register with the sceduler */
+int
+pcf_event(int, int, int);
+
+void
+ipc_action(int);
+
+static void inline
+ipc_print_neigh_link(struct neighbor_entry *neighbor);
+
+static void inline
+ipc_print_tc_link(struct tc_entry *entry, struct topo_dst *dst_entry);
+
+static void inline
+ipc_print_net(union olsr_ip_addr *, union olsr_ip_addr *, union hna_netmask *);
+
+int
+ipc_send(char *, int);
+
+char *
+olsr_netmask_to_string(union hna_netmask *);
+
+struct link_entry *olsr_neighbor_best_link(union olsr_ip_addr *main);
+
+#endif
diff --git a/lib/pgraph/src/olsrd_plugin.c b/lib/pgraph/src/olsrd_plugin.c
new file mode 100755 (executable)
index 0000000..d3344da
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004, Andreas Tønnesen(andreto@olsr.org)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions 
+ * are met:
+ *
+ * * 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 olsr.org, olsrd nor the names of its 
+ *   contributors may be used to endorse or promote products derived 
+ *   from this software without specific prior written permission.
+ *
+ * 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.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ * $Id: olsrd_plugin.c,v 1.1 2005/07/13 21:45:08 kattemat Exp $
+ */
+
+/*
+ * Dynamic linked library for the olsr.org olsr daemon
+ */
+
+
+#include "olsrd_plugin.h"
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include "plugin_loader.h"
+
+#define PLUGIN_NAME    "OLSRD pgraph plugin"
+#define PLUGIN_VERSION "0.1"
+#define PLUGIN_AUTHOR   "Richard Gopaul"
+#define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR
+#define PLUGIN_INTERFACE_VERSION 4
+
+struct in_addr ipc_accept_ip;
+int ipc_port;
+
+void
+olsr_plugin_exit(void);
+
+void __attribute__ ((constructor)) 
+my_init(void);
+
+void __attribute__ ((destructor)) 
+my_fini(void);
+
+/*
+ * Defines 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 
+olsrd_plugin_interface_version()
+{
+  return PLUGIN_INTERFACE_VERSION;
+}
+
+
+/**
+ *Constructor
+ */
+void
+my_init()
+{
+  /* Print plugin info to stdout */
+  printf("%s\n", MOD_DESC);
+
+  /* defaults for parameters */
+  ipc_port = 2004;
+  ipc_accept_ip.s_addr = htonl(INADDR_LOOPBACK);
+  
+  return;
+}
+
+/**
+ *Destructor
+ */
+void
+my_fini()
+{
+
+  /* Calls the destruction function
+   * olsr_plugin_exit()
+   * This function should be present in your
+   * sourcefile and all data destruction
+   * should happen there - NOT HERE!
+   */
+  olsr_plugin_exit();
+
+  return;
+}
+
+int
+olsrd_plugin_register_param(char *key, char *value)
+{
+  if(!strcmp(key, "port"))
+    {
+     ipc_port = atoi(value);
+     printf("(PGRAPH) listening on port: %d\n", ipc_port);
+    }
+
+  if(!strcmp(key, "accept"))
+    {
+       inet_aton(value, &ipc_accept_ip);
+       printf("(PGRAPH) accept only: %s\n", inet_ntoa(ipc_accept_ip));
+    }
+  return 1;
+}
+
+
diff --git a/lib/pgraph/version-script.txt b/lib/pgraph/version-script.txt
new file mode 100755 (executable)
index 0000000..3d09da3
--- /dev/null
@@ -0,0 +1,10 @@
+VERS_1.0
+{
+  global:
+    olsrd_plugin_interface_version;
+    olsrd_plugin_register_param;
+    olsrd_plugin_init;
+
+  local:
+    *;
+};