GUI code restructuring
authorAndreas Tonnesen <andreto@olsr.org>
Tue, 14 Sep 2004 16:45:41 +0000 (16:45 +0000)
committerAndreas Tonnesen <andreto@olsr.org>
Tue, 14 Sep 2004 16:45:41 +0000 (16:45 +0000)
21 files changed:
gui/linux-gtk/Makefile.win32.in [deleted file]
gui/linux-gtk/mkmf.sh [deleted file]
gui/linux-gtk/src/callbacks.c [new file with mode: 0644]
gui/linux-gtk/src/callbacks.h [new file with mode: 0644]
gui/linux-gtk/src/common.h [new file with mode: 0644]
gui/linux-gtk/src/interface.c [new file with mode: 0644]
gui/linux-gtk/src/interface.h [new file with mode: 0644]
gui/linux-gtk/src/ipc.c [new file with mode: 0644]
gui/linux-gtk/src/ipc.h [new file with mode: 0644]
gui/linux-gtk/src/main.c [new file with mode: 0644]
gui/linux-gtk/src/main.h [new file with mode: 0644]
gui/linux-gtk/src/nodes.c [new file with mode: 0644]
gui/linux-gtk/src/nodes.h [new file with mode: 0644]
gui/linux-gtk/src/olsr.c [new file with mode: 0644]
gui/linux-gtk/src/olsr_protocol.h [new file with mode: 0644]
gui/linux-gtk/src/packet.c [new file with mode: 0644]
gui/linux-gtk/src/packet.h [new file with mode: 0644]
gui/linux-gtk/src/pixmaps.h [new file with mode: 0644]
gui/linux-gtk/src/pixmaps/logo.xpm [new file with mode: 0644]
gui/linux-gtk/src/routes.c [new file with mode: 0644]
gui/linux-gtk/src/routes.h [new file with mode: 0644]

diff --git a/gui/linux-gtk/Makefile.win32.in b/gui/linux-gtk/Makefile.win32.in
deleted file mode 100644 (file)
index a151b50..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-GTKBASE =      ../../gtk
-
-OBJS =         src/main.o \
-               src/interface.o \
-               src/callbacks.o \
-               src/ipc.o \
-               src/packet.o \
-               src/nodes.o \
-               src/routes.o \
-               src/win32/compat.o
-
-%.o:           %.c
-               gcc -mno-cygwin -mms-bitfields -O2 -Wall -c -DWIN32 \
-               -Isrc/win32 \
-                -I$(GTKBASE)/include/gtk-2.0 \
-                -I$(GTKBASE)/include/glib-2.0 \
-                -I$(GTKBASE)/lib/gtk-2.0/include \
-                -I$(GTKBASE)/lib/glib-2.0/include \
-                -I$(GTKBASE)/include/pango-1.0 \
-                -I$(GTKBASE)/include/atk-1.0 \
-                -o$@ $<
-
-olsrd-gui:     $(OBJS)
-               gcc -mno-cygwin -o olsrd-gui.exe $(OBJS) \
-                -lws2_32 \
-                -L$(GTKBASE)/lib \
-                -llibgtk-win32-2.0 \
-                -llibgdk-win32-2.0 \
-                -llibglib-2.0 \
-                -llibgobject-2.0
-
-clean:
-               rm -f olsrd-gui.exe
-               find . -name \*~ -exec rm -f {} \;
-               find src -name \*.o -exec rm -f {} \;
-
-mclean:                clean
-               rm -f Makefile.win32
diff --git a/gui/linux-gtk/mkmf.sh b/gui/linux-gtk/mkmf.sh
deleted file mode 100755 (executable)
index 2acc4e2..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/sh
-
-srcs="\
-    src/main.c \
-    src/interface.c \
-    src/callbacks.c \
-    src/ipc.c \
-    src/packet.c \
-    src/nodes.c \
-    src/routes.c \
-    src/win32/compat.c \
-    "
-
-rm -f Makefile.win32
-cp Makefile.win32.in Makefile.win32
-
-echo >>Makefile.win32
-echo \# >>Makefile.win32
-echo \# DEPENDENCIES >>Makefile.win32
-echo \# >>Makefile.win32
-
-for f in $srcs; do
-    echo >>Makefile.win32
-    echo \# $f >>Makefile.win32
-    echo >>Makefile.win32
-
-    o=`echo $f | sed -e 's/c$/o/'`
-
-    gcc -MM -MT $o -mno-cygwin -mms-bitfields -O2 -Wall -c -DWIN32 -Isrc/win32 $f >>Makefile.win32
-done
diff --git a/gui/linux-gtk/src/callbacks.c b/gui/linux-gtk/src/callbacks.c
new file mode 100644 (file)
index 0000000..42bea34
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI 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.
+ *
+ * uolsrGUI 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include "common.h"
+
+
diff --git a/gui/linux-gtk/src/callbacks.h b/gui/linux-gtk/src/callbacks.h
new file mode 100644 (file)
index 0000000..8b13789
--- /dev/null
@@ -0,0 +1 @@
+
diff --git a/gui/linux-gtk/src/common.h b/gui/linux-gtk/src/common.h
new file mode 100644 (file)
index 0000000..056abff
--- /dev/null
@@ -0,0 +1,229 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI 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.
+ *
+ * uolsrGUI 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+/*
+ *Andreas Tønmnesen
+ */
+
+#ifndef _OLSRD_FORNTEND_COMMON
+#define _OLSRD_FORNTEND_COMMON
+
+#include <gtk/gtk.h>
+#include <stdlib.h>
+#include <netinet/in.h>
+#include <stdio.h>
+#include <string.h>
+
+//#include "interface.h"
+#include "callbacks.h"
+//#include "types.h"
+#include "olsr_protocol.h"
+
+#define SOFTWARE_VERSION "uOLSRd GUI 0.2.6" 
+#define IPC_INTERVAL 500 //interval for IPC read timeout
+#define MAXPACKS 20
+#define BUFFSIZE 512
+
+
+extern int connected;
+extern struct timeval hold_time_nodes; /* Timeout for all nodes */
+extern struct timeval now;
+
+
+/* Our address */
+union olsr_ip_addr main_addr;
+union olsr_ip_addr null_addr;
+
+int ipversion;
+int ipsize;
+char ipv6_buf[100];      /* buffer for IPv6 inet_htop */
+
+int nodes_timeout;
+
+int freeze_packets;
+int display_dec;
+extern int timeouts;
+
+/*
+ *Node info
+ */
+
+
+struct mid
+{
+  union olsr_ip_addr alias;
+  struct mid *next;
+  struct mid *prev;
+};
+
+struct hna
+{
+  union olsr_ip_addr net;
+  union olsr_ip_addr mask;
+  struct hna *next;
+  struct hna *prev;
+};
+
+struct mpr
+{
+  union olsr_ip_addr addr;
+  struct timeval timer;
+  struct mpr *next;
+  struct mpr *prev;
+};
+
+
+struct node
+{
+  union olsr_ip_addr addr;
+  union olsr_ip_addr gw_addr;
+  int hopcount;
+  int display;
+  char dev[5];
+  struct mid mid;
+  struct hna hna;
+  struct mpr mpr;
+  struct timeval timer;
+  struct node *next;
+  struct node *prev;
+};
+
+
+
+
+
+
+/*
+ *Interface public
+ */
+
+
+GtkWidget * 
+create_main_window (void);
+
+
+void
+packet_list_add(char *, char *, char *);
+
+void
+route_list_add(char *, char *, char *, char *);
+
+int
+route_list_del(char *);
+
+void
+route_list_update(char *);
+
+
+void
+set_net_info(gchar *, int);
+
+void
+set_net_info_offline();
+
+void
+update_nodes_list(struct node *);
+
+int
+remove_nodes_list(union olsr_ip_addr *);
+
+/*
+ *IPC public
+ */
+int
+ipc_connect();
+
+int
+ipc_close();
+
+int
+ipc_read();
+
+int
+ipc_send();
+
+
+char *
+ip_to_string(union olsr_ip_addr *);
+
+int
+gui_itoa(int, char *);
+
+
+/*
+ *Packet.c public
+ */
+
+int
+add_packet_to_buffer(union olsr_message *, int);
+
+
+union olsr_message *
+get_packet(int);
+
+
+
+/*
+ *Nodes.c public
+ */
+
+
+
+void
+init_nodes();
+
+struct node *
+find_node(char *);
+
+struct node *
+find_node_t(union olsr_ip_addr *);
+
+int
+update_timer_node(union olsr_ip_addr *, olsr_u8_t);
+
+int
+add_hna_node(union olsr_ip_addr *, union olsr_ip_addr *, union olsr_ip_addr *, olsr_u8_t);
+
+int
+add_mid_node(union olsr_ip_addr *, union olsr_ip_addr *, olsr_u8_t);
+
+void
+init_timer(olsr_u32_t, struct timeval *);
+
+gint
+time_out_nodes(gpointer);
+
+int
+add_node(union olsr_ip_addr *, olsr_u8_t);
+
+int
+add_mpr(union olsr_ip_addr *, union olsr_ip_addr *, struct timeval *);
+
+int
+update_timer_mpr(union olsr_ip_addr *, union olsr_ip_addr *, olsr_u8_t);
+
+int
+time_out_mprs(union olsr_ip_addr *);
+
+
+
+#endif
diff --git a/gui/linux-gtk/src/interface.c b/gui/linux-gtk/src/interface.c
new file mode 100644 (file)
index 0000000..3c13690
--- /dev/null
@@ -0,0 +1,1545 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI 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.
+ *
+ * uolsrGUI 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+
+#include "common.h"
+#include "interface.h"
+#include "pixmaps.h"
+
+/* Global widgets */
+/* GtkWidget *text1; */
+GtkWidget *net_label;
+GtkWidget *info_label;
+GtkTextBuffer *textBuffer;
+GtkWidget *connect_button;
+GtkWidget *packet_list;
+GtkWidget *packet_content_list;
+GtkWidget *packet_button;
+GtkWidget *packet_disp_button;
+GtkWidget *node_list;
+GtkWidget *mid_list;
+GtkWidget *mpr_list;
+GtkWidget *hna_list;
+GtkWidget *route_list;
+
+GdkBitmap *mask;
+
+int packet_list_size = 0;
+int route_list_size = 0;
+int node_list_size = 0;
+
+GtkWidget *main_window;
+
+GtkWidget*
+create_main_window (void)
+{
+  GtkWidget *notebook1;
+  GtkWidget *frame3;
+  GtkWidget *frame4;
+  GtkWidget *hbox1;
+  GtkWidget *vbox1;
+  GtkWidget *scrolledwindow1;
+  GtkWidget *node_label1;
+  GtkWidget *node_label2;
+  GtkWidget *node_label3;
+  GtkWidget *node_label4;
+  GtkWidget *node_label7;
+  GtkWidget *node_label8;
+  GtkWidget *node_label9;
+  GtkWidget *mid_frame;
+  GtkWidget *mpr_frame;
+  GtkWidget *hna_frame;
+  GtkWidget *mid_scrolledwindow;
+  GtkWidget *mpr_scrolledwindow;
+  GtkWidget *hna_scrolledwindow;
+  GtkWidget *Main;
+  GtkWidget *label_routes;
+  GtkWidget *hbox2;
+  GtkWidget *frame2;
+  GtkWidget *scrolledwindow4;
+  GtkWidget *label17;
+  GtkWidget *label18;
+  GtkWidget *label19;
+  GtkWidget *scrolledwindow3;
+  GtkWidget *label13;
+  GtkWidget *label14;
+  GtkWidget *label15;
+  GtkWidget *label16;
+  GtkWidget *label_packets;
+  //GtkWidget *empty_notebook_page2;
+  GtkWidget *label3;
+  GtkWidget *net_vbox;
+  GtkWidget *pack_vbox;
+  GtkWidget *pack_disp_vbox;
+  GtkWidget *disp_frame;
+  GtkWidget *route_frame;
+  GtkWidget *route_stats_frame;
+  GtkWidget *route_scrolledwindow;
+  GtkWidget *route_label1;
+  GtkWidget *route_label2;
+  GtkWidget *route_label3;
+  GtkWidget *route_label4;
+  GtkWidget *route_hbox1;
+
+  GtkWidget *traffic_label;
+
+  GtkWidget *settings_label;
+  GtkWidget *settings_hbox1;
+
+  GtkWidget *about_hbox1;
+  GtkWidget *about_label;
+
+  GtkWidget *empty1;
+
+  GdkPixmap *unik_logo_gdk;
+  GtkWidget *unik_logo;
+
+  /*
+   *The main window
+   */
+
+  main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_object_set_data (GTK_OBJECT (main_window), "main_window", main_window);
+  gtk_window_set_title (GTK_WINDOW (main_window), (SOFTWARE_VERSION));
+  gtk_window_set_default_size(GTK_WINDOW (main_window), 600, 550);
+  gtk_signal_connect(GTK_OBJECT(main_window),
+                    "destroy",
+                    GTK_SIGNAL_FUNC(gui_shutdown),
+                    //GTK_SIGNAL_FUNC(gtk_main_quit),
+                    NULL);
+  gtk_window_set_position(GTK_WINDOW(main_window), GTK_WIN_POS_CENTER); /* Position window in center */
+  gtk_window_set_policy(GTK_WINDOW(main_window), FALSE, TRUE, TRUE); /* No user-resizing */
+
+  /*
+   *Initialize the pixmaps
+   */
+  unik_logo_gdk = gdk_pixmap_colormap_create_from_xpm_d (NULL, gtk_widget_get_colormap(main_window), &mask, NULL, (gchar **)logo_xpm);
+
+  unik_logo = gtk_pixmap_new(unik_logo_gdk, mask);
+
+  /*
+   *The notebook
+   */
+
+  notebook1 = gtk_notebook_new ();
+  gtk_widget_ref (notebook1);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "notebook1", notebook1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (notebook1);
+  gtk_container_add (GTK_CONTAINER (main_window), notebook1);
+
+
+
+  /*
+   *The first vbox
+   */
+  vbox1 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_ref (vbox1);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox1", vbox1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (vbox1);
+  //gtk_box_pack_start (GTK_BOX (hbox1), vbox1, TRUE, TRUE, 1);
+  gtk_container_add (GTK_CONTAINER (notebook1), vbox1);
+
+
+
+
+  /*
+   *The nodes frame
+   */
+  frame3 = gtk_frame_new ("Registered nodes:");
+  gtk_widget_ref (frame3);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "frame3", frame3,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (frame3);
+  gtk_box_pack_start (GTK_BOX (vbox1), frame3, TRUE, TRUE, 0);
+  gtk_widget_set_size_request(frame3, -1, 300);
+  gtk_container_set_border_width (GTK_CONTAINER (frame3), 1);
+
+
+
+
+  /*
+   *The scrolled window to contain the node list
+   */
+
+  scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_ref (scrolledwindow1);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "scrolledwindow1", scrolledwindow1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (scrolledwindow1);
+  gtk_container_add (GTK_CONTAINER (frame3), scrolledwindow1);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+
+  //gtk_box_pack_start (GTK_BOX (frame3), scrolledwindow1, TRUE, TRUE, 0);
+  //gtk_widget_set_usize (scrolledwindow1, -2, 332);
+
+  /*
+   *The node list
+   */
+  
+  node_list = gtk_clist_new (7);
+  gtk_widget_ref (node_list);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "node_list", node_list,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (node_list);
+  gtk_container_add (GTK_CONTAINER (scrolledwindow1), node_list);
+  gtk_clist_set_column_width (GTK_CLIST (node_list), 0, 150); /* IP */
+  //gtk_clist_set_column_justification(GTK_CLIST(node_list), 0, GTK_JUSTIFY_CENTER);
+  gtk_clist_set_column_width (GTK_CLIST (node_list), 1, 150); /* gateway */
+  //gtk_clist_set_column_justification(GTK_CLIST(node_list), 1, GTK_JUSTIFY_CENTER);
+  gtk_clist_set_column_width (GTK_CLIST (node_list), 2, 50); /* hopcount */
+  gtk_clist_set_column_justification(GTK_CLIST(node_list), 2, GTK_JUSTIFY_CENTER);
+  gtk_clist_set_column_width (GTK_CLIST (node_list), 3, 80); /* dev */
+  gtk_clist_set_column_justification(GTK_CLIST(node_list), 3, GTK_JUSTIFY_CENTER);
+
+  gtk_clist_set_column_width (GTK_CLIST (node_list), 4, 70); /* timer */
+  gtk_clist_set_column_justification(GTK_CLIST(node_list), 4, GTK_JUSTIFY_CENTER);
+  //gtk_clist_set_column_width (GTK_CLIST (node_list), 7, 100); /* last about */
+  //gtk_clist_set_column_justification(GTK_CLIST(node_list), 7, GTK_JUSTIFY_CENTER);
+
+  gtk_clist_set_column_width (GTK_CLIST (node_list), 5, 40); /* MID */
+  gtk_clist_set_column_justification(GTK_CLIST(node_list), 5, GTK_JUSTIFY_CENTER);
+  gtk_clist_set_column_width (GTK_CLIST (node_list), 6, 40); /* HNA */
+  gtk_clist_set_column_justification(GTK_CLIST(node_list), 6, GTK_JUSTIFY_CENTER);
+
+  gtk_clist_column_titles_show (GTK_CLIST (node_list));
+
+  /*
+   *Row selection callback
+   */
+  gtk_signal_connect(GTK_OBJECT(node_list), "select_row",
+                    GTK_SIGNAL_FUNC(selection_made),
+                    NULL);
+
+  /*
+   *Column selection callback
+   */
+  gtk_signal_connect(GTK_OBJECT(node_list),
+                    "click_column",
+                    GTK_SIGNAL_FUNC(column_clicked_callback),
+                    NULL);
+
+  node_label1 = gtk_label_new ("Dest");
+  gtk_widget_ref (node_label1);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "IP", node_label1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (node_label1);
+  gtk_clist_set_column_widget (GTK_CLIST (node_list), 0, node_label1);
+
+  node_label2 = gtk_label_new ("Gateway");
+  gtk_widget_ref (node_label2);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "hops", node_label2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (node_label2);
+  gtk_clist_set_column_widget (GTK_CLIST (node_list), 1, node_label2);
+
+  node_label3 = gtk_label_new ("Metric");
+  gtk_widget_ref (node_label3);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "info", node_label3,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (node_label3);
+  gtk_clist_set_column_widget (GTK_CLIST (node_list), 2, node_label3);
+
+  node_label4 = gtk_label_new ("Device");
+  gtk_widget_ref (node_label4);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "Device", node_label4,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (node_label4);
+  gtk_clist_set_column_widget (GTK_CLIST (node_list), 3, node_label4);
+
+
+  node_label7 = gtk_label_new ("Timer");
+  gtk_widget_ref (node_label7);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "LMF", node_label7,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (node_label7);
+  gtk_clist_set_column_widget (GTK_CLIST (node_list), 4, node_label7);
+
+  /*
+  node_label8 = gtk_label_new ("LMA");
+  gtk_widget_ref (node_label8);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "LMA", node_label8,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (node_label8);
+  gtk_clist_set_column_widget (GTK_CLIST (node_list), 7, node_label8);
+  */
+
+  node_label8 = gtk_label_new ("MID");
+  gtk_widget_ref (node_label8);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "MID", node_label8,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (node_label8);
+  gtk_clist_set_column_widget (GTK_CLIST (node_list), 5, node_label8);
+
+  node_label9 = gtk_label_new ("HNA");
+  gtk_widget_ref (node_label9);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "HNA", node_label9,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (node_label9);
+  gtk_clist_set_column_widget (GTK_CLIST (node_list), 6, node_label9);
+
+
+
+  gtk_clist_column_titles_active(GTK_CLIST (node_list));
+
+
+  gtk_widget_show_now(node_list);
+
+
+
+  /*
+   *Row selection callback
+   */
+  gtk_signal_connect(GTK_OBJECT(node_list), "select_row",
+                    GTK_SIGNAL_FUNC(node_selection),
+                    NULL);
+
+
+
+
+
+  /*
+   *The first hbox
+   */
+  hbox1 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_ref (hbox1);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "hbox1", hbox1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (hbox1);
+  gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
+  //gtk_container_add (GTK_CONTAINER (notebook1), hbox1);
+  gtk_container_set_border_width (GTK_CONTAINER (hbox1), 4);
+  gtk_widget_set_size_request(hbox1, -1, 200);
+
+
+
+  /*
+   *The net-info frame
+   */
+  frame4 = gtk_frame_new ("Info:");
+  gtk_widget_ref (frame4);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "frame4", frame4,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (frame4);
+  gtk_box_pack_start (GTK_BOX (hbox1), frame4, TRUE, TRUE, 0);
+  //gtk_widget_set_size_request(frame4, 200, -1);
+  gtk_container_set_border_width (GTK_CONTAINER (frame4), 1);
+
+
+  /*
+   *The net-info hbox
+   */
+  net_vbox = gtk_vbox_new (FALSE, 0);
+  gtk_widget_ref (net_vbox);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "net_vbox", net_vbox,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (net_vbox);
+  gtk_container_add (GTK_CONTAINER (frame4), net_vbox);
+
+
+  /*
+   *The net-info label field
+   */
+  net_label = gtk_label_new(NULL);
+  gtk_widget_ref (net_label);
+  gtk_misc_set_alignment((GtkMisc *)net_label, 0, 0);
+  //gtk_label_set_justify((GtkLabel *)net_label,GTK_JUSTIFY_LEFT);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "net_label", net_label,
+                            (GtkDestroyNotify) gtk_widget_unref);
+
+  //set_net_info("Not connected...");
+  gtk_widget_show (net_label);
+  gtk_box_pack_start (GTK_BOX (net_vbox), net_label, TRUE, TRUE, 0);
+
+  //gtk_container_add (GTK_CONTAINER (frame4), net_label);
+
+  /*
+   *The connect button
+   */
+
+  connect_button = gtk_button_new_with_label ("Connect to localhost");
+  gtk_widget_ref (connect_button);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "connect_button", connect_button,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  /* Connect the "clicked" signal of the button to our callback */
+  gtk_signal_connect (GTK_OBJECT (connect_button), "clicked",
+                     GTK_SIGNAL_FUNC (connect_callback), NULL);
+  gtk_widget_show (connect_button);
+  gtk_box_pack_start (GTK_BOX (net_vbox), connect_button, FALSE, FALSE, 1);
+  gtk_container_set_border_width (GTK_CONTAINER (connect_button), 5);
+
+
+
+  /*
+   *The node MPR info frame
+   */
+  mpr_frame = gtk_frame_new ("MPR:");
+  gtk_widget_ref (mpr_frame);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "mpr_frame", mpr_frame,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (mpr_frame);
+  gtk_box_pack_start (GTK_BOX (hbox1), mpr_frame, FALSE, FALSE, 0);
+  //gtk_widget_set_size_request(mid_frame, 125, -1);
+  gtk_container_set_border_width (GTK_CONTAINER (mpr_frame), 1);
+
+  /*
+   *The scrolledwindow to contain the MPR node info
+   */
+  mpr_scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_ref (mpr_scrolledwindow);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "mpr_scrolledwindow", mpr_scrolledwindow,
+                            (GtkDestroyNotify) gtk_widget_unref);
+
+  gtk_widget_show (mpr_scrolledwindow);
+  gtk_container_add (GTK_CONTAINER (mpr_frame), mpr_scrolledwindow);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (mpr_scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+  gtk_container_set_border_width (GTK_CONTAINER (mpr_scrolledwindow), 3);
+
+
+  /*
+   *The node MID info frame
+   */
+  mid_frame = gtk_frame_new ("MID:");
+  gtk_widget_ref (mid_frame);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "mid_frame", mid_frame,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (mid_frame);
+  gtk_box_pack_start (GTK_BOX (hbox1), mid_frame, FALSE, FALSE, 0);
+  //gtk_widget_set_size_request(mid_frame, 125, -1);
+  gtk_container_set_border_width (GTK_CONTAINER (mid_frame), 1);
+
+  /*
+   *The scrolledwindow to contain the MID node info
+   */
+  mid_scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_ref (mid_scrolledwindow);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "mid_scrolledwindow", mid_scrolledwindow,
+                            (GtkDestroyNotify) gtk_widget_unref);
+
+  gtk_widget_show (mid_scrolledwindow);
+  gtk_container_add (GTK_CONTAINER (mid_frame), mid_scrolledwindow);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (mid_scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+  gtk_container_set_border_width (GTK_CONTAINER (mid_scrolledwindow), 3);
+
+
+
+  /*
+   *The MPR list
+   */
+  mpr_list = gtk_clist_new (1);
+  gtk_widget_ref (mpr_list);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "mpr_list", mpr_list,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (mpr_list);
+  gtk_container_add (GTK_CONTAINER (mpr_scrolledwindow), mpr_list);
+  gtk_clist_set_column_width (GTK_CLIST (mpr_list), 0, 120); /* IP */
+  gtk_clist_column_titles_hide (GTK_CLIST (mpr_list));
+
+
+  /*
+   *The MID list
+   */
+  mid_list = gtk_clist_new (1);
+  gtk_widget_ref (mid_list);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "mid_list", mid_list,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (mid_list);
+  gtk_container_add (GTK_CONTAINER (mid_scrolledwindow), mid_list);
+  gtk_clist_set_column_width (GTK_CLIST (mid_list), 0, 120); /* IP */
+  gtk_clist_column_titles_hide (GTK_CLIST (mid_list));
+
+
+
+
+  /*
+   *The node HNA info frame
+   */
+  hna_frame = gtk_frame_new ("HNA:");
+  gtk_widget_ref (hna_frame);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "hna_frame", hna_frame,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (hna_frame);
+  gtk_box_pack_start (GTK_BOX (hbox1), hna_frame, FALSE, FALSE, 0);
+  //gtk_widget_set_size_request(mid_frame, 125, -1);
+  gtk_container_set_border_width (GTK_CONTAINER (hna_frame), 1);
+
+
+
+  /*
+   *The HNA scrolled window
+   */
+  hna_scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_ref (hna_scrolledwindow);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "hna_scrolledwindow", hna_scrolledwindow,
+                            (GtkDestroyNotify) gtk_widget_unref);
+
+  gtk_widget_show (hna_scrolledwindow);
+  gtk_container_add (GTK_CONTAINER (hna_frame), hna_scrolledwindow);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (hna_scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+  gtk_container_set_border_width (GTK_CONTAINER (hna_scrolledwindow), 3);
+
+
+  /*
+   *The HNA list
+   */
+  hna_list = gtk_clist_new (1);
+  gtk_widget_ref (hna_list);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "hna_list", hna_list,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (hna_list);
+  gtk_container_add (GTK_CONTAINER (hna_scrolledwindow), hna_list);
+  gtk_clist_set_column_width (GTK_CLIST (hna_list), 0, 120); /* IP */
+  gtk_clist_column_titles_hide (GTK_CLIST (hna_list));
+
+
+
+
+
+  /*
+   *The "main" notebook page
+   */
+  Main = gtk_label_new ("Main");
+  gtk_widget_ref (Main);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "Main", Main,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (Main);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 0), Main);
+
+
+
+  /*
+   *The main hbox of the Packet page
+   */
+
+  hbox2 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_ref (hbox2);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "hbox2", hbox2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (hbox2);
+  gtk_container_add (GTK_CONTAINER (notebook1), hbox2);
+
+
+  /*
+   *The packet hbox
+   */
+  pack_vbox = gtk_vbox_new (FALSE, 0);
+  gtk_widget_ref (pack_vbox);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "pack_vbox", pack_vbox,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (pack_vbox);
+  gtk_box_pack_start (GTK_BOX (hbox2), pack_vbox, TRUE, TRUE, 0);
+
+
+
+  /*
+   *The packet frame
+   */
+
+  frame2 = gtk_frame_new ("Packet");
+  gtk_widget_ref (frame2);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "frame2", frame2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (frame2);
+  gtk_box_pack_start (GTK_BOX (pack_vbox), frame2, TRUE, TRUE, 0); /* Do not expand */
+
+
+  /*
+   *Packet list scrolled window
+   */
+  scrolledwindow4 = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_ref (scrolledwindow4);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "scrolledwindow4", scrolledwindow4,
+                            (GtkDestroyNotify) gtk_widget_unref);
+
+  gtk_widget_show (scrolledwindow4);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow4), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+
+  gtk_container_add (GTK_CONTAINER (frame2), scrolledwindow4);
+
+
+
+
+
+  /*
+   *The packet list
+   */
+
+  packet_list = gtk_clist_new (3);
+  gtk_widget_ref (packet_list);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "packet_list", packet_list,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (packet_list);
+  gtk_container_add (GTK_CONTAINER (scrolledwindow4), packet_list);
+  gtk_clist_set_column_width (GTK_CLIST (packet_list), 0, 80); /* Type */
+  gtk_clist_set_column_width (GTK_CLIST (packet_list), 1, 150); /* Origin IP */
+  gtk_clist_set_column_width (GTK_CLIST (packet_list), 2, 20); /* size */
+  gtk_clist_column_titles_show (GTK_CLIST (packet_list));
+
+  label17 = gtk_label_new ("Type");
+  gtk_widget_ref (label17);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "label17", label17,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label17);
+  gtk_clist_set_column_widget (GTK_CLIST (packet_list), 0, label17);
+
+  label18 = gtk_label_new ("Origin");
+  gtk_widget_ref (label18);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "label18", label18,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label18);
+  gtk_clist_set_column_widget (GTK_CLIST (packet_list), 1, label18);
+
+  label19 = gtk_label_new ("Size");
+  gtk_widget_ref (label19);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "label19", label19,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label19);
+  gtk_clist_set_column_widget (GTK_CLIST (packet_list), 2, label19);
+
+
+
+  /*
+   *Row selection callback
+   */
+  gtk_signal_connect(GTK_OBJECT(packet_list), "select_row",
+                    GTK_SIGNAL_FUNC(packet_selection),
+                    NULL);
+
+
+
+  /*
+   *The packet button
+   */
+
+  packet_button = gtk_button_new_with_label ("Grab packets");
+  gtk_widget_ref (packet_button);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "packet_button", packet_button,
+                            (GtkDestroyNotify) gtk_widget_unref);
+
+  /* Connect the "clicked" signal of the button to our callback */
+  gtk_signal_connect (GTK_OBJECT (packet_button), "clicked",
+                     GTK_SIGNAL_FUNC (packet_callback), NULL);
+  gtk_widget_show (packet_button);
+  gtk_box_pack_start (GTK_BOX (pack_vbox), packet_button, FALSE, FALSE, 5);
+
+
+
+
+
+
+  /*
+   *The packet disp hbox
+   */
+  pack_disp_vbox = gtk_vbox_new (FALSE, 0);
+  gtk_widget_ref (pack_disp_vbox);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "pack_disp_vbox", pack_disp_vbox,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (pack_disp_vbox);
+  gtk_box_pack_start (GTK_BOX (hbox2), pack_disp_vbox, TRUE, TRUE, 0);
+
+
+
+
+  /*
+   *The packet disp frame
+   */
+
+  disp_frame = gtk_frame_new ("Packet content");
+  gtk_widget_ref (disp_frame);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "disp_frame", disp_frame,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (disp_frame);
+  gtk_box_pack_start (GTK_BOX (pack_disp_vbox), disp_frame, TRUE, TRUE, 0); /* Do not expand */
+
+
+
+  /*
+   *Scrolled window for the packet display
+   *list
+   */
+
+  scrolledwindow3 = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_ref (scrolledwindow3);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "scrolledwindow3", scrolledwindow3,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (scrolledwindow3);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow3), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+
+  gtk_container_add (GTK_CONTAINER (disp_frame), scrolledwindow3);
+
+  //gtk_box_pack_start (GTK_BOX (disp_frame), scrolledwindow3, TRUE, TRUE, 0);
+
+
+  /*
+   *The packet display list
+   */
+  packet_content_list = gtk_clist_new (4);
+  gtk_widget_ref (packet_content_list);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "packet_content_list", packet_content_list,
+                            (GtkDestroyNotify) gtk_widget_unref);
+
+
+  gtk_widget_show (packet_content_list);
+  gtk_container_add (GTK_CONTAINER (scrolledwindow3), packet_content_list);
+  gtk_clist_set_column_width (GTK_CLIST (packet_content_list), 0, 70); /* 0-7 */
+  gtk_clist_set_column_justification(GTK_CLIST (packet_content_list), 0, GTK_JUSTIFY_CENTER);
+  gtk_clist_set_column_width (GTK_CLIST (packet_content_list), 1, 70); /* 8-15 */
+  gtk_clist_set_column_justification(GTK_CLIST (packet_content_list), 1, GTK_JUSTIFY_CENTER);
+  gtk_clist_set_column_width (GTK_CLIST (packet_content_list), 2, 70); /* 16-23 */
+  gtk_clist_set_column_justification(GTK_CLIST (packet_content_list), 2, GTK_JUSTIFY_CENTER);
+  gtk_clist_set_column_width (GTK_CLIST (packet_content_list), 3, 70); /* 24-31 */
+  gtk_clist_set_column_justification(GTK_CLIST (packet_content_list), 3, GTK_JUSTIFY_CENTER);
+  gtk_clist_column_titles_show (GTK_CLIST (packet_content_list));
+
+  label13 = gtk_label_new ("0 - 7");
+  gtk_widget_ref (label13);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "label13", label13,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label13);
+  gtk_clist_set_column_widget (GTK_CLIST (packet_content_list), 0, label13);
+
+  label14 = gtk_label_new ("8 - 15");
+  gtk_widget_ref (label14);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "label14", label14,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label14);
+  gtk_clist_set_column_widget (GTK_CLIST (packet_content_list), 1, label14);
+
+  label15 = gtk_label_new ("16 - 23");
+  gtk_widget_ref (label15);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "label15", label15,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label15);
+  gtk_clist_set_column_widget (GTK_CLIST (packet_content_list), 2, label15);
+
+  label16 = gtk_label_new ("24 - 31");
+  gtk_widget_ref (label16);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "label16", label16,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label16);
+  gtk_clist_set_column_widget (GTK_CLIST (packet_content_list), 3, label16);
+
+  //gtk_clist_set_selection_mode(GTK_CLIST (packet_content_list), GTK_SELECTION_NONE); /* no selections */
+
+
+
+  /*
+   *The packet button
+   */
+
+  packet_disp_button = gtk_button_new_with_label ("Display hex");
+  gtk_widget_ref (packet_disp_button);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "packet_disp_button", packet_disp_button,
+                            (GtkDestroyNotify) gtk_widget_unref);
+
+  /* Connect the "clicked" signal of the button to our callback */
+  gtk_signal_connect (GTK_OBJECT (packet_disp_button), "clicked",
+                     GTK_SIGNAL_FUNC (packet_disp_callback), NULL);
+  gtk_widget_show (packet_disp_button);
+  gtk_box_pack_start (GTK_BOX (pack_disp_vbox), packet_disp_button, FALSE, FALSE, 5);
+
+
+  /*
+   *The "packets" notebook
+   */
+
+  label_packets = gtk_label_new ("Packets");
+  gtk_widget_ref (label_packets);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "label_packets", label_packets,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label_packets);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 1), label_packets);
+
+
+
+
+
+
+  /*
+   *The route hbox
+   */
+  route_hbox1 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_ref (route_hbox1);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "route_hbox1", route_hbox1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (route_hbox1);
+  //gtk_box_pack_start (GTK_BOX (hbox1), vbox1, TRUE, TRUE, 1);
+  gtk_container_add (GTK_CONTAINER (notebook1), route_hbox1);
+
+
+
+
+  /*
+   *The routes frame
+   */
+
+  route_frame = gtk_frame_new ("OLSR routes in kernel:");
+  gtk_widget_ref (route_frame);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "route_frame", route_frame,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (route_frame);
+
+  //gtk_container_add (GTK_CONTAINER (notebook1), route_frame);
+  gtk_widget_set_size_request(route_frame, 200, -1);
+  gtk_box_pack_start (GTK_BOX (route_hbox1), route_frame, TRUE, TRUE, 0); /* Do not expand */
+
+
+
+  /*
+   *Scrolled window for the packet display
+   *list
+   */
+
+  route_scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_ref (route_scrolledwindow);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "route_scrolledwindow", route_scrolledwindow,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (route_scrolledwindow);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (route_scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+
+  gtk_container_add (GTK_CONTAINER (route_frame), route_scrolledwindow);
+
+  //gtk_box_pack_start (GTK_BOX (route_frame), scrolledwindow3, TRUE, TRUE, 0);
+
+
+  /*
+   *The routes display list
+   */
+  route_list = gtk_clist_new (4);
+  gtk_widget_ref (route_list);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "route_list", route_list,
+                            (GtkDestroyNotify) gtk_widget_unref);
+
+  gtk_widget_show (route_list);
+  gtk_container_add (GTK_CONTAINER (route_scrolledwindow), route_list);
+  gtk_clist_set_column_width (GTK_CLIST (route_list), 0, 120); /* dest */
+  //gtk_clist_set_column_justification(GTK_CLIST (route_list), 0, GTK_JUSTIFY_CENTER);
+  gtk_clist_set_column_width (GTK_CLIST (route_list), 1, 120); /* gw */
+  //gtk_clist_set_column_justification(GTK_CLIST (route_list), 1, GTK_JUSTIFY_CENTER);
+  gtk_clist_set_column_width (GTK_CLIST (route_list), 2, 50); /* weight */
+  gtk_clist_set_column_justification(GTK_CLIST (route_list), 2, GTK_JUSTIFY_CENTER);
+  gtk_clist_set_column_width (GTK_CLIST (route_list), 3, 70); /* interface */
+  gtk_clist_set_column_justification(GTK_CLIST (route_list), 3, GTK_JUSTIFY_CENTER);
+  gtk_clist_column_titles_show (GTK_CLIST (route_list));
+
+  route_label1 = gtk_label_new ("Destination");
+  gtk_widget_ref (route_label1);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "route_label1", route_label1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (route_label1);
+  gtk_clist_set_column_widget (GTK_CLIST (route_list), 0, route_label1);
+
+  route_label2 = gtk_label_new ("Gateway");
+  gtk_widget_ref (route_label2);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "route_label2", route_label2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (route_label2);
+  gtk_clist_set_column_widget (GTK_CLIST (route_list), 1, route_label2);
+
+  route_label3 = gtk_label_new ("Weight");
+  gtk_widget_ref (route_label3);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "route_label3", route_label3,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (route_label3);
+  gtk_clist_set_column_widget (GTK_CLIST (route_list), 2, route_label3);
+
+  route_label4 = gtk_label_new ("Interface");
+  gtk_widget_ref (route_label4);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "route_label4", route_label4,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (route_label4);
+  gtk_clist_set_column_widget (GTK_CLIST (route_list), 3, route_label4);
+
+  //gtk_clist_set_selection_mode(GTK_CLIST (route_list), GTK_SELECTION_NONE); /* no selections */
+
+
+
+  /*
+   *The routes stats frame
+   */
+
+  route_stats_frame = gtk_frame_new ("Stats:");
+  gtk_widget_ref (route_stats_frame);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "route_stats_frame", route_stats_frame,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (route_stats_frame);
+
+  //gtk_container_add (GTK_CONTAINER (notebook1), route_frame);
+  gtk_box_pack_start (GTK_BOX (route_hbox1), route_stats_frame, TRUE, TRUE, 1);
+
+
+
+
+
+  /*
+   *The "routes" notebook
+   */
+  label_routes = gtk_label_new ("Routes");
+  gtk_widget_ref (label_routes);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "label_routes", label_routes,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label_routes);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 2), label_routes);
+
+
+
+
+  empty1 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (empty1);
+  gtk_container_add (GTK_CONTAINER (notebook1), empty1);
+
+
+
+
+
+
+
+  /*
+   *The "traffic" notebook
+   */
+  traffic_label = gtk_label_new ("Traffic");
+  gtk_widget_ref (traffic_label);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "traffic_label", traffic_label,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (traffic_label);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 3), traffic_label);
+  
+
+
+
+
+  /*
+   *The settings hbox
+   */
+  settings_hbox1 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_ref (settings_hbox1);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "settings_hbox1", settings_hbox1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (settings_hbox1);
+  //gtk_box_pack_start (GTK_BOX (hbox1), vbox1, TRUE, TRUE, 1);
+  gtk_container_add (GTK_CONTAINER (notebook1), settings_hbox1);
+
+
+
+  /*
+   *The settings-info label field
+   */
+  info_label = gtk_label_new(NULL);
+  gtk_widget_ref (info_label);
+  gtk_misc_set_alignment((GtkMisc *)info_label, 0, 0);
+  //gtk_label_set_justify((GtkLabel *)net_label,GTK_JUSTIFY_LEFT);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "info_label", info_label,
+                            (GtkDestroyNotify) gtk_widget_unref);
+
+  //set_net_info("Not connected...");
+  gtk_widget_show (info_label);
+  gtk_box_pack_start (GTK_BOX (settings_hbox1), info_label, TRUE, TRUE, 0);
+
+
+  /*
+   *The "settings" notebook
+   */
+  settings_label = gtk_label_new ("Settings");
+  gtk_widget_ref (settings_label);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "settings_label", settings_label,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (settings_label);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 4), settings_label);
+
+
+
+
+
+
+
+  /*
+   *The "about" hbox
+   */
+  about_hbox1 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_ref (about_hbox1);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "about_hbox1", about_hbox1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (about_hbox1);
+  //gtk_box_pack_start (GTK_BOX (hbox1), vbox1, TRUE, TRUE, 1);
+  gtk_container_add (GTK_CONTAINER (notebook1), about_hbox1);
+  gtk_container_set_border_width (GTK_CONTAINER (about_hbox1), 10);
+
+
+  /*
+   *The about label field
+   */
+  about_label = gtk_label_new(NULL);
+  gtk_widget_ref (about_label);
+  gtk_misc_set_alignment((GtkMisc *)about_label, 0, 0);
+  gtk_label_set_justify((GtkLabel *)about_label,GTK_JUSTIFY_CENTER);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "about_label", about_label,
+                            (GtkDestroyNotify) gtk_widget_unref);
+
+  //set_net_info("Not connected...");
+  gtk_widget_show (about_label);
+  gtk_box_pack_start (GTK_BOX (about_hbox1), unik_logo, TRUE, TRUE, 0);
+  gtk_box_pack_start (GTK_BOX (about_hbox1), about_label, TRUE, TRUE, 0);
+  gtk_widget_show (unik_logo);
+
+
+  gtk_label_set_text((GtkLabel *)about_label, "OLSRD-GUI by Andreas Tonnesen (andreto@ifi.uio.no)");
+
+
+  /*
+   *The "about" notebook
+   */
+  label3 = gtk_label_new ("About");
+  gtk_widget_ref (label3);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "About", label3,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label3);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 5), label3);
+
+
+
+  return main_window;
+
+}
+
+
+
+
+/*
+ *Add a node to the node list
+ */
+void
+route_list_add(char *dest, char *gw, char *metric, char *dev)
+{
+  gchar *tmp[4] = {dest, gw, dev, metric};
+  route_list_size++;
+
+  gtk_clist_freeze(GTK_CLIST(route_list));
+
+  gtk_clist_append(GTK_CLIST(route_list), tmp);
+
+  gtk_clist_thaw(GTK_CLIST(route_list));
+
+}
+
+
+/*
+ *Update the entyr with IP 'addr'
+ */
+void
+route_list_update(char *addr)
+{
+
+}
+
+
+/*
+ *Delete a node from the node list
+ */
+int
+route_list_del(char *dest)
+{
+  int i = 0;
+  char *ip;
+
+  gtk_clist_freeze(GTK_CLIST(route_list));
+
+  for(i = 0; i < route_list_size; i++)
+    {
+      gtk_clist_get_text(GTK_CLIST(route_list), i, 0, (gchar **) &ip);
+      if(strcmp(dest, ip) == 0)
+       {
+         //printf("Found %d\n", i);
+         gtk_clist_remove(GTK_CLIST(route_list), i);
+         route_list_size--;
+         gtk_clist_thaw(GTK_CLIST(route_list));
+         return 1;
+       }
+    }
+
+  gtk_clist_thaw(GTK_CLIST(route_list));
+  return 0;  
+}
+
+
+
+/*
+ *Remove a node from the list
+ */
+int
+remove_nodes_list(union olsr_ip_addr *node)
+{
+  char *ip;
+  char *in_ip = ip_to_string(node);
+  int i;
+
+  for(i = 0; i < node_list_size; i++)
+    {
+      gtk_clist_get_text(GTK_CLIST(node_list), i, 0, (gchar **) &ip);
+      if(strcmp(in_ip, ip) == 0)
+       {
+         //printf("Found entry!\n");
+         gtk_clist_remove(GTK_CLIST(node_list), i);
+         node_list_size--;
+         return 1;
+       }
+    }
+
+  return 0;
+}
+
+
+
+
+/*
+ *If the node passed as a parameter exists then
+ *update it. If not add it to the list
+ */
+void
+update_nodes_list(struct node *node)
+{
+  int i = 0;
+  char *ip;
+  int found = 0;
+  char *dest;
+  char *tmp[9] = {"","","","","","","","",""};
+  char timer[20];
+  struct tm *time_st;
+  char itoa_buf[10];
+
+  if(memcmp(&node->addr, &main_addr, ipsize) == 0)
+    dest = "localhost";
+  else
+    dest = ip_to_string(&node->addr);
+
+  gtk_clist_freeze(GTK_CLIST(node_list));
+
+  while((i < node_list_size) && !found)
+    {
+      gtk_clist_get_text(GTK_CLIST(node_list), i, 0, (gchar **) &ip);
+      if(strcmp(dest, ip) == 0)
+       found = 1;
+      i++;
+    }
+
+  /* Update node */
+  if(found)
+    {
+      i--; /* Go backt to the right row */
+      //printf("Updating %s\n\n", ip_to_string(&node->addr));
+      /* don't update main addr */
+      /* Gateway */
+      if(memcmp(&node->addr, &main_addr, ipsize) != 0)
+       {
+         if(memcmp(&node->gw_addr, &null_addr, ipsize) != 0)
+           gtk_clist_set_text(GTK_CLIST(node_list), i, 1, ip_to_string(&node->gw_addr));
+         /* Weigth */
+         if(node->hopcount != 0)
+           {
+             gui_itoa(node->hopcount, itoa_buf);
+             gtk_clist_set_text(GTK_CLIST(node_list), i, 2, itoa_buf);
+           }
+         /* Device */
+         gtk_clist_set_text(GTK_CLIST(node_list), i, 3, &node->dev[0]);
+       }
+
+
+      /* Timer */
+      if(node->timer.tv_usec)
+      {
+       memset(&timer[0], 0, 20);
+       time_st = gmtime((time_t *)&node->timer.tv_sec);
+       sprintf(&timer[0], "%02d:%02d:%02d", time_st->tm_hour, time_st->tm_min, time_st->tm_sec);
+       gtk_clist_set_text(GTK_CLIST(node_list), i, 4, &timer[0]);
+      }
+
+
+      /* MID */
+      if(node->mid.next != &node->mid)
+       gtk_clist_set_text(GTK_CLIST(node_list), i, 5, "yes");
+      else
+       gtk_clist_set_text(GTK_CLIST(node_list), i, 5, "no");
+      /* HNA */
+      if(node->hna.next != &node->hna)
+       gtk_clist_set_text(GTK_CLIST(node_list), i, 6, "yes");
+      else
+       gtk_clist_set_text(GTK_CLIST(node_list), i, 6, "no");
+               
+    }
+  /* Add new node */
+  else
+    {
+      i = node_list_size;
+      /* Create entry */
+      gtk_clist_insert(GTK_CLIST(node_list), i, tmp);
+      /* Main address */
+      gtk_clist_set_text(GTK_CLIST(node_list), i, 0, dest);
+      if(memcmp(&node->addr, &main_addr, ipsize) == 0)
+       {
+         if(memcmp(&node->gw_addr, &null_addr, ipsize) != 0)
+           gtk_clist_set_text(GTK_CLIST(node_list), i, 1, ip_to_string(&node->gw_addr));
+         /* Weigth */
+         if(node->hopcount != 0)
+           {
+             gui_itoa(node->hopcount, itoa_buf);
+             gtk_clist_set_text(GTK_CLIST(node_list), i, 2, itoa_buf);
+           }
+         /* Device */
+         gtk_clist_set_text(GTK_CLIST(node_list), i, 3, &node->dev[0]);
+       }
+
+      /* MID */
+      if(node->mid.next != &node->mid)
+       gtk_clist_set_text(GTK_CLIST(node_list), i, 5, "yes");
+      else
+       gtk_clist_set_text(GTK_CLIST(node_list), i, 5, "no");
+      /* HNA */
+      if(node->hna.next != &node->hna)
+       gtk_clist_set_text(GTK_CLIST(node_list), i, 6, "yes");
+      else
+       gtk_clist_set_text(GTK_CLIST(node_list), i, 6, "no");
+
+      node_list_size++;
+    }
+
+  gtk_clist_thaw(GTK_CLIST(node_list));
+
+
+}
+
+
+
+
+/*
+ *Add a packet to the packet list
+ */
+void
+packet_list_add(char *type, char *from, char *length)
+{
+  gchar *nfo[3] = {type, from, length};
+
+  //if(!freeze_packets)
+    //{
+      if(packet_list_size >= MAXPACKS)
+       gtk_clist_remove(GTK_CLIST(packet_list), MAXPACKS-1);
+      else
+       packet_list_size++;
+
+      gtk_clist_prepend(GTK_CLIST(packet_list), nfo );
+
+      //}
+
+}
+
+
+
+
+
+void selection_made( GtkWidget      *clist,
+                     gint            row,
+                     gint            column,
+                    GdkEventButton *event,
+                     gpointer        data )
+{
+    gchar *ip, *hops, *gw, *dev;
+    const gchar text[100];
+    /* Get the text that is stored in the selected row and column
+     * which was clicked in. We will receive it as a pointer in the
+     * argument text.
+     */
+    gtk_clist_get_text(GTK_CLIST(clist), row, 0, &ip);
+    gtk_clist_get_text(GTK_CLIST(clist), row, 1, &gw);
+    gtk_clist_get_text(GTK_CLIST(clist), row, 2, &hops);
+    gtk_clist_get_text(GTK_CLIST(clist), row, 3, &dev);
+
+    /* Just prints some information about the selected row */
+    sprintf((char *)&text[0], "IP:%s\nGATEWAY:%s\nHOPCOUNT:%s\nINTERFACE:%s\n",
+           ip, gw, hops, dev);
+
+    //gtk_text_buffer_set_text (textBuffer, text, -1);
+
+    //gtk_text_view_set_buffer((GtkTextView *)text1, textBuffer);
+
+    //gtk_widget_show (text1);
+
+
+    return;
+}
+
+
+
+
+
+
+
+void
+node_selection(GtkWidget *clist, gint row, gint column, GdkEventButton *event, gpointer data)
+{
+
+  gchar *text;
+  struct node *host;
+  struct mid *mids;
+  struct mpr *mprs;
+  struct hna *hnas;
+  int i;
+  gchar *tmpshit[1] = {""};
+
+  /*
+   *Clear the lists
+   */
+  gtk_clist_clear(GTK_CLIST(mid_list));
+  gtk_clist_clear(GTK_CLIST(mpr_list));
+  gtk_clist_clear(GTK_CLIST(hna_list));
+  i = 0;
+
+  /*
+   *Get th IP address
+   */
+  gtk_clist_get_text(GTK_CLIST(node_list), row, 0, &text);
+
+  /* Get the node */
+  if(strncmp(text, "localhost", sizeof("localhost")) == 0)
+    host = find_node_t(&main_addr);
+  else
+    host = find_node(text);
+
+
+
+  if(host)
+    {
+      /* Timeout the registered MPRs for this node */
+      time_out_mprs(&host->addr);
+
+      /* Get mpr pointer AFTER timeout....(another waisted hour...) */ 
+      mprs = host->mpr.next;
+      mids = host->mid.next;
+      hnas = host->hna.next;
+
+      while (mids != &host->mid)
+       {
+         gtk_clist_append(GTK_CLIST(mid_list), tmpshit);
+         gtk_clist_set_text(GTK_CLIST(mid_list), i, 0, ip_to_string(&mids->alias));
+         i++;
+         mids = mids->next;
+       }
+
+      i = 0;
+
+
+      while (mprs != &host->mpr)
+       {
+         //printf("ADDING MPR : %s\n", ip_to_string(&mprs->addr));fflush(stdout);
+         gtk_clist_append(GTK_CLIST(mpr_list), tmpshit);
+         gtk_clist_set_text(GTK_CLIST(mpr_list), i, 0, ip_to_string(&mprs->addr));
+         i++;
+         mprs = mprs->next;
+       }
+      i = 0;
+
+      while (hnas != &host->hna)
+       {
+         gtk_clist_append(GTK_CLIST(hna_list), tmpshit);
+         gtk_clist_set_text(GTK_CLIST(hna_list), i, 0, ip_to_string(&hnas->net));
+         i++;
+         hnas = hnas->next;
+       }
+
+    }
+  else
+    {
+      printf("Could not find info about %s!\n", text);
+    }
+
+
+}
+
+
+
+
+void
+packet_selection(GtkWidget *clist, gint row, gint column, GdkEventButton *event, gpointer data)
+{
+  /* Fetch the packet from the cache */
+  union olsr_message *pack;
+  char *packet;
+  int y, x;
+  short size;
+  char *content[4];
+  int mem_size = 10;
+
+  content[0] = (char *)malloc(mem_size);
+  content[1] = (char *)malloc(mem_size);
+  content[2] = (char *)malloc(mem_size);
+  content[3] = (char *)malloc(mem_size);
+
+
+  pack = get_packet(row);
+  packet = (char *)pack;
+
+  //printf("Got the packet at row %d...\n", row);
+
+  gtk_clist_clear(GTK_CLIST(packet_content_list));
+
+  size = ntohs(pack->v4.olsr_msgsize);
+  
+  for(y = 0; y < size;y += 4)
+    {
+
+      for(x = 0; x < 4; x++)
+       {
+         if(display_dec)
+           sprintf(content[x], "%03i", (u_char) packet[y+x]); /* Decimal format */
+         else
+           sprintf(content[x], "%02x", (u_char) packet[y+x]); /* Hex format */     
+       }
+
+      gtk_clist_append(GTK_CLIST(packet_content_list), content);
+    }
+
+  free(content[0]);
+  free(content[1]);
+  free(content[2]);
+  free(content[3]);
+
+}
+
+
+
+
+
+
+
+void
+set_net_info(gchar *info, int disp_button)
+{
+  gchar title[255];
+
+  memset(&title[0], 0, 255);
+  gtk_label_set_text((GtkLabel *)info_label, info); 
+  gtk_label_set_text((GtkLabel *)net_label, "Connected\nto localhost"); 
+
+  strcat(title, SOFTWARE_VERSION);
+  strcat(title, " - ");
+  strcat(title, ip_to_string(&main_addr));
+
+  gtk_window_set_title (GTK_WINDOW (main_window), title);
+
+  if(disp_button)
+    gtk_widget_show(connect_button);
+  else 
+    gtk_widget_hide(connect_button);
+}
+
+
+
+void
+set_net_info_offline()
+{
+  gtk_label_set_text((GtkLabel *)net_label, "Connection refused...");
+  gtk_widget_show(connect_button);
+}
+
+void
+set_net_info_connecting()
+{
+  gtk_label_set_text((GtkLabel *)net_label, "Connecting to localhost...");  
+}
+
+
+
+void
+column_clicked_callback(GtkWidget *list,gint column)
+{
+
+  //printf("You pressed %d\n",column);
+
+}
+
+
+/*
+ *Connect button callback
+ */
+void 
+connect_callback( GtkWidget *widget,
+                 gpointer   data )
+{
+  ipc_connect();
+}
+
+
+
+/*
+ *Packet button callback
+ */
+void 
+packet_callback( GtkWidget *widget,
+                 gpointer   data )
+{
+  if(freeze_packets)
+    {
+      freeze_packets = 0;
+      gtk_button_set_label(GTK_BUTTON(packet_button), "Freeze packets");
+    }
+  else
+    {
+      freeze_packets = 1;
+      gtk_button_set_label(GTK_BUTTON(packet_button), "Grab packets");
+    }
+}
+
+
+
+/*
+ *Packet display button callback
+ */
+void 
+packet_disp_callback( GtkWidget *widget,
+                 gpointer   data )
+{
+  if(display_dec)
+    {
+      display_dec = 0;
+      gtk_button_set_label(GTK_BUTTON(packet_disp_button), "Display decimal");
+    }
+  else
+    {
+      display_dec = 1;
+      gtk_button_set_label(GTK_BUTTON(packet_disp_button), "Display hex");
+    }
+}
+
+
+
+void
+gui_shutdown(GtkObject *object, gpointer user_data)
+{
+  printf("Shutting down...\n");
+
+  if(ipc_close() < 0)
+    printf("Could not close socket!\n");
+
+  printf("BYE-BYE!\n");
+  exit(0);
+
+}
+
+
diff --git a/gui/linux-gtk/src/interface.h b/gui/linux-gtk/src/interface.h
new file mode 100644 (file)
index 0000000..67fd124
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI 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.
+ *
+ * uolsrGUI 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <time.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <gdk/gdk.h>
+#include <gdk/gdkkeysyms.h>
+
+
+
+void
+fill_clist(GtkCList *);
+
+
+void selection_made( GtkWidget      *clist,
+                     gint            row,
+                     gint            column,
+                    GdkEventButton *event,
+                     gpointer        data );
+
+
+void
+set_net_info_connecting();
+
+void
+column_clicked_callback(GtkWidget *,gint);
+
+
+void 
+connect_callback( GtkWidget *widget,
+                 gpointer   data );
+
+void 
+packet_callback( GtkWidget *widget,
+                 gpointer   data );
+
+void 
+packet_disp_callback( GtkWidget *widget,
+                 gpointer   data );
+
+
+void
+packet_selection(GtkWidget *clist, gint row, gint column, GdkEventButton *event, gpointer data);
+
+
+void
+node_selection(GtkWidget *clist, gint row, gint column, GdkEventButton *event, gpointer data);
+
+
+void
+gui_shutdown(GtkObject *, gpointer);
diff --git a/gui/linux-gtk/src/ipc.c b/gui/linux-gtk/src/ipc.c
new file mode 100644 (file)
index 0000000..40fc127
--- /dev/null
@@ -0,0 +1,771 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI 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.
+ *
+ * uolsrGUI 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include "common.h"
+#include "ipc.h"
+#include "packet.h"
+#include "routes.h"
+
+#ifdef WIN32
+#define close(x) closesocket(x)
+#undef errno
+#define errno WSAGetLastError()
+#undef strerror
+#define strerror(x) StrError(x)
+#define perror(x) WinSockPError(x)
+#endif
+
+int ipc_socket = 0;
+
+int
+ipc_get_socket()
+{
+  struct hostent *hp;
+  char *addr;
+  struct in_addr *in;
+  int sock;
+  //int flags;
+
+  
+  if ((hp = gethostbyname("localhost")) == 0) 
+    {
+      perror("gethostbyname");
+      exit(1);
+    }
+
+  in = (struct in_addr *) hp->h_addr;
+  addr = inet_ntoa(*in);
+  printf("Address: %s\n", addr);
+
+  /* fill in the socket structure with host information */
+  memset(&pin, 0, sizeof(pin));
+  pin.sin_family = AF_INET;
+  pin.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr;
+  pin.sin_port = htons(IPC_PORT);
+
+  /* grab an UNIX domain socket */
+  if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) 
+    {
+      perror("socket");
+      exit(1);
+    }
+
+  printf("Socket: %d\n", sock);
+
+  /* Setting socket non-blocking */  
+  /*  
+  if ((flags = fcntl(sock, F_GETFL, 0)) < 0)
+    {
+      fprintf(stderr,"Error getting socket flags!\n");
+      exit(1);
+    }
+  
+  
+  if (fcntl(sock, F_SETFL, flags | O_NONBLOCK) < 0)
+    {
+      fprintf(stderr,"Error setting socket flags!\n");
+      exit(1);
+    }
+  */
+
+  return sock;
+
+}
+
+
+
+int
+ipc_close()
+{
+
+  if(close(ipc_socket))
+    return 1;
+  
+  return 0;
+}
+
+
+
+int
+ipc_connect()
+{
+#ifdef WIN32
+  int On = 1;
+  unsigned long Len;
+#else
+  int flags;
+#endif
+
+  connected = 0;
+
+  printf("Attempting connect...");
+
+  if(!ipc_socket)
+    ipc_socket = ipc_get_socket();
+
+  /* connect to PORT on HOST */
+  if (connect(ipc_socket,(struct sockaddr *)  &pin, sizeof(pin)) < 0) 
+    {
+      fprintf(stderr, "Error connecting %d - %s\n", errno, strerror(errno));
+      set_net_info_offline();
+      printf("connection refused\n");
+    }
+  else 
+    {
+      set_net_info("Connected!", FALSE);
+      printf("Connected!!\n");
+
+      /* Setting socket non-blocking */  
+      
+#ifdef WIN32
+      if (WSAIoctl(ipc_socket, FIONBIO, &On, sizeof (On), NULL, 0, &Len,
+                   NULL, NULL) < 0)
+        {
+          fprintf(stderr, "Error while making socket non-blocking!\n");
+          exit(1);
+        }
+#else
+      if ((flags = fcntl(ipc_socket, F_GETFL, 0)) < 0)
+       {
+         fprintf(stderr,"Error getting socket flags!\n");
+         exit(1);
+       }
+      
+      
+      if (fcntl(ipc_socket, F_SETFL, flags | O_NONBLOCK) < 0)
+       {
+         fprintf(stderr,"Error setting socket flags!\n");
+         exit(1);
+       }
+#endif      
+      connected = 1;
+      
+      return 1;
+    }
+  
+  return 0;
+
+}
+
+
+int
+ipc_read()
+{
+  //int x, i;
+  int bytes, tmp_len;
+  char *tmp;
+  union olsr_message *msg;
+  union 
+  {
+    char       buf[BUFFSIZE+1];
+    union      olsr_message olsr_msg;
+  } inbuf;
+  //char buf[BUFFSIZE+1];
+
+  //printf(".");fflush(stdout);
+  memset(&inbuf, 0, sizeof(BUFFSIZE+1));
+  //buf[0] = '\0';
+
+  if(connected)
+    {
+      bytes = recv(ipc_socket, (char *)&inbuf, BUFFSIZE, 0);
+      if (bytes == 0)
+        {
+          shutdown(ipc_socket, SHUT_RDWR);
+         set_net_info("Disconnected from server...", TRUE);
+          connected = 0;
+         close(ipc_socket);
+        }
+     
+      if(bytes > 0)
+       {
+          
+         tmp = (char *) &inbuf.olsr_msg;
+       
+         /*    
+         x = 0;
+         printf("\n\t");
+         for(i = 0; i < bytes;i++)
+           {
+             if(x == 4)
+               {
+                 x = 0;
+                 printf("\n\t");
+               }
+             x++;
+             printf(" %03i", (u_char) tmp[i]);
+           }
+         
+         printf("\n\nBytes read: %d - msg_size: %d\n", bytes, ntohs(inbuf.olsr.v4.olsr_packlen));
+         */
+         
+         msg = &inbuf.olsr_msg;
+
+         /* There can be(there probably are!) several packets in the buffer */
+
+         /* Should be the same for v4 and v6 */
+         if(ntohs(inbuf.olsr_msg.v4.olsr_msgsize) < bytes)
+           {
+             //printf("chomping...\n");
+             while(ntohs(msg->v4.olsr_msgsize) < bytes)
+               {
+                 ipc_evaluate_message(msg);
+
+                 tmp_len = ntohs(msg->v4.olsr_msgsize);
+                 msg = (union olsr_message *) &tmp[tmp_len];
+                 tmp = &tmp[tmp_len];
+                 if(tmp_len == 0)
+                   break;
+                 bytes = bytes - tmp_len;
+
+                 tmp_len = ntohs(msg->v4.olsr_msgsize);
+
+                 //printf("%d/%d ", tmp_len, bytes);
+                 /* Copy to start of buffer */
+                 if(tmp_len > bytes)
+                   {
+                     /* Copy the buffer */
+                     //printf("READING END OF MESSAGE. %d bytes\n", tmp_len-bytes);
+                     //printf("\tCopying %d bytes\n", bytes);
+                     memcpy(&inbuf, tmp, bytes);
+                     //printf("\tRecieving %d bytes to buffer[%d]\n", tmp_len-bytes, bytes);
+                     bytes = recv(ipc_socket, (char *)&inbuf.buf[bytes], tmp_len-bytes, 0);
+                     //printf("\tBytes: %d Size: %d\n", bytes, ntohs(msgs->v4.olsr_packlen));
+                     tmp = (char *)&inbuf.olsr_msg;
+                     msg = (union olsr_message *) tmp;
+                   }
+               }
+             //printf("\n");
+           }
+         
+         /* Only one (or the last) message */
+         ipc_evaluate_message(msg);
+
+       }
+
+    }
+
+
+
+  return 1;
+}
+
+
+
+
+int
+ipc_send()
+{
+
+
+  return 1;
+}
+
+
+
+
+
+int
+ipc_evaluate_message(union olsr_message *olsr_in)
+{
+  int ipc_pack = 0;
+  olsr_u8_t type;
+  int msgsize;
+  char itoa_buf[10];
+  olsr_u8_t vtime;
+  union olsr_ip_addr *originator;
+
+  /* Find size, vtime, originator and type - same for IPv4 and 6 */
+  type = olsr_in->v4.olsr_msgtype;
+  msgsize = ntohs(olsr_in->v4.olsr_msgsize);
+  vtime = olsr_in->v4.olsr_vtime;
+  originator = (union olsr_ip_addr *)&olsr_in->v4.originator;
+
+  gui_itoa(msgsize, itoa_buf);
+
+  switch(type)
+    {
+    case HELLO_MESSAGE:
+      //printf("Recieved HELLO packet\n");
+      if(!freeze_packets)
+       packet_list_add("HELLO", ip_to_string(originator), itoa_buf);
+
+      if(ipversion == AF_INET)
+       {
+         process_hello(msgsize, vtime, originator, (union hello_message *)&olsr_in->v4.message.hello);
+       }
+      else
+       {
+         process_hello(msgsize, vtime, originator, (union hello_message *)&olsr_in->v6.message.hello);
+       }
+      break;
+
+    case TC_MESSAGE:
+      if(!freeze_packets)
+       packet_list_add("TC", ip_to_string(originator), itoa_buf);
+      
+      if(ipversion == AF_INET)
+       {
+         process_tc(msgsize, vtime, originator, (union tc_message *)&olsr_in->v4.message.tc);
+         //printf("Recieved TC packet from %s\n", ip_to_string(&m->olsr_tc->tc_origaddr));
+       }
+      else
+       {
+         process_tc(msgsize, vtime, originator, (union tc_message *)&olsr_in->v6.message.tc);
+         //printf("Recieved TC packet from %s\n", ip_to_string(&m->olsr_tc->tc_origaddr));
+       }
+      break;
+
+    case MID_MESSAGE:
+      if(!freeze_packets)
+       packet_list_add("MID", ip_to_string(originator), itoa_buf);
+      if(ipversion == AF_INET)
+       {
+         process_mid(msgsize, vtime, originator, (union mid_message *)&olsr_in->v4.message.mid);
+         //printf("Recieved MID packet from %s\n", ip_to_string(&m->olsr_mid->mid_origaddr));
+       }
+      else
+       {
+         process_mid(msgsize, vtime, originator, (union mid_message *)&olsr_in->v6.message.mid);
+         //printf("Recieved MID packet from %s\n", ip_to_string(&m->olsr_mid->mid_origaddr));
+       }
+      
+      break;
+
+    case HNA_MESSAGE:
+
+      if(!freeze_packets)
+       packet_list_add("HNA", ip_to_string(originator), itoa_buf);
+      if(ipversion == AF_INET)
+       {
+         process_hna(msgsize, vtime, originator, (union hna_message *)&olsr_in->v4.message.hna);
+         //printf("Recieved HNA packet\n");
+       }
+      else
+       {
+         process_hna(msgsize, vtime, originator, (union hna_message *)&olsr_in->v6.message.hna);
+         //printf("Recieved HNA packet\n");
+       }
+      
+      break;
+
+    case IPC_MESSAGE:
+      //printf("Recieved IPC packet\n");
+      ipc_pack = 1; /* Don't add to buffer */
+      ipc_eval_route_packet((struct routemsg *) olsr_in);      
+      break;
+    case IPC_NET:
+      //printf("Recieved IPC packet\n");
+      ipc_pack = 1; /* Don't add to buffer */
+      ipc_eval_net_info((struct netmsg *) olsr_in);      
+      break;
+    default:
+      if(!freeze_packets)
+       packet_list_add("UNKNOWN", "?", "?");
+
+       printf("Unknown packet type %d\n", type);
+      
+    }
+  
+  if(!freeze_packets && !ipc_pack)
+    {
+         add_packet_to_buffer(olsr_in, msgsize);
+    }
+
+
+  return 1;
+}
+
+
+
+int
+ipc_eval_net_info(struct netmsg *msg)
+{
+  char info[256];
+  printf("Evaluating NET info...\n");
+
+  /*
+  printf("\tMain address: %s\n", ip_to_string(&msg->main_addr));
+  printf("\tMid adresses: %d\n", msg->mids);
+  printf("\tHna adresses: %d\n", msg->hnas);
+  printf("\tHELLO interval: %f\n", (float)(ntohs(msg->hello_int)));
+  printf("\tHELLO LAN interval: %f\n", (float)(ntohs(msg->hello_lan_int)));
+  printf("\tTC interval: %d\n", ntohs(msg->tc_int));
+  printf("\tNeighbor hold time: %d\n", ntohs(msg->neigh_hold));
+  printf("\tTopology hold: %d\n", ntohs(msg->topology_hold));
+  */
+  if(msg->ipv6 == 0)
+    {
+      ipversion = AF_INET;
+      ipsize = sizeof(struct in_addr);
+      sprintf(&info[0],"IP version 4\nMain address: %s\nMid addresses: %d\nHna addresses: %d\nHELLO interval: %d\nHELLO LAN interval: %d\nTC interval: %d\nNeighbor hold time: %d\nTopology hold: %d\n", ip_to_string(&msg->main_addr), msg->mids, msg->hnas, ntohs(msg->hello_int), ntohs(msg->hello_lan_int), ntohs(msg->tc_int), ntohs(msg->neigh_hold), ntohs(msg->topology_hold));
+   }
+  else
+    {
+      ipversion = AF_INET6;
+      ipsize = sizeof(struct in6_addr);
+      sprintf(&info[0],"IP version 6\nMain address: %s\nMid addresses: %d\nHna addresses: %d\nHELLO interval: %d\nHELLO LAN interval: %d\nTC interval: %d\nNeighbor hold time: %d\nTopology hold: %d\n", ip_to_string(&msg->main_addr), msg->mids, msg->hnas, ntohs(msg->hello_int), ntohs(msg->hello_lan_int), ntohs(msg->tc_int), ntohs(msg->neigh_hold), ntohs(msg->topology_hold));
+    }
+
+
+
+  memcpy(&main_addr, &msg->main_addr, ipsize);
+
+  set_net_info(&info[0], 0);
+
+
+  return 0;
+}
+
+
+int
+ipc_eval_route_packet(struct routemsg *msg)
+{
+  struct route_entry rt_ent;
+  char dev[5];
+  char gw[16];
+  char itoa_buf[10];
+  dev[4] = '\0';
+  memset(&gw[0], 0, 16);
+
+  printf("Processing route packet\n"); 
+
+  memset(rt_ent.if_name, 0, MAX_IF_NAMESIZ);
+  
+  /* Fill struct */
+  
+  memcpy(&rt_ent.gw, &msg->gateway_addr, ipsize);
+  memcpy(&rt_ent.dst, &msg->target_addr, ipsize);
+  memcpy(rt_ent.if_name, msg->device, 4);
+  rt_ent.hopcnt = msg->metric;
+
+  if(msg->add)
+    {
+      memcpy(&dev[0], &msg->device[0], 4);
+
+      /*Add node to node list */
+      memcpy(&gw[0], ip_to_string(&msg->gateway_addr), 16);
+
+      gui_itoa(msg->metric, itoa_buf);
+
+      route_list_add(ip_to_string(&msg->target_addr),
+                    gw,
+                    dev,
+                    itoa_buf);
+
+      printf("\tRoute to %s(hc %d) added\n", ip_to_string(&msg->target_addr), rt_ent.hopcnt);
+
+      /*
+      printf("\tRoute to %s added\n", ip_to_string(&msg->target_addr));
+      printf("\tGateway %s\n", gw);
+      printf("\tInterface %s\n", msg->device);
+      printf("\tMetric %d\n", msg->metric);
+      */
+    }
+  else
+    {
+
+      if(route_list_del(ip_to_string(&msg->target_addr)) < 1)
+       printf("COULD NOT FIND ROUTE TO DELETE!\n\n");
+
+      printf("\tRoute to %s deleted\n", ip_to_string(&msg->target_addr));
+    }
+  return 1;
+}
+
+
+
+
+int
+process_hello(int size, olsr_u8_t vtime, union olsr_ip_addr *originator, union hello_message *m)
+{
+  struct hellinfo *neigh;
+  struct hellinfo6 *neigh6;
+  int i;
+  int nsize;
+  int type, link;
+
+
+  printf("Processing HELLO from %s size = %d\n", ip_to_string(originator), size);
+
+
+  if(!update_timer_node(originator, vtime))
+    add_node(originator, vtime);
+
+  /* Add neighbors if any */
+  size = size - 4 - 8 - ipsize; /* size of neighbors(size - olsrheder- helloheader) */
+
+  if(!size)
+    return 0;
+
+
+  /* Get the neighbortype-blocks start */
+  neigh = m->v4.hell_info;
+  neigh6 = m->v6.hell_info;
+
+  //printf("HELLO Size: %d\n", size);
+
+  while(size > 0)
+    {
+
+      //printf("\tNEIGH: 0x%x\n", (int)neigh);
+      if(ipversion == AF_INET)
+       {
+         nsize = ntohs(neigh->size);
+         type = EXTRACT_STATUS(ntohs(neigh->link_code));
+         link = EXTRACT_LINK(ntohs(neigh->link_code));
+         //printf("TYPE: %d\n", neigh->link_code);
+       }
+      else
+       {
+         nsize = ntohs(neigh6->size);
+         type = EXTRACT_STATUS(ntohs(neigh6->link_code));
+         link = EXTRACT_LINK(ntohs(neigh6->link_code));
+       }
+
+
+      size -= nsize;
+
+      nsize = nsize - 4; /* - hellinfo header */
+      //printf("Size left: %d Current hellinfo: %d\n", size, nsize);
+      i = 0;
+      while(nsize > 0)
+       {
+         //printf("Adding neighbor %s...\n", ip_to_string((union olsr_ip_addr *)&neigh->neigh_addr[i]));
+         /*
+          if(MPR)
+         update_timer_mpr((union olsr_ip_addr *)&mprsinfo->addr, originator);
+         */
+         
+         if(ipversion == AF_INET) /* Update MPRs */
+           {
+             if(type == MPR_NEIGH)
+               {
+                 //printf("MPR from HELLO\n");
+                 update_timer_mpr((union olsr_ip_addr *)&neigh->neigh_addr[i], originator, vtime);
+               }
+             add_node((union olsr_ip_addr *)&neigh->neigh_addr[i++], vtime);
+           }
+         else
+           {
+             if(type == MPR_NEIGH) /* Update MPRs */
+               {
+                 //printf("MPR from HELLO\n");
+                 update_timer_mpr((union olsr_ip_addr *)&neigh6->neigh_addr[i], originator, vtime);
+               }
+             add_node((union olsr_ip_addr *)&neigh6->neigh_addr[i++], vtime);
+           }
+
+         nsize = nsize - ipsize;
+         //printf("Nsize: %d\n", nsize);
+       }
+      neigh = (struct hellinfo *) &neigh->neigh_addr[i];
+      neigh6 = (struct hellinfo6 *) &neigh6->neigh_addr[i];
+
+      
+    }
+  //printf("DONE\n");
+
+  return 0;
+}
+
+
+
+
+int
+process_tc(int size, olsr_u8_t vtime, union olsr_ip_addr *originator, union tc_message *m)
+{
+
+  struct neigh_info *mprsinfo;
+  struct neigh_info6 *mprsinfo6;
+
+  printf("Processing TC from %s size = %d\n", ip_to_string(originator), size);
+
+  /* Updating timer */
+  if(!update_timer_node(originator, vtime))
+    add_node(originator, vtime);
+
+  /* Calculate size of the mprsinfo */
+  size = size - 4 - 8 - ipsize;
+
+  //printf("TC Size: %d\n", size);
+
+  if(ipversion == AF_INET)
+    mprsinfo =  &m->v4.neigh[0];
+  else
+    mprsinfo6 =  &m->v6.neigh[0];
+
+
+  while(size > 0)
+    {
+      if(ipversion == AF_INET)
+       {
+         //printf("\tprocessing TC: %s\n", ip_to_string((union olsr_ip_addr *)&mprsinfo->addr));
+         add_node((union olsr_ip_addr *)&mprsinfo->addr, vtime);
+         update_timer_mpr((union olsr_ip_addr *)&mprsinfo->addr, originator, vtime);
+         mprsinfo++;
+       }
+      else
+       {
+         //printf("\tprocessing TC: %s\n", ip_to_string((union olsr_ip_addr *)&mprsinfo6->addr));
+         //printf("TC: add node %s\n", ip_to_string((union olsr_ip_addr *)&mprsinfo6->addr));
+         add_node((union olsr_ip_addr *)&mprsinfo6->addr, vtime);
+         update_timer_mpr((union olsr_ip_addr *)&mprsinfo6->addr, originator, vtime);
+         mprsinfo6++;
+       }
+      size = size - ipsize;
+      //printf("\tsize: %d\n", size);
+    }
+  //printf("DONE\n");
+
+  return 0;
+}
+
+
+
+int
+process_mid(int size, olsr_u8_t vtime, union olsr_ip_addr *originator, union mid_message *m)
+{
+  struct midaddr *midaddr;
+  struct midaddr6 *midaddr6;
+
+
+  printf("Processing MID from %s size = %d\n", ip_to_string(originator), size);
+
+  /* Calculate size of the midinfo */
+  size = size - 4 - 4 - ipsize;
+
+  if(ipversion == AF_INET)
+    midaddr =  &m->v4.mid_addr[0];
+  else
+    midaddr6 =  &m->v6.mid_addr[0];
+
+  //printf("MID size: %d\n", size);
+
+  while(size > 0)
+    {
+      if(ipversion == AF_INET)
+       {
+         //printf("MID: add node %s\n", ip_to_string((union olsr_ip_addr *)&midaddr->addr));
+         add_mid_node(originator, (union olsr_ip_addr *)&midaddr->addr, vtime);
+         midaddr++;
+       }
+      else
+       {
+         add_mid_node(originator, (union olsr_ip_addr *)&midaddr6->addr, vtime);
+         //printf("MID: add node %s\n", ip_to_string((union olsr_ip_addr *)&midaddr6->addr));
+         midaddr6++;
+       }
+      size = size - ipsize;
+    }
+
+  //printf("DONE\n");
+  return 0;
+}
+
+
+
+
+int
+process_hna(int size, olsr_u8_t vtime, union olsr_ip_addr *originator, union hna_message *m)
+{
+
+
+  printf("Processing HNA size = %d\n", size);
+  struct hnapair *hnapairs;
+  struct hnapair6 *hnapairs6;
+
+  /* Calculate size of the hnainfo */
+  size = size - 4 - 4 - ipsize;
+
+  if(ipversion == AF_INET)
+    hnapairs =  &m->v4.hna_net[0];
+  else
+    hnapairs6 =  &m->v6.hna_net[0];
+
+
+  while(size > 0)
+    {
+      if(ipversion == AF_INET)
+       {
+         //printf("\tHNA:%s\n", ip_to_string((union olsr_ip_addr *)&hnapairs->addr));
+         add_hna_node(originator, (union olsr_ip_addr *)&hnapairs->addr, (union olsr_ip_addr *)&hnapairs->netmask, vtime);
+         hnapairs++;
+       }
+      else
+       {
+         add_hna_node(originator, (union olsr_ip_addr *)&hnapairs6->addr, (union olsr_ip_addr *)&hnapairs6->netmask, vtime);
+         hnapairs6++;
+       }
+
+      size = size - ipsize - ipsize;
+    }
+
+
+  return 0;
+}
+
+
+
+
+
+
+char *
+ip_to_string(union olsr_ip_addr *addr)
+{
+  char *ret;
+  struct in_addr in;
+  
+  if(ipversion == AF_INET)
+    {
+      in.s_addr=addr->v4;
+      ret = inet_ntoa(in);
+    }
+  else
+    {
+      /* IPv6 */
+      ret = (char *)inet_ntop(AF_INET6, &addr->v6, ipv6_buf, sizeof(ipv6_buf));
+    }
+
+  return ret;
+
+}
+
+
+
+
+int
+gui_itoa(int i, char *buf)
+{
+  char tmp[10];
+
+  if(sprintf(buf, "%hd", i))
+  {
+      /* This shitty string needs to be converted to UTF-8 */
+    strcpy(tmp, g_locale_to_utf8(buf, -1, NULL, NULL, NULL));
+    strcpy(buf, tmp);
+    return 1;
+    //return ret;
+  }
+  return 0;
+}
diff --git a/gui/linux-gtk/src/ipc.h b/gui/linux-gtk/src/ipc.h
new file mode 100644 (file)
index 0000000..02a60db
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI 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.
+ *
+ * uolsrGUI 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <string.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include "olsr_protocol.h"
+#include "packet.h"
+
+#define IPC_PORT 1212
+#define        IPC_MESSAGE 11    /* IPC to front-end telling of route changes */
+#define IPC_NET 12       /* IPC to front end net-info */
+
+
+//int ipc_socket;
+struct sockaddr_in pin;
+int connected;
+
+
+/*
+ *AND:
+ *IPC message sent to the front-end
+ *at every route update. Both delete
+ *and add
+ */
+
+struct routemsg 
+{
+  olsr_u8_t      msgtype;
+  olsr_u16_t     size;
+  olsr_u8_t      metric;
+  olsr_u8_t      add;
+  union olsr_ip_addr target_addr;
+  union olsr_ip_addr gateway_addr;
+  char           device[4];
+};
+
+
+struct netmsg
+{
+  olsr_u8_t      msgtype;
+  olsr_u16_t     size;
+  olsr_u8_t      mids; /* No. of extra interfaces */
+  olsr_u8_t      hnas; /* No. of HNA nets */
+  olsr_u8_t      unused1;
+  olsr_u16_t     hello_int;
+  olsr_u16_t     hello_lan_int;
+  olsr_u16_t     tc_int;
+  olsr_u16_t     neigh_hold;
+  olsr_u16_t     topology_hold;
+  olsr_u8_t      ipv6;
+  union olsr_ip_addr   main_addr;
+};
+
+/*
+ *Private functions
+ */
+
+int
+ipc_get_socket();
+
+int
+ipc_evaluate_message(union olsr_message *);
+
+int
+ipc_eval_route_packet(struct routemsg *);
+
+int
+ipc_eval_net_info(struct netmsg *);
+
+int
+process_hello(int, olsr_u8_t, union olsr_ip_addr *, union hello_message *);
+
+int
+process_tc(int, olsr_u8_t, union olsr_ip_addr *, union tc_message *);
+
+int
+process_mid(int, olsr_u8_t, union olsr_ip_addr *, union mid_message *);
+
+int
+process_hna(int, olsr_u8_t, union olsr_ip_addr *, union hna_message *);
diff --git a/gui/linux-gtk/src/main.c b/gui/linux-gtk/src/main.c
new file mode 100644 (file)
index 0000000..b368b56
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI 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.
+ *
+ * uolsrGUI 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include "common.h"
+#include "main.h"
+
+int
+main (int argc, char *argv[])
+{
+#ifdef WIN32
+  WSADATA WsaData;
+#endif
+  GtkWidget *main_window;
+
+#ifdef WIN32
+  if (WSAStartup(0x0202, &WsaData))
+    {
+      fprintf(stderr, "Could not initialize WinSock.\n");
+      exit(1);
+    }
+#endif
+
+  gtk_init (&argc, &argv);
+
+  init_nodes();
+
+  freeze_packets = 1;
+  display_dec = 1;
+
+  /* "Failsafe" values */
+  ipversion = AF_INET;
+  ipsize = sizeof(struct in_addr);
+
+  main_window = create_main_window ();
+  gtk_widget_show (main_window);
+
+  printf("Done building GUI\n");
+
+  memset(&main_addr, 0, sizeof(union olsr_ip_addr));
+  memset(&null_addr, 0, sizeof(union olsr_ip_addr));
+
+  /* Terminate signal */
+  signal(SIGINT, shutdown_);  
+
+  /* Init node timeout */
+  nodes_timeout = NEIGHB_HOLD_TIME_NW;
+  init_timer((olsr_u32_t) (nodes_timeout * 1000), &hold_time_nodes);
+
+  ipc_connect();
+
+  add_timeouts();
+
+  gtk_main ();
+  return 0;
+}
+
+
+
+/*
+ *Timeouts
+ */
+
+int
+add_timeouts()
+{
+
+  /*
+   *Check socket for messages every IPC_INTERVAL
+   *milliseconds
+   */
+  gtk_timeout_add(IPC_INTERVAL, ipc_timeout, NULL);
+
+
+  /*
+   *Time out nodes
+   */
+  timeouts = 5; /* Wait 5 times befor starting timing out nodes */
+  gtk_timeout_add(TOP_HOLD_TIME, time_out_nodes, NULL);
+
+
+ return 1;
+}
+
+
+
+gint ipc_timeout(gpointer data)
+{
+
+  ipc_read();
+  return 1;
+}
+
+
+
+void
+shutdown_(int signal)
+{
+  printf("Cleaning up...\n");
+
+  if(ipc_close() < 0)
+    printf("Could not close socket!\n");
+
+  printf("BYE-BYE!\n");
+  exit(signal);
+}
diff --git a/gui/linux-gtk/src/main.h b/gui/linux-gtk/src/main.h
new file mode 100644 (file)
index 0000000..f4b0488
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI 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.
+ *
+ * uolsrGUI 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include <signal.h>
+
+int timeouts;
+
+
+int
+add_timeouts();
+
+
+gint
+ipc_timeout(gpointer);
+
+
+void
+shutdown_(int);
diff --git a/gui/linux-gtk/src/nodes.c b/gui/linux-gtk/src/nodes.c
new file mode 100644 (file)
index 0000000..e466179
--- /dev/null
@@ -0,0 +1,739 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI 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.
+ *
+ * uolsrGUI 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include "common.h"
+#include "nodes.h"
+#include <math.h>
+
+
+void
+init_nodes()
+{
+
+  nodes.next = &nodes;
+  nodes.prev = &nodes;
+}
+
+/*
+ *Insert a new node in the list
+ *NB! The list is NOT checked for duplicates!!
+ */
+struct node *
+insert_node(struct node *n, olsr_u8_t vtime)
+{
+  struct node *new_node;
+
+  printf("Inserting node %s\n", ip_to_string((union olsr_ip_addr *)&n->addr));
+
+  if((new_node = malloc(sizeof(struct node))) == 0)
+    {
+      fprintf(stderr, "OUT OF MEMORY!\n");
+      exit(1);
+    }
+
+  memcpy(new_node, n, sizeof(struct node));
+  
+  /* queue */
+  nodes.next->prev = new_node;
+  new_node->next = nodes.next;
+  nodes.next = new_node;
+  new_node->prev = &nodes;
+
+  new_node->hna.next = &new_node->hna;
+  new_node->hna.prev = &new_node->hna;
+  new_node->mid.next = &new_node->mid;
+  new_node->mid.prev = &new_node->mid;
+  new_node->mpr.next = &new_node->mpr;
+  new_node->mpr.prev = &new_node->mpr;
+
+
+  update_timer_node(&n->addr, vtime);
+
+  return new_node;
+}
+
+
+/**
+ *Add a new node to the set
+ */
+int
+add_node(union olsr_ip_addr *node, olsr_u8_t vtime)
+{
+  struct node new;
+  struct node *tmp_nodes;
+  struct timeval tmp_timer;
+  double dbl_time;
+  olsr_u32_t time_value;
+  struct mid *tmp_mid;
+
+  dbl_time = me_to_double(vtime);
+  time_value = (olsr_u32_t) dbl_time*1000;
+
+  tmp_timer.tv_sec = time_value/1000;
+  tmp_timer.tv_usec = (time_value-(tmp_timer.tv_sec*1000)) * 1000;   
+
+  /* Check if node exists */
+  for(tmp_nodes = nodes.next;
+      tmp_nodes != &nodes;
+      tmp_nodes = tmp_nodes->next)
+    {
+      if(memcmp(&tmp_nodes->addr, node, ipsize) == 0)
+       {
+         //printf("updating timer for node %s\n", ip_to_string(node));
+         //printf("Updatimng timer for: %s\n", ip_to_string(node));
+         //printf("Secs: %d, usecs: %d\n", (int)tmp_timer.tv_sec, (int)tmp_timer.tv_usec);
+         gettimeofday(&now, (struct timezone *)NULL);
+         timeradd(&now, &tmp_timer, &tmp_nodes->timer);
+         return 0; 
+       }
+      /* Check MID */
+      for(tmp_mid = tmp_nodes->mid.next;
+         tmp_mid != &tmp_nodes->mid;
+         tmp_mid = tmp_mid->next)
+       {
+         if(memcmp(&tmp_mid->alias, node, ipsize) == 0)
+           {
+             //printf("updating timer for node %s\n", ip_to_string(node));
+             //printf("Updatimng timer for (MID): %s\n", ip_to_string(&tmp_nodes->addr));
+             //printf("Secs: %d, usecs: %d\n", (int)tmp_timer.tv_sec, (int)tmp_timer.tv_usec);
+             gettimeofday(&now, (struct timezone *)NULL);
+             timeradd(&now, &tmp_timer, &tmp_nodes->timer);
+             return 0; 
+           }
+       }
+    }
+
+  /* New node */
+  memset(&new, 0, sizeof(struct node));
+  memcpy(&new.addr, node, ipsize);
+  new.display = 1;
+  printf("1:");
+  insert_node(&new, vtime);
+  update_nodes_list(&new);
+  return 1;
+}
+
+
+int
+update_timer_node(union olsr_ip_addr *node, olsr_u8_t vtime)
+{
+  struct node *tmp_nodes;
+  struct timeval tmp_timer;
+  double dbl_time;
+  olsr_u32_t time_value;
+
+  dbl_time = me_to_double(vtime);
+  time_value = (olsr_u32_t) dbl_time*1000;
+
+  tmp_timer.tv_sec = time_value/1000;
+  tmp_timer.tv_usec = (time_value-(tmp_timer.tv_sec*1000)) * 1000;   
+
+  //printf("Updatimng timer for: %s\n", ip_to_string(node));
+  //printf("Secs: %d, usecs: %d\n", (int)tmp_timer.tv_sec, (int)tmp_timer.tv_usec);
+
+  for(tmp_nodes = nodes.next;
+      tmp_nodes != &nodes;
+      tmp_nodes = tmp_nodes->next)
+    {
+      if(memcmp(&tmp_nodes->addr, node, ipsize) == 0)
+       {
+         //printf("updating timer for node %s\n", ip_to_string(node));
+         gettimeofday(&now, (struct timezone *)NULL);
+         timeradd(&now, &tmp_timer, &tmp_nodes->timer);
+         if(tmp_nodes->display)
+           update_nodes_list(tmp_nodes);
+         return 1; 
+       }
+    }
+  
+  return 0;
+}
+
+
+/**
+ *Updates the hold time for the mpr 'mpr' registered on
+ *the node 'node'. Adds the mpr to the node if not already
+ *registered.
+ *@param node the node that has chosen the MPR
+ *@param mpr the MPR chosen by the node
+ *@return 0 if node was added, 1 if not
+ */
+int
+update_timer_mpr(union olsr_ip_addr *node, union olsr_ip_addr *mpr, olsr_u8_t vtime)
+{
+  struct node *tmp_nodes;
+  struct mpr *tmp_mpr;
+  struct timeval tmp_timer;
+  double dbl_time;
+  olsr_u32_t time_value;
+
+  dbl_time = me_to_double(vtime);
+  time_value = (olsr_u32_t) dbl_time*1000;
+
+  tmp_timer.tv_sec = time_value/1000;
+  tmp_timer.tv_usec = (time_value-(tmp_timer.tv_sec*1000)) * 1000;   
+
+  //printf("Updatimng MPR timer for: %s\n", ip_to_string(node));
+  //printf("Secs: %d, usecs: %d\n", (int)tmp_timer.tv_sec, (int)tmp_timer.tv_usec);
+
+  //printf("Updatimng timer for: %s\n", ip_to_string(node));
+  for(tmp_nodes = nodes.next;
+      tmp_nodes != &nodes;
+      tmp_nodes = tmp_nodes->next)
+    {
+      if(memcmp(&tmp_nodes->addr, node, ipsize) == 0)
+       {
+         for(tmp_mpr = tmp_nodes->mpr.next;
+             tmp_mpr != &tmp_nodes->mpr;
+             tmp_mpr = tmp_mpr->next)
+           {
+             if(memcmp(&tmp_mpr->addr, mpr, ipsize) == 0)
+               {
+                 //printf("updating timer for MPR %s ", ip_to_string(mpr));
+                 //printf("node %s\n", ip_to_string(node));
+                 gettimeofday(&now, (struct timezone *)NULL);
+                 timeradd(&now, &tmp_timer, &tmp_mpr->timer);
+                 return 1; 
+               }
+           }
+         /* Only add if parent is added */
+         add_mpr(node, mpr, &tmp_timer);
+         return 0;
+       }
+    }
+
+  return 0;
+}
+
+
+
+
+int
+add_mid_node(union olsr_ip_addr *node, union olsr_ip_addr *alias, olsr_u8_t vtime)
+{
+
+  struct node *tmp_nodes;
+  struct mid *tmp_mid;
+  struct node new, *inserted;
+
+  //printf("MID_add: %s\n", ip_to_string(alias));
+
+  //update_timer_node(node, vtime);
+
+  for(tmp_nodes = nodes.next;
+      tmp_nodes != &nodes;
+      tmp_nodes = tmp_nodes->next)
+    {
+      if(memcmp(&tmp_nodes->addr, node, ipsize) == 0)
+       {
+         for(tmp_mid = tmp_nodes->mid.next;
+             tmp_mid != &tmp_nodes->mid;
+             tmp_mid = tmp_mid->next)
+           {
+             if(memcmp(&tmp_mid->alias, alias, ipsize) == 0)
+               return 0;
+           }
+
+         /* we didn't find the address */
+         printf("(1)NEW MID %s ", ip_to_string(alias));
+         printf("ADDED FOR %s\n", ip_to_string(node));
+         if((tmp_mid = malloc(sizeof(struct mid))) == 0)
+           {
+             fprintf(stderr, "OUT OF MEMORY\n");
+             exit(1);
+           }
+
+         memcpy(&tmp_mid->alias, alias, ipsize);
+
+         tmp_nodes->mid.next->prev = tmp_mid;
+         tmp_mid->next = tmp_nodes->mid.next;
+         tmp_nodes->mid.next = tmp_mid;
+         tmp_mid->prev = &tmp_nodes->mid;
+
+         remove_node_addr(alias); // Remove if already registered as a node
+         
+         update_nodes_list(tmp_nodes);
+         return 1; 
+
+       }
+    }
+
+
+
+  /*New node */
+
+  printf("ADDING NEW NODE %s FROM MID...\n", ip_to_string(node));
+  /* We don't know wery much... */
+  memset(&new, 0, sizeof(struct node));
+  memcpy(&new.addr, node, ipsize);
+  inserted = insert_node(&new, vtime);
+
+  if((tmp_mid = malloc(sizeof(struct mid))) == 0)
+    {
+      fprintf(stderr, "OUT OF MEMORY!\n");
+      exit(1);
+    }
+
+  memcpy(&tmp_mid->alias, alias, ipsize);
+
+  tmp_mid->next = &inserted->mid;
+  tmp_mid->prev = &inserted->mid;
+  inserted->mid.next = tmp_mid;
+  inserted->mid.prev = tmp_mid;
+
+  update_nodes_list(inserted);
+
+  return 2;
+}
+
+
+int
+add_hna_node(union olsr_ip_addr *node, union olsr_ip_addr *net, union olsr_ip_addr *mask, olsr_u8_t vtime)
+{
+
+  struct node *tmp_nodes;
+  struct hna *tmp_hna;
+  struct node new, *inserted;
+
+  //printf("HNA: %s\n", ip_to_string(&net));
+
+  update_timer_node(node, vtime);
+
+  for(tmp_nodes = nodes.next;
+      tmp_nodes != &nodes;
+      tmp_nodes = tmp_nodes->next)
+    {
+      if(memcmp(&tmp_nodes->addr, node, ipsize) == 0)
+       {
+         for(tmp_hna = tmp_nodes->hna.next;
+             tmp_hna != &tmp_nodes->hna;
+             tmp_hna = tmp_hna->next)
+           {
+             if((memcmp(&tmp_hna->net, net, ipsize) == 0) && (memcmp(&tmp_hna->mask, mask, ipsize) == 0))
+               return 0;
+           }
+
+         //printf("NEW HNA ADDED FOR %s ", ip_to_string(node));
+         //printf("net: %s \n", ip_to_string(&net));
+         /* we didn't find the address */
+         if((tmp_hna = malloc(sizeof(struct hna))) == 0)
+           {
+             fprintf(stderr, "OUT OF MEMORY\n");
+             exit(1);
+           }
+
+         memcpy(&tmp_hna->net, net, ipsize);
+         memcpy(&tmp_hna->mask, mask, ipsize);
+
+         /* queue */
+         tmp_nodes->hna.next->prev = tmp_hna;
+         tmp_hna->next = tmp_nodes->hna.next;
+         tmp_nodes->hna.next = tmp_hna;
+         tmp_hna->prev = &tmp_nodes->hna;
+         
+         update_nodes_list(tmp_nodes);
+         return 1; 
+       }
+    }
+
+
+
+  printf("ADDING NEW NODE %s FROM HNA...\n", ip_to_string(node));
+  /* We don't know wery much... */
+  memset(&new, 0, sizeof(struct node));
+  memcpy(&new.addr, node, ipsize);
+  inserted = insert_node(&new, vtime);
+
+  if((tmp_hna = malloc(sizeof(struct hna))) == 0)
+    {
+      fprintf(stderr, "OUT OF MEMORY!\n");
+      exit(1);
+    }
+
+  memcpy(&tmp_hna->net, net, ipsize);
+  memcpy(&tmp_hna->mask, mask, ipsize);
+
+  tmp_hna->next = &inserted->hna;
+  tmp_hna->prev = &inserted->hna;
+  inserted->hna.next = tmp_hna;
+  inserted->hna.prev = tmp_hna;
+
+  update_nodes_list(inserted);
+
+  return 2;
+}
+
+
+/**
+ *Add the MPR mpr to the node nodes selected MPRs.
+ *Nodes are NOT added if they are not yet registered!
+ *
+ *@param node the node that has chosen an MPR
+ *@param mpr the MPR choosen by node
+ *@return negative if node already registered or node not found
+ */
+int
+add_mpr(union olsr_ip_addr *node, union olsr_ip_addr *mpr, struct timeval *tmp_timer)
+{
+
+  struct node *tmp_nodes;
+  struct mpr *mprs;
+  struct mpr *tmp_mpr;
+
+  for(tmp_nodes = nodes.next;
+      tmp_nodes != &nodes;
+      tmp_nodes = tmp_nodes->next)
+    {
+      if(memcmp(&tmp_nodes->addr, node, ipsize) == 0)
+       {
+         for(mprs = tmp_nodes->mpr.next;
+             mprs != &tmp_nodes->mpr;
+             mprs = mprs->next)
+           {
+             if(memcmp(&mprs->addr, mpr, ipsize) == 0)
+                 return 0;
+           }
+
+         //printf("Adding MPR %s to ", ip_to_string(mpr));
+         //printf("%s\n", ip_to_string(node));
+         /* Add mpr */
+
+         if((tmp_mpr = malloc(sizeof(struct mpr))) == 0)
+           {
+             fprintf(stderr, "OUT OF MEMORY\n");
+             exit(1);
+           }
+
+         memcpy(&tmp_mpr->addr, mpr, ipsize);
+
+         gettimeofday(&now, (struct timezone *)NULL);
+         timeradd(&now, tmp_timer, &tmp_mpr->timer);
+
+         /* queue */
+         tmp_nodes->mpr.next->prev = tmp_mpr;
+         tmp_mpr->next = tmp_nodes->mpr.next;
+         tmp_nodes->mpr.next = tmp_mpr;
+         tmp_mpr->prev = &tmp_nodes->mpr;
+
+         update_nodes_list(tmp_nodes);
+         return 1; 
+
+       }
+    }
+
+  return 1;
+}
+
+
+
+
+int
+remove_node(struct node *node)
+{
+  struct hna *tmp_hna, *tmp_hna2;
+  struct mid *tmp_mid, *tmp_mid2;
+  struct mpr *tmp_mpr, *tmp_mpr2;
+
+  printf("Remove node %s\n", ip_to_string(&node->addr));
+
+
+  tmp_hna = node->hna.next;
+  while(tmp_hna != &node->hna)
+    {
+      tmp_hna2 = tmp_hna;
+      tmp_hna = tmp_hna->next;
+      free(tmp_hna2);
+    }
+  tmp_mpr = node->mpr.next;
+  while(tmp_mpr != &node->mpr)
+    {
+      tmp_mpr2 = tmp_mpr;
+      tmp_mpr = tmp_mpr->next;
+      free(tmp_mpr2);
+    }
+  tmp_mid = node->mid.next;
+  while(tmp_mid != &node->mid)
+    {
+      tmp_mid2 = tmp_mid;
+      tmp_mid = tmp_mid->next;
+      free(tmp_mid2);
+    }
+  
+  /* Gemove form GUI */
+  remove_nodes_list(&node->addr);
+  
+  /* Dequeue */
+  node->prev->next = node->next;
+  node->next->prev = node->prev;
+  
+  free(node);
+
+  return 1;  
+}
+
+
+
+
+
+
+/*
+ * Remove based on address
+ */
+
+int
+remove_node_addr(union olsr_ip_addr *node)
+{
+  struct node *tmp_nodes;
+  struct hna *tmp_hna, *tmp_hna2;
+  struct mid *tmp_mid, *tmp_mid2;
+  struct mpr *tmp_mpr, *tmp_mpr2;
+
+  printf("Remove node %s\n", ip_to_string(node));
+
+
+  tmp_nodes = nodes.next;
+
+  while(tmp_nodes != &nodes)
+    {
+      if(memcmp(&tmp_nodes->addr, node, ipsize) == 0)
+       {
+         printf("(2)Deleting node %s\n", ip_to_string((union olsr_ip_addr *)&tmp_nodes->addr));
+
+         tmp_hna = tmp_nodes->hna.next;
+         while(tmp_hna != &tmp_nodes->hna)
+           {
+             tmp_hna2 = tmp_hna;
+             tmp_hna = tmp_hna->next;
+             free(tmp_hna2);
+           }
+         tmp_mpr = tmp_nodes->mpr.next;
+         while(tmp_mpr != &tmp_nodes->mpr)
+           {
+             tmp_mpr2 = tmp_mpr;
+             tmp_mpr = tmp_mpr->next;
+             free(tmp_mpr2);
+           }
+         tmp_mid = tmp_nodes->mid.next;
+         while(tmp_mid != &tmp_nodes->mid)
+           {
+             tmp_mid2 = tmp_mid;
+             tmp_mid = tmp_mid->next;
+             free(tmp_mid2);
+           }
+
+         /* Gemove form GUI */
+         remove_nodes_list(&tmp_nodes->addr);
+
+         /* Dequeue */
+         tmp_nodes->prev->next = tmp_nodes->next;
+         tmp_nodes->next->prev = tmp_nodes->prev;
+
+         free(tmp_nodes);
+
+         return 1;
+       }
+
+      tmp_nodes = tmp_nodes->next;
+    }
+
+  return 0;
+}
+
+
+
+
+struct node *
+find_node(char *ip)
+{
+  struct node *tmp_nodes;
+
+  for(tmp_nodes = nodes.next;
+      tmp_nodes != &nodes;
+      tmp_nodes = tmp_nodes->next)
+    {
+      if(strcmp(ip_to_string((union olsr_ip_addr *)&tmp_nodes->addr), ip) == 0)
+       return tmp_nodes;
+    }
+
+  return NULL;
+}
+
+
+struct node *
+find_node_t(union olsr_ip_addr *ip)
+{
+  struct node *tmp_nodes;
+
+  for(tmp_nodes = nodes.next;
+      tmp_nodes != &nodes;
+      tmp_nodes = tmp_nodes->next)
+    {
+      if(memcmp(&tmp_nodes->addr, ip, ipsize) == 0)
+       return tmp_nodes;
+    }
+
+
+  return 0;
+}
+
+
+/*
+ *Remove timed out nodes
+ */
+gint
+time_out_nodes(gpointer data)
+{
+  struct node *tmp_nodes;
+  struct node *node_to_delete;
+
+  /* Wait before starting timing out */
+  if(timeouts)
+    {
+      timeouts--;
+      //printf("Waiting...\n");
+      return 1;
+    }
+
+  //printf("Timing out nodes...\n");
+  gettimeofday(&now, (struct timezone *)NULL);
+
+  tmp_nodes = nodes.next;
+
+  while(tmp_nodes != &nodes)
+    {
+      //printf("%s: %6d < %6d\n", ip_to_string(&tmp_nodes->addr), tmp_nodes->timer.tv_sec, now.tv_sec);
+      if(timercmp(&tmp_nodes->timer,&now,<))
+       {
+         printf("Node %s timed out...\n", ip_to_string((union olsr_ip_addr *)&tmp_nodes->addr));
+         node_to_delete = tmp_nodes;
+
+         tmp_nodes = tmp_nodes->next;
+
+         remove_nodes_list(&node_to_delete->addr);
+         remove_node(node_to_delete);
+       } 
+      else
+       tmp_nodes = tmp_nodes->next;
+    }
+
+  return 1;
+}
+
+
+
+/**
+ *Timeout MPRs for a given node. Only called when user
+ *is to see the registered MPRs of the node.
+ *@param node the node whom MPRs should be timed out
+ *@return negative if node not found
+ */
+int
+time_out_mprs(union olsr_ip_addr *node)
+{
+
+  struct node *tmp_nodes;
+  struct mpr *mpr_to_delete;
+  struct mpr *tmp_mpr;
+
+  gettimeofday(&now, (struct timezone *)NULL);
+
+
+  /* W A R N I N G !
+   *
+   * THIS ALGORITHM HAS NOT BEEN TESTED PROPERLY!!!!!!
+   * -Andreas
+   */
+
+  for(tmp_nodes = nodes.next;
+      tmp_nodes != &nodes;
+      tmp_nodes = tmp_nodes->next)
+    {
+      if(memcmp(&tmp_nodes->addr, node, ipsize) == 0)
+       {
+         tmp_mpr = tmp_nodes->mpr.next;
+        
+         while(tmp_mpr != &tmp_nodes->mpr)
+           {
+             if(timercmp(&tmp_mpr->timer,&now,<))
+               {
+                 printf("MPR %s OF NODE ", ip_to_string((union olsr_ip_addr *)&tmp_mpr->addr));
+                 printf("%s TIMIED OUT ", ip_to_string((union olsr_ip_addr *)&tmp_nodes->addr));fflush(stdout);
+
+                 mpr_to_delete = tmp_mpr;
+                 tmp_mpr = tmp_mpr->next;
+
+                 /* Dequeue */
+                 mpr_to_delete->next->prev = mpr_to_delete->prev;
+                 mpr_to_delete->prev->next = mpr_to_delete->next;
+                 /* Delete */
+                 free(mpr_to_delete);
+               }
+             else
+               tmp_mpr = tmp_mpr->next;
+           }
+
+         return 1;
+       }
+    }
+
+  return 0;
+}
+
+
+
+void
+init_timer(olsr_u32_t time_value, struct timeval *hold_timer)
+{ 
+  olsr_u16_t  time_value_sec=0;
+  olsr_u16_t  time_value_msec=0;
+
+  time_value_sec=time_value/1000;
+  time_value_msec=time_value-(time_value_sec*1000);
+
+  hold_timer->tv_sec=time_value_sec;
+  hold_timer->tv_usec=time_value_msec*1000; 
+  
+}
+
+
+/**
+ *Function that converts a mantissa/exponent 8bit value back
+ *to double as described in RFC3626:
+ *
+ * value = C*(1+a/16)*2^b [in seconds]
+ *
+ *  where a is the integer represented by the four highest bits of the
+ *  field and b the integer represented by the four lowest bits of the
+ *  field.
+ *
+ *@param me the 8 bit mantissa/exponen value
+ *
+ *@return a double value
+ */
+double
+me_to_double(olsr_u8_t me)
+{
+  int a = me>>4;
+  int b = me - a*16;
+  return (double)(VTIME_SCALE_FACTOR*(1+(double)a/16)*(double)pow(2,b));
+}
diff --git a/gui/linux-gtk/src/nodes.h b/gui/linux-gtk/src/nodes.h
new file mode 100644 (file)
index 0000000..becfd0a
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI 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.
+ *
+ * uolsrGUI 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+/*
+ *Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ *Node information
+ */
+
+#include <sys/time.h>
+//#include <time.h>
+
+
+struct timeval now;
+struct timeval hold_time_nodes; /* Timeout for all nodes */
+
+/* The node list */
+struct node nodes;
+
+
+struct node *
+insert_node(struct node *, olsr_u8_t);
+
+
+int
+remove_node(struct node *);
+
+int
+remove_node_addr(union olsr_ip_addr *);
+
+double
+me_to_double(olsr_u8_t);
+
diff --git a/gui/linux-gtk/src/olsr.c b/gui/linux-gtk/src/olsr.c
new file mode 100644 (file)
index 0000000..42bea34
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI 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.
+ *
+ * uolsrGUI 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include "common.h"
+
+
diff --git a/gui/linux-gtk/src/olsr_protocol.h b/gui/linux-gtk/src/olsr_protocol.h
new file mode 100644 (file)
index 0000000..be074cd
--- /dev/null
@@ -0,0 +1,437 @@
+/*
+ * OLSR ad-hoc routing table management protocol
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of the UniK OLSR daemon.
+ *
+ * The UniK OLSR daemon 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.
+ *
+ * The UniK OLSR daemon 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 the UniK OLSR daemon; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+/*
+ *Values and packet formats as proposed in RFC3626 and misc. values and
+ *data structures used by the UniK olsr daemon.
+ */
+
+#ifndef _PROTOCOLS_OLSR_H
+#define        _PROTOCOLS_OLSR_H
+
+/* Port for OLSR to use */
+
+#define OLSRPORT       698
+
+/* Default IPv6 multicast address */
+
+#define OLSR_IPV6_MULTICAST_ADDR "ff05::15"
+
+/* types */
+#include <sys/types.h>
+
+#ifdef WIN32
+typedef unsigned char   olsr_u8_t;
+typedef unsigned short  olsr_u16_t;
+typedef unsigned int    olsr_u32_t;
+typedef char            olsr_8_t;
+typedef short           olsr_16_t;
+typedef int             olsr_32_t;
+#else
+typedef u_int8_t        olsr_u8_t;
+typedef u_int16_t       olsr_u16_t;
+typedef u_int32_t       olsr_u32_t;
+typedef int8_t          olsr_8_t;
+typedef int16_t         olsr_16_t;
+typedef int32_t         olsr_32_t;
+#endif
+
+/* IPv6 address format in6_addr */
+#include <netinet/in.h>
+
+union olsr_ip_addr
+{
+  olsr_u32_t v4;
+  struct in6_addr v6;
+};
+
+
+/*
+ *Emission Intervals
+ */
+
+#define HELLO_INTERVAL        2
+#define HELLO_INTERVAL_NW     HELLO_INTERVAL * 2
+#define REFRESH_INTERVAL      2
+#define TC_INTERVAL           5
+#define MID_INTERVAL          TC_INTERVAL
+#define HNA_INTERVAL          TC_INTERVAL
+
+/*
+ *Holding Time
+ */
+
+#define NEIGHB_HOLD_TIME      3 * REFRESH_INTERVAL
+/*extra: time to delete for non-wireless interfaces */
+#define NEIGHB_HOLD_TIME_NW   NEIGHB_HOLD_TIME * 2
+#define TOP_HOLD_TIME         3 * TC_INTERVAL
+#define DUP_HOLD_TIME         30
+#define MID_HOLD_TIME         3 * MID_INTERVAL
+#define HNA_HOLD_TIME         3 * HNA_INTERVAL
+
+/*
+ * Scaling factor
+ */
+
+#define VTIME_SCALE_FACTOR    0.0625
+
+/*
+ *Message Types
+ */
+
+#define HELLO_MESSAGE         1
+#define TC_MESSAGE            2
+#define MID_MESSAGE           3
+#define HNA_MESSAGE           4
+#define MAX_MESSAGE           4
+
+/*
+ *Link Types
+ */
+
+#define UNSPEC_LINK           0
+#define ASYM_LINK             1
+#define SYM_LINK              2
+#define LOST_LINK             3
+#define MAX_LINK              3
+
+/*
+ *Neighbor Types
+ */
+
+#define NOT_NEIGH             0
+#define SYM_NEIGH             1
+#define MPR_NEIGH             2
+#define MAX_NEIGH             2
+
+/*
+ *Neighbor status
+ */
+
+#define NOT_SYM               0
+#define SYM                   1
+
+/*
+ *Link Hysteresis
+ */
+
+#define HYST_THRESHOLD_HIGH   0.8
+#define HYST_THRESHOLD_LOW    0.3
+#define HYST_SCALING          0.5
+
+/*
+ *Willingness
+ */
+
+#define WILL_NEVER            0
+#define WILL_LOW              1
+#define WILL_DEFAULT          3
+#define WILL_HIGH             6
+#define WILL_ALWAYS           7
+
+/*
+ *Misc. Constants
+ */
+
+#define TC_REDUNDANCY         0
+#define MPR_COVERAGE          1
+#define MAXJITTER             HELLO_INTERVAL / 4
+#define MAX_TTL               0xff
+
+/*
+ *Sequence numbering
+ */
+
+/* Seqnos are 16 bit values */
+
+#define MAXVALUE 0xFFFF
+
+/* Macro for checking seqnos "wraparound" */
+#define SEQNO_GREATER_THAN(s1, s2)                \
+        (((s1 > s2) && (s1 - s2 <= (MAXVALUE/2))) \
+     || ((s2 > s1) && (s2 - s1 > (MAXVALUE/2))))
+
+
+
+/*
+ * Macros for creating and extracting the neighbor 
+ * and link type information from 8bit link_code
+ * data as passed in HELLO messages
+ */
+
+#define CREATE_LINK_CODE(status, link) (link | (status<<2))
+
+#define EXTRACT_STATUS(link_code) ((link_code & 0xC)>>2)
+
+#define EXTRACT_LINK(link_code) (link_code & 0x3)
+
+
+/***********************************************
+ *           OLSR packet definitions           *
+ ***********************************************/
+
+
+/*
+ *The HELLO message
+ */
+
+/*
+ *Hello info
+ */
+struct hellinfo 
+{
+  olsr_u8_t   link_code;
+  olsr_u8_t   reserved;
+  olsr_u16_t  size;
+  olsr_u32_t  neigh_addr[1]; /* neighbor IP address(es) */
+};
+
+struct hellomsg 
+{
+  olsr_u16_t      reserved;
+  olsr_u8_t       htime;
+  olsr_u8_t       willingness;
+  struct hellinfo hell_info[1];
+};
+
+/*
+ *IPv6
+ */
+
+struct hellinfo6
+{
+  olsr_u8_t       link_code;
+  olsr_u8_t       reserved;
+  olsr_u16_t      size;
+  struct in6_addr neigh_addr[1]; /* neighbor IP address(es) */
+};
+
+struct hellomsg6
+{
+  olsr_u16_t         reserved;
+  olsr_u8_t          htime;
+  olsr_u8_t          willingness;
+  struct hellinfo6 hell_info[1];
+};
+
+
+
+
+
+/*
+ * Topology Control packet
+ */
+
+struct neigh_info
+{
+  olsr_u32_t       addr;
+};
+
+
+struct tcmsg 
+{
+  olsr_u16_t        ansn;
+  olsr_u16_t        reserved;
+  struct neigh_info neigh[1];
+};
+
+
+/*
+ *IPv6
+ */
+
+struct neigh_info6
+{
+  struct in6_addr      addr;
+};
+
+
+struct tcmsg6
+{
+  olsr_u16_t           ansn;
+  olsr_u16_t           reserved;
+  struct neigh_info6 neigh[1];
+};
+
+
+
+
+
+/*
+ *Multiple Interface Declaration message
+ */
+
+/* 
+ * Defined as s struct for further expansion 
+ * For example: do we want to tell what type of interface
+ * is associated whit each address?
+ */
+struct midaddr
+{
+  olsr_u32_t addr;
+};
+
+
+struct midmsg 
+{
+  struct midaddr mid_addr[1];
+};
+
+
+/*
+ *IPv6
+ */
+struct midaddr6
+{
+  struct in6_addr addr;
+};
+
+
+struct midmsg6
+{
+  struct midaddr6 mid_addr[1];
+};
+
+
+
+
+
+
+/*
+ * Host and Network Association message
+ */
+struct hnapair
+{
+  olsr_u32_t   addr;
+  olsr_u32_t   netmask;
+};
+
+struct hnamsg
+{
+  struct hnapair hna_net[1];
+};
+
+/*
+ *IPv6
+ */
+
+struct hnapair6
+{
+  struct in6_addr   addr;
+  struct in6_addr   netmask;
+};
+
+struct hnamsg6
+{
+  struct hnapair6 hna_net[1];
+};
+
+
+
+
+
+/*
+ * OLSR message (several can exist in one OLSR packet)
+ */
+
+struct olsrmsg
+{
+  olsr_u8_t     olsr_msgtype;
+  olsr_u8_t     olsr_vtime;
+  olsr_u16_t    olsr_msgsize;
+  olsr_u32_t    originator;
+  olsr_u8_t     ttl;
+  olsr_u8_t     hopcnt;
+  olsr_u16_t    seqno;
+
+  union 
+  {
+    struct hellomsg hello;
+    struct tcmsg    tc;
+    struct hnamsg   hna;
+    struct midmsg   mid;
+  } message;
+
+};
+
+/*
+ *IPv6
+ */
+
+struct olsrmsg6
+{
+  olsr_u8_t        olsr_msgtype;
+  olsr_u8_t        olsr_vtime;
+  olsr_u16_t       olsr_msgsize;
+  struct in6_addr  originator;
+  olsr_u8_t        ttl;
+  olsr_u8_t        hopcnt;
+  olsr_u16_t       seqno;
+
+  union 
+  {
+    struct hellomsg6 hello;
+    struct tcmsg6    tc;
+    struct hnamsg6   hna;
+    struct midmsg6   mid;
+  } message;
+
+};
+
+
+
+/*
+ * Generic OLSR packet
+ */
+
+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 */
+};
+
+
+/* IPv4 <-> IPv6 compability */
+
+union olsr_message
+{
+  struct olsrmsg v4;
+  struct olsrmsg6 v6;
+};
+
+union olsr_packet
+{
+  struct olsr v4;
+  struct olsr6 v6;
+};
+
+
+#endif
diff --git a/gui/linux-gtk/src/packet.c b/gui/linux-gtk/src/packet.c
new file mode 100644 (file)
index 0000000..dda9afc
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI 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.
+ *
+ * uolsrGUI 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+/*
+ *Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ *The list of cached packets
+ *
+ */
+
+#include "common.h"
+#include "packet.h"
+
+struct packnode *packets = NULL;
+int no_packets = 0;
+
+/*
+ *Add the contets of a packet to
+ *the cached packets
+ */
+int
+add_packet_to_buffer(union olsr_message *p, int size)
+{
+  struct packnode *tmp;
+  /* Should be the same for v4 and v6 */
+
+
+  /* If this is the first packet */
+  if(!packets)
+    {
+      //printf("Adding first packet\n");
+      packets = malloc(sizeof(struct packnode));
+      packets->packet = malloc(size);
+      memcpy(packets->packet, p, size);
+      packets->next = NULL;
+      no_packets++;
+      return 1;
+    }
+  else
+    {
+      /* If the buffer is not full */
+      if(no_packets < MAXPACKS)
+       {
+         //printf("Buffer not filled yet..\n");
+         tmp = packets;
+         packets = malloc(sizeof(struct packnode));
+         packets->packet = malloc(size);
+         memcpy(packets->packet, p, size);
+         packets->next = tmp;
+         no_packets++;
+         return 1;
+       }
+      /* If buffer is full */
+      else
+       {
+         //printf("Buffer full - deleting...\n");
+         tmp = packets;
+         /* Find second last packet */
+         while(tmp->next->next)
+           {
+             tmp = tmp->next;
+           }
+         /* Delete last packet */
+         free(tmp->next->packet);
+         free(tmp->next);
+         tmp->next = NULL;
+
+         /*Add the new packet */
+         tmp = packets;
+         packets = malloc(sizeof(struct packnode));
+         packets->packet = malloc(size);
+         memcpy(packets->packet, p, size);
+         packets->next = tmp;
+         return 1;
+       }
+
+    }
+  return 0;
+}
+
+
+
+/*
+ *Get the packet with index 'index'
+ */
+union olsr_message *
+get_packet(int index)
+{
+  int i = 0;
+  struct packnode *tmp;
+
+  if(index>MAXPACKS)
+    return 0;
+
+  if(index == 0)
+    return packets->packet;
+
+  tmp = packets;
+
+  while(i != index)
+    {
+      tmp = tmp->next;
+      i++;
+    }
+  return tmp->packet;
+
+}
diff --git a/gui/linux-gtk/src/packet.h b/gui/linux-gtk/src/packet.h
new file mode 100644 (file)
index 0000000..823128d
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI 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.
+ *
+ * uolsrGUI 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+/*
+ *Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ *The list of cached packets
+ *
+ */
+
+#ifndef _PACKET_H
+#define _PACKET_H
+
+struct packnode
+{
+  union olsr_message *packet;
+  struct packnode *next;
+};
+
+
+
+/*
+ * Unions for IPv4 <-> IPv6 compability
+ */
+
+union hello_message
+{
+  struct hellomsg v4;
+  struct hellomsg6 v6;
+};
+
+
+union tc_message
+{
+  struct tcmsg v4;
+  struct tcmsg6 v6;
+};
+
+
+union mid_message
+{
+  struct midmsg v4;
+  struct midmsg6 v6;
+};
+
+
+
+union hna_message
+{
+  struct hnamsg v4;
+  struct hnamsg6 v6;
+};
+
+
+
+
+#endif
diff --git a/gui/linux-gtk/src/pixmaps.h b/gui/linux-gtk/src/pixmaps.h
new file mode 100644 (file)
index 0000000..72a5832
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI 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.
+ *
+ * uolsrGUI 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include "pixmaps/logo.xpm"
diff --git a/gui/linux-gtk/src/pixmaps/logo.xpm b/gui/linux-gtk/src/pixmaps/logo.xpm
new file mode 100644 (file)
index 0000000..bd482b2
--- /dev/null
@@ -0,0 +1,2165 @@
+/* XPM */
+static char * logo_xpm[] = {
+"51 70 2092 2",
+"      c None",
+".     c #FFFFF4",
+"+     c #FEFFF8",
+"@     c #F4FBF4",
+"#     c #F9FFFF",
+"$     c #FBFFFF",
+"%     c #FBFCFF",
+"&     c #FDFCFF",
+"*     c #FDFDFF",
+"=     c #F5FFFF",
+"-     c #F7FFFF",
+";     c #F1FAF9",
+">     c #EEF7F6",
+",     c #F8FFFF",
+"'     c #FEFEFF",
+")     c #ECFCF9",
+"!     c #F3FFFF",
+"~     c #FCFFFF",
+"{     c #FFFEFF",
+"]     c #F7F8FA",
+"^     c #F8FEFE",
+"/     c #FAFEFF",
+"(     c #FFFFFF",
+"_     c #F6F7F9",
+":     c #F2FFFF",
+"<     c #F4FCFE",
+"[     c #FEFFFF",
+"}     c #FCF5FC",
+"|     c #FFFCFF",
+"1     c #FFFBFF",
+"2     c #FFFBFA",
+"3     c #FFF9FA",
+"4     c #FFFFFD",
+"5     c #FFFAFF",
+"6     c #F7FAF3",
+"7     c #FFFCF9",
+"8     c #EEF7F2",
+"9     c #A1B6AF",
+"0     c #A7C2BB",
+"a     c #97B0AA",
+"b     c #F0FFFF",
+"c     c #BDD4CA",
+"d     c #DEF8EB",
+"e     c #B6C9C5",
+"f     c #E6F5F2",
+"g     c #EFF8F7",
+"h     c #F5F6F8",
+"i     c #FAF4F8",
+"j     c #FFFDFF",
+"k     c #C8D9D3",
+"l     c #B0C9C3",
+"m     c #98BCB2",
+"n     c #AACEC4",
+"o     c #B7D4CF",
+"p     c #B1CAC6",
+"q     c #9DC0BA",
+"r     c #C1D4CE",
+"s     c #B4C7C1",
+"t     c #D2E7E0",
+"u     c #D0E3DD",
+"v     c #AFC0BA",
+"w     c #E8F7F2",
+"x     c #BDCCC7",
+"y     c #DDEEE8",
+"z     c #92C2B2",
+"A     c #A3CFC0",
+"B     c #98B9AE",
+"C     c #AAC1B9",
+"D     c #A8B7B2",
+"E     c #F8FCFB",
+"F     c #F2F0F1",
+"G     c #F4FFFF",
+"H     c #E5E7E6",
+"I     c #D4EBE3",
+"J     c #9EBCB2",
+"K     c #DCECE9",
+"L     c #A3CBC2",
+"M     c #DBF1EF",
+"N     c #AECDC8",
+"O     c #C7DCDD",
+"P     c #F4FAF0",
+"Q     c #C0E1D8",
+"R     c #568F80",
+"S     c #7ABFAC",
+"T     c #408572",
+"U     c #549881",
+"V     c #11573B",
+"W     c #297656",
+"X     c #568D7A",
+"Y     c #71A191",
+"Z     c #C7EDE0",
+"`     c #B1CCC3",
+" .    c #F0FFFB",
+"..    c #F3F5F4",
+"+.    c #D6F1E8",
+"@.    c #AAD0C3",
+"#.    c #83B3A3",
+"$.    c #A4D9C9",
+"%.    c #38685A",
+"&.    c #5E8C81",
+"*.    c #689A8E",
+"=.    c #518A7B",
+"-.    c #2C8162",
+";.    c #106345",
+">.    c #307F62",
+",.    c #5CAB8E",
+"'.    c #6AB69A",
+").    c #72BEA2",
+"!.    c #0F583D",
+"~.    c #549A80",
+"{.    c #548B76",
+"].    c #8EBFAC",
+"^.    c #8CB2A3",
+"/.    c #A3BFB3",
+"(.    c #CADBD3",
+"_.    c #F7FFFB",
+":.    c #FAFFFB",
+"<.    c #FEFFFD",
+"[.    c #E6F9F3",
+"}.    c #E4EDEC",
+"|.    c #799D93",
+"1.    c #81B1A3",
+"2.    c #A4CCC1",
+"3.    c #519580",
+"4.    c #487E6E",
+"5.    c #1A5948",
+"6.    c #79ABA0",
+"7.    c #EDFFFA",
+"8.    c #C0D5D0",
+"9.    c #528478",
+"0.    c #387868",
+"a.    c #71B09F",
+"b.    c #8CC7B3",
+"c.    c #45836C",
+"d.    c #579C7F",
+"e.    c #9FCFBF",
+"f.    c #92BCAE",
+"g.    c #AFCFC4",
+"h.    c #DBE1DF",
+"i.    c #F9F7F8",
+"j.    c #FFFAFD",
+"k.    c #D3F3E8",
+"l.    c #608C7D",
+"m.    c #4C8572",
+"n.    c #6AA893",
+"o.    c #76B19F",
+"p.    c #92CDBB",
+"q.    c #488877",
+"r.    c #4F9884",
+"s.    c #57A188",
+"t.    c #246851",
+"u.    c #9DDBC6",
+"v.    c #5A9581",
+"w.    c #478570",
+"x.    c #1E5945",
+"y.    c #ABE0CE",
+"z.    c #B5E4D4",
+"A.    c #83AF9E",
+"B.    c #D0F6E7",
+"C.    c #94B0A4",
+"D.    c #DCEDE5",
+"E.    c #F9FFFD",
+"F.    c #FFFEFC",
+"G.    c #FAF9F7",
+"H.    c #FBFBF9",
+"I.    c #D6E2DE",
+"J.    c #B3D8D0",
+"K.    c #A6D8CC",
+"L.    c #538979",
+"M.    c #337B63",
+"N.    c #5B9F86",
+"O.    c #8EC5B2",
+"P.    c #608880",
+"Q.    c #F0FDF6",
+"R.    c #FAFCFB",
+"S.    c #C7E6DE",
+"T.    c #4C8B7A",
+"U.    c #549F8B",
+"V.    c #65A896",
+"W.    c #6FA595",
+"X.    c #59907D",
+"Y.    c #56947D",
+"Z.    c #5C8678",
+"`.    c #E6FFFF",
+" +    c #95B3A9",
+".+    c #ECFFF9",
+"++    c #D6E1DD",
+"@+    c #FCFEFD",
+"#+    c #F8FFFD",
+"$+    c #D6EDE3",
+"%+    c #BFE3D7",
+"&+    c #93BDAF",
+"*+    c #76A094",
+"=+    c #82AEA1",
+"-+    c #76A99A",
+";+    c #417C6A",
+">+    c #71AC9A",
+",+    c #9DCDBF",
+"'+    c #4C7469",
+")+    c #9AC0B5",
+"!+    c #DDFFFB",
+"~+    c #497166",
+"{+    c #90AFA7",
+"]+    c #97ACA7",
+"^+    c #B5CAC3",
+"/+    c #E9F4F0",
+"(+    c #F7EEF1",
+"_+    c #FFFAFE",
+":+    c #F1FFFD",
+"<+    c #CADFD8",
+"[+    c #84ACA3",
+"}+    c #6C9A90",
+"|+    c #A4DCCF",
+"1+    c #73B8A3",
+"2+    c #6FB098",
+"3+    c #014C2E",
+"4+    c #5FA186",
+"5+    c #80A89F",
+"6+    c #AFD8CA",
+"7+    c #246E57",
+"8+    c #1C6E58",
+"9+    c #367968",
+"0+    c #508276",
+"a+    c #74A295",
+"b+    c #7CAF9E",
+"c+    c #EAFFFB",
+"d+    c #8EA39C",
+"e+    c #ECFDF7",
+"f+    c #C8D3CF",
+"g+    c #EFF5F3",
+"h+    c #FAFFFE",
+"i+    c #B5C2BB",
+"j+    c #DFFAF1",
+"k+    c #86A79C",
+"l+    c #CDEEE3",
+"m+    c #A6CAC0",
+"n+    c #679386",
+"o+    c #93C8B8",
+"p+    c #11503F",
+"q+    c #88BCAF",
+"r+    c #B8E2D8",
+"s+    c #588077",
+"t+    c #91BCB2",
+"u+    c #7FAAA0",
+"v+    c #E9FFFF",
+"w+    c #EEFFFF",
+"x+    c #CFE8E2",
+"y+    c #AABFBA",
+"z+    c #D3E2DF",
+"A+    c #F8FCFD",
+"B+    c #D0E5DC",
+"C+    c #79A198",
+"D+    c #B7D5D3",
+"E+    c #7FA49D",
+"F+    c #5E9786",
+"G+    c #91B7A8",
+"H+    c #427860",
+"I+    c #B9F1D6",
+"J+    c #77948F",
+"K+    c #B6D5CD",
+"L+    c #548D7C",
+"M+    c #478270",
+"N+    c #A9E2D1",
+"O+    c #336E5C",
+"P+    c #669C8C",
+"Q+    c #B1D9CE",
+"R+    c #B0DED1",
+"S+    c #CBE6DF",
+"T+    c #B5E1D4",
+"U+    c #F7FDFD",
+"V+    c #ECFFFD",
+"W+    c #FEFCFF",
+"X+    c #74AD9C",
+"Y+    c #89B3A7",
+"Z+    c #387965",
+"`+    c #89B5A8",
+" @    c #639687",
+".@    c #569381",
+"+@    c #84B2A5",
+"@@    c #8FB3A9",
+"#@    c #7CA499",
+"$@    c #A6DBCB",
+"%@    c #77AD9D",
+"&@    c #7CA89B",
+"*@    c #CBEAE2",
+"=@    c #F8FAF9",
+"-@    c #FEFEFE",
+";@    c #FBFBFB",
+">@    c #F3FCF9",
+",@    c #EAEEEF",
+"'@    c #04543B",
+")@    c #B5CCC6",
+"!@    c #B1CFC7",
+"~@    c #5C887B",
+"{@    c #528D7B",
+"]@    c #17654D",
+"^@    c #B0DBCA",
+"/@    c #FBFFFA",
+"(@    c #CAEBE2",
+"_@    c #5B9483",
+":@    c #67A08F",
+"<@    c #5F9484",
+"[@    c #8EC3B3",
+"}@    c #517F72",
+"|@    c #D9FDF3",
+"1@    c #5B8E7F",
+"2@    c #93B7AD",
+"3@    c #92C2B4",
+"4@    c #DFE0E2",
+"5@    c #699387",
+"6@    c #FFF0F9",
+"7@    c #E2E8E8",
+"8@    c #FDF4F9",
+"9@    c #B7C6C3",
+"0@    c #9CCABD",
+"a@    c #91C4B5",
+"b@    c #77BCA7",
+"c@    c #80AC9F",
+"d@    c #A1CDC0",
+"e@    c #8BB3A8",
+"f@    c #DAF9F1",
+"g@    c #A1BAB4",
+"h@    c #D7F0EA",
+"i@    c #CCEDE4",
+"j@    c #7EA89C",
+"k@    c #F6FAF9",
+"l@    c #EBEDEC",
+"m@    c #F6F6F6",
+"n@    c #FDFDFD",
+"o@    c #FAFEFD",
+"p@    c #F4FAF8",
+"q@    c #D5E0DC",
+"r@    c #E1F8F2",
+"s@    c #EBFFFB",
+"t@    c #C9F1E6",
+"u@    c #BFE0D7",
+"v@    c #266552",
+"w@    c #9EC6BB",
+"x@    c #558A7A",
+"y@    c #D0EFE7",
+"z@    c #19644D",
+"A@    c #92BBAB",
+"B@    c #F9FEF7",
+"C@    c #B5D6CD",
+"D@    c #154B3B",
+"E@    c #78AE9E",
+"F@    c #93C3B5",
+"G@    c #83B3A5",
+"H@    c #CBF5E9",
+"I@    c #628078",
+"J@    c #7FB4A4",
+"K@    c #C8ECE2",
+"L@    c #A0C8BD",
+"M@    c #A9C0BA",
+"N@    c #DBF2EC",
+"O@    c #FCF7FB",
+"P@    c #5C9D89",
+"Q@    c #69A291",
+"R@    c #427F6D",
+"S@    c #C9EDE3",
+"T@    c #C8E6DE",
+"U@    c #D6FCF1",
+"V@    c #D3EAE4",
+"W@    c #B2C1BE",
+"X@    c #C3DED7",
+"Y@    c #79A598",
+"Z@    c #D9ECE8",
+"`@    c #F4EEF2",
+" #    c #FBFDFC",
+".#    c #F1F5F4",
+"+#    c #F4FFFB",
+"@#    c #357D67",
+"##    c #8FCCBA",
+"$#    c #5A8F7F",
+"%#    c #E7E8EA",
+"&#    c #D8EBE7",
+"*#    c #1E5D4A",
+"=#    c #6DB29D",
+"-#    c #1E6851",
+";#    c #C9EFE0",
+">#    c #FCFFF8",
+",#    c #D5ECE6",
+"'#    c #B5E5D7",
+")#    c #417465",
+"!#    c #CDFBEE",
+"~#    c #8FC2B3",
+"{#    c #90BCAF",
+"]#    c #C1E2D9",
+"^#    c #6F8D85",
+"/#    c #508D7B",
+"(#    c #F2FBFA",
+"_#    c #528F7D",
+":#    c #CDD9D7",
+"<#    c #D3ECE6",
+"[#    c #FBF5F9",
+"}#    c #EEEFF1",
+"|#    c #F6FFFF",
+"1#    c #7DA197",
+"2#    c #528878",
+"3#    c #2C745E",
+"4#    c #87B1A5",
+"5#    c #A0C1B8",
+"6#    c #B6CDC7",
+"7#    c #D9E8E5",
+"8#    c #92A19E",
+"9#    c #BFD2CE",
+"0#    c #B0C5C0",
+"a#    c #E0F7F1",
+"b#    c #DCE7E3",
+"c#    c #CCDBD6",
+"d#    c #D0E7E1",
+"e#    c #7FADA0",
+"f#    c #35896F",
+"g#    c #2C765F",
+"h#    c #EAFFFF",
+"i#    c #A1C5BB",
+"j#    c #438B75",
+"k#    c #6D9183",
+"l#    c #FDFEF8",
+"m#    c #FFF8FF",
+"n#    c #CFDEDB",
+"o#    c #80AA9E",
+"p#    c #659386",
+"q#    c #8DBDAF",
+"r#    c #83B9A9",
+"s#    c #8CC1B1",
+"t#    c #82ACA0",
+"u#    c #B2D0C8",
+"v#    c #539D86",
+"w#    c #B7D2CB",
+"x#    c #62A18E",
+"y#    c #C6DDD7",
+"z#    c #DFE8E7",
+"A#    c #FAFFFF",
+"B#    c #E6F6F3",
+"C#    c #A2BDB6",
+"D#    c #859C96",
+"E#    c #B1C4C0",
+"F#    c #E0F9F3",
+"G#    c #92B1A9",
+"H#    c #C7EFE4",
+"I#    c #639184",
+"J#    c #9BC7BA",
+"K#    c #B6D7CE",
+"L#    c #CEDDDA",
+"M#    c #FBFCFE",
+"N#    c #F9F9F9",
+"O#    c #CFDBD7",
+"P#    c #F2FFFD",
+"Q#    c #9AAFAA",
+"R#    c #589381",
+"S#    c #66A18F",
+"T#    c #C8EEE3",
+"U#    c #F8F6F9",
+"V#    c #599684",
+"W#    c #97C7B9",
+"X#    c #16513F",
+"Y#    c #95DDC7",
+"Z#    c #688C7E",
+"`#    c #FFFFFA",
+" $    c #92BCB0",
+".$    c #AADACC",
+"+$    c #558E7D",
+"@$    c #588E7E",
+"#$    c #477366",
+"$$    c #C3D2CF",
+"%$    c #B7DDD2",
+"&$    c #96C0B4",
+"*$    c #6CA594",
+"=$    c #7EBDAA",
+"-$    c #C1D6D1",
+";$    c #C0D9D3",
+">$    c #FFF9FE",
+",$    c #E8F2F1",
+"'$    c #B7DBD1",
+")$    c #AACBC2",
+"!$    c #649A8A",
+"~$    c #689E8E",
+"{$    c #91CEBC",
+"]$    c #729A8F",
+"^$    c #EEFFFD",
+"/$    c #E9FEF9",
+"($    c #99BFB4",
+"_$    c #A4CEC2",
+":$    c #BDD8D1",
+"<$    c #F8F8F8",
+"[$    c #FCFCFC",
+"}$    c #E6F1ED",
+"|$    c #B5C4BF",
+"1$    c #F1FFFE",
+"2$    c #CCEBE3",
+"3$    c #D5DFDE",
+"4$    c #599E89",
+"5$    c #276B56",
+"6$    c #BAE2D7",
+"7$    c #99BAB1",
+"8$    c #86ACA1",
+"9$    c #267059",
+"0$    c #9DC3B4",
+"a$    c #FEFFFA",
+"b$    c #D1ECE5",
+"c$    c #4E8172",
+"d$    c #9CD1C1",
+"e$    c #8CBFB0",
+"f$    c #6FA293",
+"g$    c #B1DFD2",
+"h$    c #A2C6BC",
+"i$    c #DDF8F1",
+"j$    c #729C90",
+"k$    c #BCD7D0",
+"l$    c #347863",
+"m$    c #1F5C4A",
+"n$    c #E8E9EB",
+"o$    c #F1FFFF",
+"p$    c #FFF9FF",
+"q$    c #FAF8FB",
+"r$    c #BFD6D0",
+"s$    c #DFF6F0",
+"t$    c #A2B7B2",
+"u$    c #80A198",
+"v$    c #84B0A3",
+"w$    c #80AEA1",
+"x$    c #B0D6CB",
+"y$    c #E2F7F2",
+"z$    c #F3F9F7",
+"A$    c #CED9D5",
+"B$    c #EBFCF6",
+"C$    c #88ACA2",
+"D$    c #C4E8DE",
+"E$    c #94BEB2",
+"F$    c #93BDB1",
+"G$    c #387361",
+"H$    c #D6F1EA",
+"I$    c #438E77",
+"J$    c #D5FEEE",
+"K$    c #A8D0C5",
+"L$    c #92CBBA",
+"M$    c #6F9F91",
+"N$    c #82B0A3",
+"O$    c #8CB2A7",
+"P$    c #EDFFFF",
+"Q$    c #4E7C6F",
+"R$    c #ADD1C7",
+"S$    c #A6D4C7",
+"T$    c #CCDFDB",
+"U$    c #93BFB2",
+"V$    c #98C0B5",
+"W$    c #C0DBD4",
+"X$    c #DAF5EE",
+"Y$    c #DAE9E6",
+"Z$    c #7EA69B",
+"`$    c #CEF2E8",
+" %    c #B4DACF",
+".%    c #C5E0D9",
+"+%    c #E3F6F2",
+"@%    c #ACC3BD",
+"#%    c #E0FFF7",
+"$%    c #93AEA7",
+"%%    c #ECF5F4",
+"&%    c #FDFFFE",
+"*%    c #DAE6E2",
+"=%    c #576C65",
+"-%    c #CFE2DE",
+";%    c #8DC0B1",
+">%    c #77908A",
+",%    c #A9DCCD",
+"'%    c #91B2A9",
+")%    c #9FC7BC",
+"!%    c #16644C",
+"~%    c #517C6B",
+"{%    c #BACBC5",
+"]%    c #A8D2C4",
+"^%    c #74AB98",
+"/%    c #5B907E",
+"(%    c #A7D7C7",
+"_%    c #A4D3C3",
+":%    c #699888",
+"<%    c #94C0B3",
+"[%    c #C4DDD7",
+"}%    c #4F8474",
+"|%    c #E9FFFA",
+"1%    c #61A28E",
+"2%    c #8AB2A7",
+"3%    c #8FB7AC",
+"4%    c #E4EDEA",
+"5%    c #FBFFFE",
+"6%    c #E2E8E6",
+"7%    c #6B897F",
+"8%    c #C5E6DB",
+"9%    c #90B6A9",
+"0%    c #73998C",
+"a%    c #BDDBD1",
+"b%    c #EEFFF9",
+"c%    c #FFF9FD",
+"d%    c #FCFAFB",
+"e%    c #F0ECED",
+"f%    c #8CBBAB",
+"g%    c #E8FFFC",
+"h%    c #508E79",
+"i%    c #91B0A8",
+"j%    c #61897E",
+"k%    c #4D8071",
+"l%    c #BDDED5",
+"m%    c #6FAA98",
+"n%    c #77A396",
+"o%    c #70A595",
+"p%    c #81C2AC",
+"q%    c #9CC5B5",
+"r%    c #FFFDFB",
+"s%    c #C7DED6",
+"t%    c #8DB7A9",
+"u%    c #75A897",
+"v%    c #A3D6C5",
+"w%    c #2A5949",
+"x%    c #84B4A4",
+"y%    c #73A695",
+"z%    c #94BAAF",
+"A%    c #356B5B",
+"B%    c #E0E9E8",
+"C%    c #408872",
+"D%    c #CCE5DF",
+"E%    c #609384",
+"F%    c #6F847F",
+"G%    c #F5FEFB",
+"H%    c #F2F8F6",
+"I%    c #F4FDFA",
+"J%    c #CAEADF",
+"K%    c #B5D6CB",
+"L%    c #A4C4B9",
+"M%    c #B2C9C1",
+"N%    c #D8E4E0",
+"O%    c #FFFBFD",
+"P%    c #DDF7EE",
+"Q%    c #437665",
+"R%    c #548D7A",
+"S%    c #BBE1D6",
+"T%    c #A5D5C7",
+"U%    c #8EC1B2",
+"V%    c #508978",
+"W%    c #4A7669",
+"X%    c #5A8D7E",
+"Y%    c #C7FCEC",
+"Z%    c #377663",
+"`%    c #488973",
+" &    c #5D8678",
+".&    c #FFFBF8",
+"+&    c #F5FFFD",
+"@&    c #C9E0D8",
+"#&    c #A7CDC0",
+"$&    c #D1FBED",
+"%&    c #426B5D",
+"&&    c #E4FFFF",
+"*&    c #5B8778",
+"=&    c #A0D5C3",
+"-&    c #B2DED1",
+";&    c #B8E2D6",
+">&    c #87ADA2",
+",&    c #D8F6EE",
+"'&    c #8CB4A9",
+")&    c #6CA795",
+"!&    c #DDFCF4",
+"~&    c #F6FCFA",
+"{&    c #F7F9F8",
+"]&    c #E0E6E4",
+"^&    c #77978C",
+"/&    c #C0DED4",
+"(&    c #C5DFD6",
+"_&    c #F8FFFE",
+":&    c #F9FBFA",
+"<&    c #F7FBFA",
+"[&    c #F7F5F6",
+"}&    c #B3D4C9",
+"|&    c #1B6149",
+"1&    c #8BC0AE",
+"2&    c #679C8C",
+"3&    c #528576",
+"4&    c #97C5B8",
+"5&    c #80C5B0",
+"6&    c #41826E",
+"7&    c #83C4B0",
+"8&    c #7DB0A1",
+"9&    c #6EAF99",
+"0&    c #A9D3C5",
+"a&    c #FFFEFB",
+"b&    c #D4E5DF",
+"c&    c #C1D8D0",
+"d&    c #E3FAF2",
+"e&    c #CADDD7",
+"f&    c #C0D5CE",
+"g&    c #8CACA1",
+"h&    c #BBE5D7",
+"i&    c #3C7161",
+"j&    c #E2F5F1",
+"k&    c #9FCBBE",
+"l&    c #A3BAB4",
+"m&    c #8DB9AC",
+"n&    c #F3FDFC",
+"o&    c #89BEAE",
+"p&    c #F1F2F4",
+"q&    c #DDE3E1",
+"r&    c #B9D7CD",
+"s&    c #AFC9C0",
+"t&    c #ACBDB7",
+"u&    c #DEE7E4",
+"v&    c #E8ECEB",
+"w&    c #BBD9CF",
+"x&    c #687F77",
+"y&    c #377560",
+"z&    c #A5DCC9",
+"A&    c #5E9182",
+"B&    c #AEE3D3",
+"C&    c #17674E",
+"D&    c #77AC9C",
+"E&    c #4F8C7A",
+"F&    c #559481",
+"G&    c #357662",
+"H&    c #A2CBBD",
+"I&    c #F8F7F3",
+"J&    c #E3E9E7",
+"K&    c #F0F2F1",
+"L&    c #ABC2BA",
+"M&    c #5C8A7D",
+"N&    c #E8F4F2",
+"O&    c #D6E2E0",
+"P&    c #C1E5DB",
+"Q&    c #9EB7B1",
+"R&    c #F9FDFC",
+"S&    c #E1F8F0",
+"T&    c #D9EAE4",
+"U&    c #FFFDFE",
+"V&    c #FEFCFD",
+"W&    c #B5C1BD",
+"X&    c #C6F2E3",
+"Y&    c #ACCDC2",
+"Z&    c #85BCA9",
+"`&    c #54917F",
+" *    c #DAF8F0",
+".*    c #438470",
+"+*    c #68988A",
+"@*    c #9EBFB6",
+"#*    c #518E7C",
+"$*    c #BFE5D8",
+"%*    c #FFFFFB",
+"&*    c #FFF8FB",
+"**    c #F8F6F7",
+"=*    c #FFFBFE",
+"-*    c #F5FFFC",
+";*    c #F2FCFB",
+">*    c #D9F0EA",
+",*    c #FFF5FB",
+"'*    c #AED2C8",
+")*    c #D4DDDC",
+"!*    c #BAC4C3",
+"~*    c #ECEEED",
+"{*    c #FDFBFC",
+"]*    c #F6FFFC",
+"^*    c #F6F4F5",
+"/*    c #FFFCFD",
+"(*    c #E1F2EC",
+"_*    c #E6E6E6",
+":*    c #538272",
+"<*    c #F4FFFE",
+"[*    c #6F9E8E",
+"}*    c #BCDBD3",
+"|*    c #577F74",
+"1*    c #6BA191",
+"2*    c #679185",
+"3*    c #B0DACE",
+"4*    c #92B0A8",
+"5*    c #6C988B",
+"6*    c #75AA9A",
+"7*    c #407668",
+"8*    c #E9EFED",
+"9*    c #FFF5FC",
+"0*    c #ECFFFB",
+"a*    c #FAFAFC",
+"b*    c #DFE5E5",
+"c*    c #FAFAFA",
+"d*    c #FBF7F8",
+"e*    c #FAF8F9",
+"f*    c #EFF8F5",
+"g*    c #E0F5EE",
+"h*    c #C8DBD5",
+"i*    c #809B92",
+"j*    c #A7D1C5",
+"k*    c #51796E",
+"l*    c #DCFAF2",
+"m*    c #618D80",
+"n*    c #9CC8BB",
+"o*    c #599482",
+"p*    c #73A194",
+"q*    c #8DBDB1",
+"r*    c #A7C5BD",
+"s*    c #FFF9F9",
+"t*    c #F2FFFC",
+"u*    c #F8FEFC",
+"v*    c #FFF7FE",
+"w*    c #F4FDFC",
+"x*    c #C4DBD3",
+"y*    c #FFFCFE",
+"z*    c #EAF5F1",
+"A*    c #D0F1E8",
+"B*    c #95C3B6",
+"C*    c #A5C9BF",
+"D*    c #55907E",
+"E*    c #6F958A",
+"F*    c #A2DFCD",
+"G*    c #185744",
+"H*    c #C8F3E9",
+"I*    c #DDE6E5",
+"J*    c #B8C1C0",
+"K*    c #E5F1EF",
+"L*    c #E9F9F6",
+"M*    c #E5F5F2",
+"N*    c #EDFDFA",
+"O*    c #A7B6B1",
+"P*    c #D6E9E3",
+"Q*    c #B8CDC6",
+"R*    c #E0F7EF",
+"S*    c #D0DCD8",
+"T*    c #F6F6F8",
+"U*    c #F2F6F7",
+"V*    c #DEE4E4",
+"W*    c #F6FFFE",
+"X*    c #E4F0EC",
+"Y*    c #F9FFFB",
+"Z*    c #E8FFFF",
+"`*    c #7CA69A",
+" =    c #BEECDF",
+".=    c #B6E2D5",
+"+=    c #98C4B7",
+"@=    c #DFEBE7",
+"#=    c #F6FFFD",
+"$=    c #F5F7F6",
+"%=    c #FAFCF7",
+"&=    c #96ABA6",
+"*=    c #BCD5CF",
+"==    c #DDEDEA",
+"-=    c #CCDBD8",
+";=    c #FBF9FA",
+">=    c #F7F3F4",
+",=    c #FDF9FA",
+"'=    c #91BBAF",
+")=    c #AEDCCF",
+"!=    c #A8CEC3",
+"~=    c #AAC5BE",
+"{=    c #C1DFD7",
+"]=    c #BED8CF",
+"^=    c #B0C7BF",
+"/=    c #E8FBF5",
+"(=    c #BECFC9",
+"_=    c #CAD6D2",
+":=    c #F4F4F4",
+"<=    c #EAECEB",
+"[=    c #F8FAF5",
+"}=    c #C2D5D1",
+"|=    c #4C786B",
+"1=    c #66998A",
+"2=    c #8BB1A6",
+"3=    c #CAE3DD",
+"4=    c #DCF1EC",
+"5=    c #D6EFE9",
+"6=    c #EFFFFC",
+"7=    c #EAFBF5",
+"8=    c #EEFDF8",
+"9=    c #F5FBF9",
+"0=    c #EFF1F0",
+"a=    c #F6F8F7",
+"b=    c #F7FFFE",
+"c=    c #D1DCD8",
+"d=    c #E1F0EB",
+"e=    c #EAF9F4",
+"f=    c #F8FFFB",
+"g=    c #DDF4EE",
+"h=    c #8DC2B2",
+"i=    c #669487",
+"j=    c #A5C3BB",
+"k=    c #91AAA4",
+"l=    c #7A9890",
+"m=    c #BAE0D3",
+"n=    c #9DC3B6",
+"o=    c #A1C2B7",
+"p=    c #C1DFD5",
+"q=    c #7E988F",
+"r=    c #9FB2AC",
+"s=    c #DFF0EA",
+"t=    c #EFEFEF",
+"u=    c #F2F2F2",
+"v=    c #F5F5F5",
+"w=    c #F5F9F8",
+"x=    c #DDE1E0",
+"y=    c #E2E6E5",
+"z=    c #BFCEC9",
+"A=    c #C2D3CD",
+"B=    c #EDFFFB",
+"C=    c #A3BAB2",
+"D=    c #A9C7BD",
+"E=    c #8DA89F",
+"F=    c #EEFFF8",
+"G=    c #317661",
+"H=    c #1D6851",
+"I=    c #81BEAC",
+"J=    c #9BC5B9",
+"K=    c #C4EADF",
+"L=    c #9FC9BD",
+"M=    c #A7CBBF",
+"N=    c #A9CDC1",
+"O=    c #94B4A9",
+"P=    c #CFEAE1",
+"Q=    c #AEC5BD",
+"R=    c #F0FFFD",
+"S=    c #F1FFFC",
+"T=    c #EBFAF5",
+"U=    c #E1E7E5",
+"V=    c #EAF0EE",
+"W=    c #E0F1EB",
+"X=    c #B9CAC4",
+"Y=    c #DDF2EB",
+"Z=    c #CAE1D9",
+"`=    c #ECFFFE",
+" -    c #98B8AD",
+".-    c #DFFFF5",
+"+-    c #5F8377",
+"@-    c #90B9AB",
+"#-    c #8DB3A6",
+"$-    c #E8FFF8",
+"%-    c #BAD1CB",
+"&-    c #5F9283",
+"*-    c #6AAB97",
+"=-    c #96BEB3",
+"--    c #8BC0B0",
+";-    c #9FBAB3",
+">-    c #E9FFFD",
+",-    c #B7D0CA",
+"'-    c #A8C6BE",
+")-    c #8FA49F",
+"!-    c #C6DFD9",
+"~-    c #88A79F",
+"{-    c #B3BFBB",
+"]-    c #EEF7F4",
+"^-    c #CDDCD7",
+"/-    c #D6EDE7",
+"(-    c #88BBAC",
+"_-    c #A0BBB4",
+":-    c #EDFFFE",
+"<-    c #649285",
+"[-    c #C9E8E0",
+"}-    c #759F93",
+"|-    c #E1FAF4",
+"1-    c #6D998C",
+"2-    c #7BB6A4",
+"3-    c #206F50",
+"4-    c #8DBEA8",
+"5-    c #FBFEF3",
+"6-    c #6CA191",
+"7-    c #216B54",
+"8-    c #5F9585",
+"9-    c #1F6A53",
+"0-    c #A2CABF",
+"a-    c #5F9887",
+"b-    c #93B9AE",
+"c-    c #71A797",
+"d-    c #AAD2C7",
+"e-    c #B5D4CC",
+"f-    c #9BCEBF",
+"g-    c #D6FFF5",
+"h-    c #ACCAC2",
+"i-    c #A2D0C3",
+"j-    c #D8E7E2",
+"k-    c #F2FEFA",
+"l-    c #F0F4F3",
+"m-    c #E4EFEB",
+"n-    c #C6D9D3",
+"o-    c #C1D1CE",
+"p-    c #79A196",
+"q-    c #659A8A",
+"r-    c #B9D8D0",
+"s-    c #719F92",
+"t-    c #D8EFE9",
+"u-    c #6A9287",
+"v-    c #3F7A68",
+"w-    c #70A092",
+"x-    c #80A69B",
+"y-    c #CDECE4",
+"z-    c #316757",
+"A-    c #58A38C",
+"B-    c #0C563B",
+"C-    c #5B8A76",
+"D-    c #F1FBFA",
+"E-    c #BCD3CD",
+"F-    c #387563",
+"G-    c #9BBFB5",
+"H-    c #9BC9BC",
+"I-    c #D2E5E1",
+"J-    c #99CCBD",
+"K-    c #568275",
+"L-    c #80B3A4",
+"M-    c #B7D5CD",
+"N-    c #DEFFF6",
+"O-    c #D4EFE8",
+"P-    c #E9FCF6",
+"Q-    c #B4C5BF",
+"R-    c #C3D2CD",
+"S-    c #E1ECE8",
+"T-    c #EBF1EF",
+"U-    c #D5E1DD",
+"V-    c #7BA599",
+"W-    c #A0B0AD",
+"X-    c #8CB6AA",
+"Y-    c #CAE9E1",
+"Z-    c #B9D2CC",
+"`-    c #ACDFD0",
+" ;    c #A3D1C4",
+".;    c #3A7563",
+"+;    c #75A194",
+"@;    c #7CB5A4",
+"#;    c #4A8E79",
+"$;    c #74A999",
+"%;    c #519681",
+"&;    c #448571",
+"*;    c #86B0A2",
+"=;    c #F7FCF6",
+"-;    c #C9DED9",
+";;    c #629787",
+">;    c #1E6650",
+",;    c #72A596",
+"';    c #2A6F5A",
+");    c #49796B",
+"!;    c #65A290",
+"~;    c #2E725D",
+"{;    c #5F9A88",
+"];    c #578C7C",
+"^;    c #588D7D",
+"/;    c #78A699",
+"(;    c #609585",
+"_;    c #F4FFFC",
+":;    c #BCD6CD",
+"<;    c #D2E7E2",
+"[;    c #C3E9DE",
+"};    c #266351",
+"|;    c #6E988C",
+"1;    c #78A89A",
+"2;    c #C1F7E7",
+"3;    c #48907A",
+"4;    c #78AD9D",
+"5;    c #8BC1B1",
+"6;    c #7AA297",
+"7;    c #70AD9B",
+"8;    c #3E8670",
+"9;    c #609D8D",
+"0;    c #B9E1D6",
+"a;    c #FBFFFD",
+"b;    c #F7FBFC",
+"c;    c #EFFFFF",
+"d;    c #428A74",
+"e;    c #497E6E",
+"f;    c #7EC6B0",
+"g;    c #B2D6CC",
+"h;    c #86BBAB",
+"i;    c #A5C6BD",
+"j;    c #B4DED2",
+"k;    c #C2E0D8",
+"l;    c #C5E9DF",
+"m;    c #C2E1D9",
+"n;    c #98AFA9",
+"o;    c #B6D4CC",
+"p;    c #C0D7CF",
+"q;    c #DAEDE7",
+"r;    c #D5E4DF",
+"s;    c #E1EAE7",
+"t;    c #E6EAE9",
+"u;    c #B6D0C7",
+"v;    c #9FBDB3",
+"w;    c #AECFC6",
+"x;    c #A4D4C6",
+"y;    c #F9FDFE",
+"z;    c #6C9F90",
+"A;    c #7DAB9E",
+"B;    c #437969",
+"C;    c #598E7E",
+"D;    c #72AD9B",
+"E;    c #9CBDB4",
+"F;    c #78A497",
+"G;    c #7DAD9F",
+"H;    c #3C806B",
+"I;    c #67A495",
+"J;    c #F7FFFD",
+"K;    c #CFE4DF",
+"L;    c #6A9A8C",
+"M;    c #67A693",
+"N;    c #B3D9CE",
+"O;    c #548979",
+"P;    c #9EAAA8",
+"Q;    c #A3BCB6",
+"R;    c #A1D4C5",
+"S;    c #A1C2B9",
+"T;    c #76A497",
+"U;    c #518777",
+"V;    c #7DA79B",
+"W;    c #5C9584",
+"X;    c #B1CFC5",
+"Y;    c #AAC5BC",
+"Z;    c #AABFB8",
+"`;    c #F3FFFE",
+" >    c #EDF8F4",
+".>    c #B6C2BE",
+"+>    c #D1E6DF",
+"@>    c #D0EBE2",
+"#>    c #AFCEC6",
+"$>    c #C9D9D6",
+"%>    c #8FB0A7",
+"&>    c #9CBBB3",
+"*>    c #74AA9A",
+"=>    c #5E736E",
+"->    c #DDFEF5",
+";>    c #89B9AB",
+">>    c #B6D1CA",
+",>    c #508575",
+"'>    c #81A59B",
+")>    c #80BFAC",
+"!>    c #5C8C7E",
+"~>    c #3D7363",
+"{>    c #5DA08E",
+"]>    c #C3D6D2",
+"^>    c #699E8E",
+"/>    c #327D66",
+"(>    c #5A9785",
+"_>    c #4FA288",
+":>    c #67AB96",
+"<>    c #788F89",
+"[>    c #E6FFFD",
+"}>    c #8ABAAC",
+"|>    c #98C2B6",
+"1>    c #8CBCAE",
+"2>    c #E8FFFD",
+"3>    c #8EACA2",
+"4>    c #D6EDE5",
+"5>    c #DFEEE9",
+"6>    c #D1E8E0",
+"7>    c #AECCC2",
+"8>    c #78998E",
+"9>    c #C3E2DA",
+"0>    c #E6FBF6",
+"a>    c #87BAAB",
+"b>    c #88BEAE",
+"c>    c #E8F8F5",
+"d>    c #B3CEC7",
+"e>    c #609082",
+"f>    c #5D9886",
+"g>    c #C2E8DD",
+"h>    c #50786D",
+"i>    c #599281",
+"j>    c #5DB096",
+"k>    c #1A654E",
+"l>    c #4E8170",
+"m>    c #B7CAC6",
+"n>    c #92C5B6",
+"o>    c #3F836E",
+"p>    c #96C4B7",
+"q>    c #448370",
+"r>    c #7B948E",
+"s>    c #CBF3E8",
+"t>    c #CAEEE4",
+"u>    c #719D90",
+"v>    c #A2D5C6",
+"w>    c #639385",
+"x>    c #80B6A6",
+"y>    c #367562",
+"z>    c #6EA796",
+"A>    c #8DAEA3",
+"B>    c #9FB9B0",
+"C>    c #EAFDF7",
+"D>    c #E2EDE9",
+"E>    c #EBEBEB",
+"F>    c #B7CEC6",
+"G>    c #E2FFF7",
+"H>    c #6E9286",
+"I>    c #E4FBF5",
+"J>    c #648A7F",
+"K>    c #AEC1BD",
+"L>    c #3F6F61",
+"M>    c #A4D7C8",
+"N>    c #94B8AE",
+"O>    c #ADCBC3",
+"P>    c #D5D3D6",
+"Q>    c #88B6A9",
+"R>    c #C3EBE0",
+"S>    c #8DC8B6",
+"T>    c #8FD0BC",
+"U>    c #3F7464",
+"V>    c #2E7962",
+"W>    c #519B84",
+"X>    c #5AAD91",
+"Y>    c #5A917C",
+"Z>    c #F3FFF8",
+"`>    c #ACD2C7",
+" ,    c #64A893",
+".,    c #69978A",
+"+,    c #246C56",
+"@,    c #7AB7A5",
+"#,    c #85BBAB",
+"$,    c #659E8D",
+"%,    c #8EC4B4",
+"&,    c #8FBBAE",
+"*,    c #71978C",
+"=,    c #BBDFD5",
+"-,    c #7CA096",
+";,    c #ADD3C8",
+">,    c #97B8AD",
+",,    c #C5E9DD",
+"',    c #7FA095",
+"),    c #E9FEF7",
+"!,    c #FBF5F7",
+"~,    c #FEFAFB",
+"{,    c #D7D9D8",
+"],    c #B8CFC7",
+"^,    c #D3EEE5",
+"/,    c #8EBEB0",
+"(,    c #A5CFC3",
+"_,    c #20614D",
+":,    c #C2E6DC",
+"<,    c #7FB8A7",
+"[,    c #B0CBC4",
+"},    c #D2DBDA",
+"|,    c #EAFAF7",
+"1,    c #E2FFF8",
+"2,    c #B2C7C2",
+"3,    c #4C8977",
+"4,    c #18684F",
+"5,    c #367A63",
+"6,    c #9DCBC1",
+"7,    c #B1C6C1",
+"8,    c #D8F3EC",
+"9,    c #458A75",
+"0,    c #40846F",
+"a,    c #D5F4EC",
+"b,    c #CCEAE2",
+"c,    c #B9CEC9",
+"d,    c #9EC8BC",
+"e,    c #72AB9A",
+"f,    c #DCF5EF",
+"g,    c #DFF2EE",
+"h,    c #75998F",
+"i,    c #78A797",
+"j,    c #96C6B6",
+"k,    c #88A99E",
+"l,    c #B6C7C1",
+"m,    c #F1FAF7",
+"n,    c #D2E3DD",
+"o,    c #A7BEB6",
+"p,    c #E7FFF9",
+"q,    c #A9D3C7",
+"r,    c #ADBCB9",
+"s,    c #76AB9B",
+"t,    c #A8C1BB",
+"u,    c #5C9987",
+"v,    c #A6D6C8",
+"w,    c #58887A",
+"x,    c #A9BCB8",
+"y,    c #9AB5AE",
+"z,    c #397664",
+"A,    c #ABBBB8",
+"B,    c #649F8D",
+"C,    c #BEF1E2",
+"D,    c #25795F",
+"E,    c #50967E",
+"F,    c #538177",
+"G,    c #F9FFF9",
+"H,    c #66A391",
+"I,    c #488573",
+"J,    c #2F6E5B",
+"K,    c #508072",
+"L,    c #A4C3BB",
+"M,    c #5B8579",
+"N,    c #548778",
+"O,    c #7BB0A0",
+"P,    c #5B9C88",
+"Q,    c #7BAA9A",
+"R,    c #669988",
+"S,    c #B3E6D5",
+"T,    c #9CC2B5",
+"U,    c #DCF1EA",
+"V,    c #F7FDFB",
+"W,    c #DFE8E5",
+"X,    c #BBD2CA",
+"Y,    c #ACC7BE",
+"Z,    c #7AA498",
+"`,    c #C6ECE1",
+" '    c #669688",
+".'    c #BAD8D0",
+"+'    c #A6E5D2",
+"@'    c #86AAA0",
+"#'    c #AAD4C8",
+"$'    c #B8D6CE",
+"%'    c #1F6F56",
+"&'    c #559A85",
+"*'    c #236E57",
+"='    c #7EC4AC",
+"-'    c #7DA89F",
+";'    c #85CDB7",
+">'    c #87AFA4",
+",'    c #B6DCD1",
+"''    c #56A18A",
+")'    c #CFEEE6",
+"!'    c #ADC6C0",
+"~'    c #DEFDF5",
+"{'    c #B0DCCF",
+"]'    c #588B7C",
+"^'    c #9DC9BC",
+"/'    c #B2D6CA",
+"('    c #7DA799",
+"_'    c #ACD6C8",
+":'    c #E5FFFA",
+"<'    c #C3D4CE",
+"['    c #B5CFC6",
+"}'    c #7C9A90",
+"|'    c #DFFAF3",
+"1'    c #A5B4B1",
+"2'    c #8DB3A8",
+"3'    c #3E7B69",
+"4'    c #98CDBD",
+"5'    c #47917A",
+"6'    c #9FD4C4",
+"7'    c #76A295",
+"8'    c #9FD5C5",
+"9'    c #79B6A4",
+"0'    c #458672",
+"a'    c #5E9484",
+"b'    c #498A76",
+"c'    c #256D55",
+"d'    c #729D94",
+"e'    c #FEFFFB",
+"f'    c #B6CFC9",
+"g'    c #AAC1BB",
+"h'    c #8BBBAD",
+"i'    c #8CBAAD",
+"j'    c #8EA9A2",
+"k'    c #ABD7CA",
+"l'    c #578376",
+"m'    c #549581",
+"n'    c #498875",
+"o'    c #477C6C",
+"p'    c #7CAA9D",
+"q'    c #80B0A2",
+"r'    c #568C7C",
+"s'    c #A3C4B9",
+"t'    c #7BA496",
+"u'    c #618B7D",
+"v'    c #C9E7DD",
+"w'    c #9FBDB5",
+"x'    c #7AA699",
+"y'    c #AAE7D5",
+"z'    c #98B7AF",
+"A'    c #6B9186",
+"B'    c #73A999",
+"C'    c #407062",
+"D'    c #578779",
+"E'    c #3A7765",
+"F'    c #629D8B",
+"G'    c #7DB3A3",
+"H'    c #398169",
+"I'    c #A6CFC7",
+"J'    c #B1CAC4",
+"K'    c #6EA393",
+"L'    c #4A8B77",
+"M'    c #75B4A1",
+"N'    c #3F7565",
+"O'    c #D2F3EA",
+"P'    c #B4E0D3",
+"Q'    c #6F9B8E",
+"R'    c #A8D4C7",
+"S'    c #769C91",
+"T'    c #C8E3DC",
+"U'    c #C8DBD7",
+"V'    c #91BAAC",
+"W'    c #457565",
+"X'    c #A3D8C6",
+"Y'    c #649081",
+"Z'    c #90ABA2",
+"`'    c #90A39D",
+" )    c #C0DAD1",
+".)    c #BEDED3",
+"+)    c #D7EEE8",
+"@)    c #BACFCA",
+"#)    c #BFE9DD",
+"$)    c #92BEB1",
+"%)    c #478B76",
+"&)    c #56897A",
+"*)    c #6EA997",
+"=)    c #7CB2A2",
+"-)    c #4B937D",
+";)    c #98B1AB",
+">)    c #8FB9AD",
+",)    c #B2DACF",
+"')    c #327762",
+"))    c #1D654D",
+"!)    c #8EB7AF",
+"~)    c #FDFFFA",
+"{)    c #ACD0C6",
+"])    c #00593D",
+"^)    c #559280",
+"/)    c #005D40",
+"()    c #639E8C",
+"_)    c #A2CCC0",
+":)    c #064B36",
+"<)    c #5E9383",
+"[)    c #6B9589",
+"})    c #71B6A1",
+"|)    c #2E735E",
+"1)    c #A9D5C8",
+"2)    c #C5D5D2",
+"3)    c #A2C6BA",
+"4)    c #7FAB9C",
+"5)    c #417463",
+"6)    c #DAFFF6",
+"7)    c #E8FFF9",
+"8)    c #C4D0CC",
+"9)    c #A5B8B2",
+"0)    c #A4BFB6",
+"a)    c #70968B",
+"b)    c #8CC5B4",
+"c)    c #D4E4E1",
+"d)    c #618B7F",
+"e)    c #2C715C",
+"f)    c #E5FAF5",
+"g)    c #18624B",
+"h)    c #3D6D5F",
+"i)    c #59A18B",
+"j)    c #689B8C",
+"k)    c #387E66",
+"l)    c #9FC8C0",
+"m)    c #FCFFFB",
+"n)    c #94BCB1",
+"o)    c #95CEBD",
+"p)    c #285E4E",
+"q)    c #DDFFFC",
+"r)    c #78B3A1",
+"s)    c #346959",
+"t)    c #B6E0D4",
+"u)    c #7AA89B",
+"v)    c #C4F7E8",
+"w)    c #497F6F",
+"x)    c #ADE3D3",
+"y)    c #759B90",
+"z)    c #9EBEB3",
+"A)    c #89AFA2",
+"B)    c #C9E9DE",
+"C)    c #D9E8E3",
+"D)    c #F1FDF9",
+"E)    c #88A39A",
+"F)    c #C0E0D5",
+"G)    c #A9D1C6",
+"H)    c #C6EAE0",
+"I)    c #91AFA7",
+"J)    c #7EAEA0",
+"K)    c #084C37",
+"L)    c #C9E7DF",
+"M)    c #82AA9F",
+"N)    c #5BA68F",
+"O)    c #4D8A78",
+"P)    c #BEDCD4",
+"Q)    c #85B8A9",
+"R)    c #87BCAC",
+"S)    c #0B5F45",
+"T)    c #4F937E",
+"U)    c #5F9E8B",
+"V)    c #347861",
+"W)    c #A3CCC4",
+"X)    c #AEC9C2",
+"Y)    c #104B39",
+"Z)    c #98C6B9",
+"`)    c #1B654E",
+" !    c #6DA393",
+".!    c #B6E6D8",
+"+!    c #458270",
+"@!    c #B2C2BF",
+"#!    c #8DB5AA",
+"$!    c #76A698",
+"%!    c #96CCBC",
+"&!    c #609B89",
+"*!    c #BED7D1",
+"=!    c #93A6A2",
+"-!    c #EFFEFB",
+";!    c #FEF8FA",
+">!    c #DBD5D7",
+",!    c #DEFFF9",
+"'!    c #C7D6D1",
+")!    c #8BBBAB",
+"!!    c #ABDECF",
+"~!    c #96B7AE",
+"{!    c #ACD6CA",
+"]!    c #5D9383",
+"^!    c #6BA493",
+"/!    c #50917D",
+"(!    c #377C67",
+"_!    c #379074",
+":!    c #B1DDD0",
+"<!    c #387C67",
+"[!    c #2B8166",
+"}!    c #5EA38E",
+"|!    c #3F846F",
+"1!    c #58918B",
+"2!    c #F8FFF8",
+"3!    c #1C7056",
+"4!    c #1D654F",
+"5!    c #7BB4A3",
+"6!    c #44947B",
+"7!    c #317963",
+"8!    c #5FA08C",
+"9!    c #3F8771",
+"0!    c #7EAC9F",
+"a!    c #C9D5D3",
+"b!    c #F6FCFC",
+"c!    c #F1F7F5",
+"d!    c #CEE8DF",
+"e!    c #CDE0DA",
+"f!    c #5B7F73",
+"g!    c #B3D2CA",
+"h!    c #2F7761",
+"i!    c #8EACA4",
+"j!    c #C0CFCC",
+"k!    c #4E9E85",
+"l!    c #809E96",
+"m!    c #75BFA8",
+"n!    c #4B967F",
+"o!    c #206E56",
+"p!    c #1E6952",
+"q!    c #0A4332",
+"r!    c #004027",
+"s!    c #3D7A68",
+"t!    c #0E674B",
+"u!    c #2D6C59",
+"v!    c #589C87",
+"w!    c #659995",
+"x!    c #FAFFF6",
+"y!    c #A7CDC2",
+"z!    c #2A8065",
+"A!    c #488975",
+"B!    c #2B6050",
+"C!    c #6E9E90",
+"D!    c #266A55",
+"E!    c #B4E7D8",
+"F!    c #4F7F71",
+"G!    c #569B86",
+"H!    c #BADBD2",
+"I!    c #89C4B2",
+"J!    c #09513B",
+"K!    c #5BA991",
+"L!    c #649D8C",
+"M!    c #A9D9CB",
+"N!    c #E9F3F2",
+"O!    c #EDEFEE",
+"P!    c #DBEEE8",
+"Q!    c #9FAAA6",
+"R!    c #DFFDF3",
+"S!    c #6DA091",
+"T!    c #4A8F7A",
+"U!    c #89BFAF",
+"V!    c #81B6A6",
+"W!    c #36896F",
+"X!    c #328269",
+"Y!    c #185945",
+"Z!    c #9DC7BB",
+"`!    c #4B8C78",
+" ~    c #4B7B6D",
+".~    c #024732",
+"+~    c #4C8D79",
+"@~    c #558577",
+"#~    c #194F3F",
+"$~    c #51927C",
+"%~    c #588B86",
+"&~    c #F9FCF3",
+"*~    c #B3CCC6",
+"=~    c #1B6E54",
+"-~    c #2A7E64",
+";~    c #11674C",
+">~    c #015B3F",
+",~    c #93BBB0",
+"'~    c #538E7C",
+")~    c #1F5847",
+"!~    c #8FC5B5",
+"~~    c #68837C",
+"{~    c #88B8AA",
+"]~    c #4F8575",
+"^~    c #75AE9D",
+"/~    c #225D4B",
+"(~    c #69A895",
+"_~    c #BDDBD3",
+":~    c #EEF8F7",
+"<~    c #AEC7C1",
+"[~    c #F1FDFB",
+"}~    c #AAD6C7",
+"|~    c #E3F6F0",
+"1~    c #D8FCF2",
+"2~    c #276854",
+"3~    c #1D7056",
+"4~    c #0C4232",
+"5~    c #21624E",
+"6~    c #2E8469",
+"7~    c #5A9986",
+"8~    c #04573D",
+"9~    c #38836C",
+"0~    c #0A3F2F",
+"a~    c #126B4F",
+"b~    c #127A59",
+"c~    c #307560",
+"d~    c #004B30",
+"e~    c #70BAA3",
+"f~    c #185C45",
+"g~    c #97CEC8",
+"h~    c #FCFFF6",
+"i~    c #72B6A1",
+"j~    c #3C7765",
+"k~    c #3D7C69",
+"l~    c #0C6247",
+"m~    c #4F9982",
+"n~    c #004B33",
+"o~    c #2A6E59",
+"p~    c #89CAB6",
+"q~    c #2E7C64",
+"r~    c #C7EBE1",
+"s~    c #336959",
+"t~    c #84BAAA",
+"u~    c #3C7B68",
+"v~    c #589D88",
+"w~    c #89AFA4",
+"x~    c #FCFDFF",
+"y~    c #F0F9F6",
+"z~    c #E0EBE7",
+"A~    c #528171",
+"B~    c #E8FDF6",
+"C~    c #8BC2AF",
+"D~    c #E6FDF5",
+"E~    c #477D6D",
+"F~    c #76BEA8",
+"G~    c #2E886C",
+"H~    c #0D6C4E",
+"I~    c #13674D",
+"J~    c #025239",
+"K~    c #01553B",
+"L~    c #076044",
+"M~    c #377462",
+"N~    c #DCFDF4",
+"O~    c #33725F",
+"P~    c #36816A",
+"Q~    c #358069",
+"R~    c #1E6C54",
+"S~    c #01472D",
+"T~    c #599289",
+"U~    c #F4FFF2",
+"V~    c #B7CEC8",
+"W~    c #0D5D44",
+"X~    c #568B7B",
+"Y~    c #558B7B",
+"Z~    c #1F6751",
+"`~    c #296A56",
+" {    c #72B39F",
+".{    c #1D614C",
+"+{    c #1E7258",
+"@{    c #5D877B",
+"#{    c #326F5D",
+"${    c #4B8A77",
+"%{    c #4A8976",
+"&{    c #024A34",
+"*{    c #155944",
+"={    c #E0FFFF",
+"-{    c #A7CBC1",
+";{    c #5C8479",
+">{    c #DFE9E8",
+",{    c #F5FBFB",
+"'{    c #9FB0AA",
+"){    c #D4E9E2",
+"!{    c #87B7A7",
+"~{    c #ABD4C6",
+"{{    c #0F3F2F",
+"]{    c #678178",
+"^{    c #1C664F",
+"/{    c #217E61",
+"({    c #004F33",
+"_{    c #24745B",
+":{    c #2F6C5A",
+"<{    c #216F57",
+"[{    c #115F47",
+"}{    c #63A893",
+"|{    c #005B3A",
+"1{    c #004C34",
+"2{    c #3A7362",
+"3{    c #549380",
+"4{    c #619D84",
+"5{    c #86B9B0",
+"6{    c #F1FCEC",
+"7{    c #E7FFFF",
+"8{    c #5BA08B",
+"9{    c #075B41",
+"0{    c #0F5F46",
+"a{    c #59A38C",
+"b{    c #29775F",
+"c{    c #EAFFFD",
+"d{    c #F3FCFB",
+"e{    c #09573F",
+"f{    c #C5FBEB",
+"g{    c #DEFFFC",
+"h{    c #C0E8DD",
+"i{    c #F2FEFC",
+"j{    c #72A292",
+"k{    c #B9DACF",
+"l{    c #A7C2B9",
+"m{    c #B0D6C9",
+"n{    c #9FC9BB",
+"o{    c #3D7864",
+"p{    c #F8F3F7",
+"q{    c #003321",
+"r{    c #23795E",
+"s{    c #0B5B42",
+"t{    c #92A7A2",
+"u{    c #FBFBFD",
+"v{    c #E4FFFA",
+"w{    c #8DB1AD",
+"x{    c #B4C4C1",
+"y{    c #7E958F",
+"z{    c #427767",
+"A{    c #FEF9FD",
+"B{    c #277A60",
+"C{    c #619787",
+"D{    c #1A5543",
+"E{    c #52917E",
+"F{    c #A0CCBF",
+"G{    c #739F92",
+"H{    c #94C2B5",
+"I{    c #236951",
+"J{    c #C5F4E4",
+"K{    c #C7F0E2",
+"L{    c #073727",
+"M{    c #5E8276",
+"N{    c #529880",
+"O{    c #FDFBFE",
+"P{    c #BAF5E3",
+"Q{    c #12533F",
+"R{    c #08583F",
+"S{    c #106D50",
+"T{    c #13664C",
+"U{    c #B9D1C3",
+"V{    c #6E8384",
+"W{    c #FFFBF2",
+"X{    c #6CA18F",
+"Y{    c #52907B",
+"Z{    c #7CBAA5",
+"`{    c #44826D",
+" ]    c #5F9D88",
+".]    c #0F5940",
+"+]    c #ACD2C5",
+"@]    c #B5DFD1",
+"#]    c #2D755D",
+"$]    c #2E7E63",
+"%]    c #57B092",
+"&]    c #126F50",
+"*]    c #1A684E",
+"=]    c #A3CDBF",
+"-]    c #0F553D",
+";]    c #ACD8C9",
+">]    c #256F56",
+",]    c #006341",
+"']    c #2E6D58",
+")]    c #9FC8BA",
+"!]    c #3C826A",
+"~]    c #02583B",
+"{]    c #065037",
+"]]    c #18684D",
+"^]    c #ACCAC0",
+"/]    c #166351",
+"(]    c #63A792",
+"_]    c #B8D2C9",
+":]    c #70A593",
+"<]    c #518F7A",
+"[]    c #599883",
+"}]    c #79B7A2",
+"|]    c #54937E",
+"1]    c #16694D",
+"2]    c #184234",
+"3]    c #123C2E",
+"4]    c #094D36",
+"5]    c #0C543C",
+"6]    c #003C22",
+"7]    c #126549",
+"8]    c #145841",
+"9]    c #265D4A",
+"0]    c #00482D",
+"a]    c #0C4733",
+"b]    c #156B4E",
+"c]    c #006F48",
+"d]    c #2C8164",
+"e]    c #0A4531",
+"f]    c #0A281E",
+"g]    c #10271F",
+"h]    c #29493E",
+"i]    c #1E5D48",
+"j]    c #0E6145",
+"k]    c #0D4C37",
+"l]    c #19654B",
+"m]    c #FFF6FE",
+"n]    c #81B8A5",
+"o]    c #539A8A",
+"p]    c #7FBAA8",
+"q]    c #FFFEF8",
+"r]    c #98BEB1",
+"s]    c #71A694",
+"t]    c #1C5D47",
+"u]    c #A8E9D3",
+"v]    c #43826D",
+"w]    c #55947F",
+"x]    c #F7F7F7",
+"y]    c #136147",
+"z]    c #D1F2E7",
+"A]    c #DCF6ED",
+"B]    c #CAF4E6",
+"C]    c #D1FAEC",
+"D]    c #305C4D",
+"E]    c #699989",
+"F]    c #D5F6EB",
+"G]    c #B4C3BE",
+"H]    c #3D6658",
+"I]    c #68AE96",
+"J]    c #EFFFFD",
+"K]    c #FFFBFC",
+"L]    c #EAFFF8",
+"M]    c #7DB4A1",
+"N]    c #0D5B41",
+"O]    c #05442F",
+"P]    c #B0DFCF",
+"Q]    c #FFF3F8",
+"R]    c #005735",
+"S]    c #1D604F",
+"T]    c #FFF9F5",
+"U]    c #B4CEC5",
+"V]    c #93B9AC",
+"W]    c #72A795",
+"X]    c #32765F",
+"Y]    c #7CC2AA",
+"Z]    c #357660",
+"`]    c #3F806A",
+" ^    c #11523C",
+".^    c #C6CCCA",
+"+^    c #18533F",
+"@^    c #84B3A3",
+"#^    c #F2FDF9",
+"$^    c #94C3B3",
+"%^    c #216951",
+"&^    c #306E59",
+"*^    c #608F7F",
+"=^    c #005132",
+"-^    c #5EA593",
+";^    c #639A87",
+">^    c #FFFAF8",
+",^    c #8FB5A8",
+"'^    c #74A997",
+")^    c #004129",
+"!^    c #1E664E",
+"~^    c #5EA48C",
+"{^    c #31755E",
+"]^    c #41806B",
+"^^    c #FFF7FB",
+"/^    c #E6FFF7",
+"(^    c #6DAB96",
+"_^    c #427B68",
+":^    c #EFFAF6",
+"<^    c #9BC5B7",
+"[^    c #F8F2F4",
+"}^    c #D8F8ED",
+"|^    c #EEF9F5",
+"1^    c #E8FFF7",
+"2^    c #004B2E",
+"3^    c #689D8B",
+"4^    c #297761",
+"5^    c #3C7D67",
+"6^    c #2B775D",
+"7^    c #2B7159",
+"8^    c #1B674D",
+"9^    c #EDFCF7",
+"0^    c #A0C1B6",
+"a^    c #D6F6EB",
+"b^    c #9AC0B3",
+"c^    c #729B8D",
+"d^    c #FAF6F7",
+"e^    c #2B6F58",
+"f^    c #F2FBF8",
+"g^    c #FCF8F9",
+"h^    c #F3FEFA",
+"i^    c #F9F5F6",
+"j^    c #4D8C77",
+"k^    c #1E6C52",
+"l^    c #A7D1C3",
+"m^    c #287B61",
+"n^    c #3A8068",
+"o^    c #F6FFF8",
+"p^    c #B1CBC2",
+"q^    c #83A99C",
+"r^    c #003A20",
+"s^    c #0E5C42",
+"t^    c #246E55",
+"u^    c #1B694F",
+"v^    c #B1D1C6",
+"w^    c #417C68",
+"x^    c #407F6A",
+"y^    c #95BFB1",
+"z^    c #609382",
+"A^    c #9BC7B8",
+"B^    c #448A72",
+"C^    c #FFF5F9",
+"D^    c #2E6955",
+"E^    c #033C29",
+"F^    c #10513B",
+"G^    c #26715A",
+"H^    c #42866F",
+"I^    c #B3CDC4",
+"J^    c #82A89B",
+"K^    c #6DA290",
+"L^    c #004C32",
+"M^    c #0B593F",
+"N^    c #014B32",
+"O^    c #236B53",
+"P^    c #96BAAE",
+"Q^    c #51957E",
+"R^    c #357F66",
+"S^    c #90BCAD",
+"T^    c #4E8572",
+"U^    c #91C0B0",
+"V^    c #3F856D",
+"W^    c #073626",
+"X^    c #0E694A",
+"Y^    c #105540",
+"Z^    c #3A7863",
+"`^    c #FAFFFC",
+" /    c #AED4C7",
+"./    c #82AC9E",
+"+/    c #61A28C",
+"@/    c #06361C",
+"#/    c #003D1E",
+"$/    c #004A2A",
+"%/    c #2D644D",
+"&/    c #F4FFFA",
+"*/    c #FAF9FE",
+"=/    c #1E6E53",
+"-/    c #1A7053",
+";/    c #42836D",
+">/    c #95C4B4",
+",/    c #085038",
+"'/    c #FCFAFD",
+")/    c #FFFAFB",
+"!/    c #457F67",
+"~/    c #003B20",
+"{/    c #13513A",
+"]/    c #3E8371",
+"^/    c #AED2C6",
+"//    c #85AEA0",
+"(/    c #EFFBF7",
+"_/    c #FFF2F7",
+":/    c #7BA798",
+"</    c #002F13",
+"[/    c #004B2A",
+"}/    c #00502F",
+"|/    c #386F58",
+"1/    c #F2FFFA",
+"2/    c #FFF9FC",
+"3/    c #186249",
+"4/    c #94B5AA",
+"5/    c #0F6548",
+"6/    c #44856F",
+"7/    c #97C3B4",
+"8/    c #054B33",
+"9/    c #BED3CA",
+"0/    c #719587",
+"a/    c #FFFAFC",
+"b/    c #F3FFF9",
+"c/    c #D8F4E8",
+"d/    c #00371E",
+"e/    c #034329",
+"f/    c #2F7461",
+"g/    c #FFF8FD",
+"h/    c #81AD9E",
+"i/    c #1C4C36",
+"j/    c #003319",
+"k/    c #114F36",
+"l/    c #CDF4E2",
+"m/    c #FFF6F9",
+"n/    c #074D35",
+"o/    c #9BBCB1",
+"p/    c #003B26",
+"q/    c #0D6648",
+"r/    c #8FC6B3",
+"s/    c #40816B",
+"t/    c #96C0B2",
+"u/    c #00452D",
+"v/    c #BAD5C6",
+"w/    c #083F28",
+"x/    c #D0E8DB",
+"y/    c #FDFEFF",
+"z/    c #5C8A7F",
+"A/    c #002F14",
+"B/    c #418570",
+"C/    c #AAD3C5",
+"D/    c #649987",
+"E/    c #FFF7FD",
+"F/    c #EEFFF5",
+"G/    c #DBF5E8",
+"H/    c #E9FFF6",
+"I/    c #0B5139",
+"J/    c #00331D",
+"K/    c #096647",
+"L/    c #95C8B7",
+"M/    c #3D7C67",
+"N/    c #9BC1B4",
+"O/    c #00402A",
+"P/    c #B1D7C2",
+"Q/    c #002D16",
+"R/    c #45705C",
+"S/    c #FBFDFA",
+"T/    c #FFEFFC",
+"U/    c #043F23",
+"V/    c #3A7966",
+"W/    c #F8FAF7",
+"X/    c #B1DBCD",
+"Y/    c #1D5B46",
+"Z/    c #EBFFFC",
+"`/    c #FFFDFD",
+" (    c #FAFCF9",
+".(    c #5A8979",
+"+(    c #97C1B3",
+"@(    c #00301A",
+"#(    c #045D3F",
+"$(    c #94C0B1",
+"%(    c #3A7360",
+"&(    c #99B9AE",
+"*(    c #00311D",
+"=(    c #A9DBC2",
+"-(    c #052C17",
+";(    c #002F15",
+">(    c #C5E1D5",
+",(    c #FFF6FF",
+"'(    c #90BBA7",
+")(    c #AACABF",
+"!(    c #00321F",
+"~(    c #698F82",
+"{(    c #FCF6F8",
+"](    c #C9EFE2",
+"^(    c #002F1B",
+"/(    c #0E4D38",
+"((    c #98BCB0",
+"_(    c #003220",
+":(    c #105840",
+"<(    c #9CC0B4",
+"[(    c #568575",
+"}(    c #134635",
+"|(    c #A7D7C1",
+"1(    c #002A16",
+"2(    c #003019",
+"3(    c #34755D",
+"4(    c #F2F4F3",
+"5(    c #EEFFFA",
+"6(    c #7FA59A",
+"7(    c #FEF9F5",
+"8(    c #E7F2EE",
+"9(    c #6D9789",
+"0(    c #689284",
+"a(    c #D6DCDA",
+"b(    c #F3F9F9",
+"c(    c #ECF8F4",
+"d(    c #7D9B91",
+"e(    c #75A190",
+"f(    c #CCE3DB",
+"g(    c #7E9C92",
+"h(    c #CAE5DC",
+"i(    c #A4C8BC",
+"j(    c #D1E0DB",
+"k(    c #7CA899",
+"l(    c #E0F1E9",
+"m(    c #7CA293",
+"n(    c #719A8A",
+"o(    c #619481",
+"p(    c #FAFAF8",
+"q(    c #F6FFFB",
+"r(    c #E2F8F5",
+"s(    c #FFFCFA",
+"t(    c #E3FFFF",
+"u(    c #FBF9FE",
+"v(    c #F9F7FA",
+"w(    c #EFFFFA",
+"x(    c #FEF3F7",
+"y(    c #FFF7FA",
+"z(    c #E0FFFB",
+"A(    c #EBFFFF",
+"B(    c #EFFFFB",
+"C(    c #FFF7F8",
+". + @ # $ % & * = - ; $ $ $ > , ' # ) ! # % ~ , { ] ^ / ( { _ $ : : < [ { } | | 1 2 3 4 ( 1 | 5 ! = 6 ",
+"7 8 9 0 a b c d e f g h { i j j k l m n o p o q r s t u v w x y z A B C D # E ~ F G H I J K L M N O P ",
+"- Q R S T U V W X Y Z `  .# ~ ..+.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.4 [.}.|.1.2.3.4.5.6.7.",
+"j 8.9.0.a.b.c.d.e.f.g. .h.i.j.1 k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.<.F.G.H.I.G J.K.L.M.N.O.P.Q.",
+"R.S.T.U.V.W.X.Y.Z.`. +.+++$ [ @+#+$+%+&+*+=+-+;+>+,+'+)+!+~+{+]+^+G /+[ { (+1 _+:+<+[+}+|+1+2+3+4+5+[ ",
+"#+6+7+8+9+0+a+b+c+d+e+f+# g+h+$ 4 i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+, # ~ A+~ B+, C+D+E+F+G+H+I+J+1 ",
+"[ K+L+M+N+O+P+=+Q+R+S+T+U+V+5 1 W+: : X+Y+Z+`+ @.@+@@@#@$@%@&@*@~ =@( -@;@[ $ >@,@8.'@)@!@w+~@{@]@^@/@",
+"U+(@_@:@<@[@}@|@1@2@3@4@5@6@b j [ 7@8@9@$ 0@a@b@c@d@e@f@g@h@i@j@k@l@m@n@( o@p@q@r@s@t@u@v@w@x@y@z@A@B@",
+"~ C@D@E@F@G@H@I@J@K@L@M@# N@O@- { b C@P@Q@R@S@T@U@V@W@X@Y@c@Z@`@o@..( (  #.## +#| @###$#%#&#*#=#-#;#>#",
+"j ,#'#)#!#~#{#]#^#/#(#_#:#<#, [ * ( [#}#|#1#2#3#4#5#6#7#8#9#0#a#[ =@-@-@ #$ b#c#d#e#~ f#Y+g#h#i#j#k#l#",
+"m#n#o#p#q#r#s#t#u#- v#w#x#y#z#1 [ A#B#: C#D#b E#F#G#H#I#J#K#L#M#R.( ( N#E # O#P#Q#R#S#T#U#V#W#X#Y#Z#`#",
+"m#B# $.$ @+$@$#$$$%$&$*$=$-$;$>${ O@- ,$'$)$!$~${$]$^$/$($_$:$, <$( [$[ ~ }$|$1$2$3$4$m+5$6$7$8$9$0$a$",
+"{ b$c$d$e$f$g$h$i$j$k$l$G m$n$o$~ j / p$, q$r$s$t$u$v$w$x$y$, $ ( -@-@R.z$A$B$o$C$D$_@~ E$F$G$H$I$J$B@",
+"|#K$;+L$M$N$O$P$Q$R$S$T$U$f V$W$' | - 1 X$Y$Z$`$ %.%+%@%#%$%%%| -@N#( &%$ *%: =%-%;%>%,%'%)%v$w#!%~%/@",
+"{ {%]%^%/%(%_%:%<%[%}%|%1%2%3%P$4%$ 5%@+[ ~ 6%# 7%8%9%0%a%b%( c%$ d%( z$e%f%g%h%i%j%b k%l%m%n%o%p%q%r%",
+"$ s%t%u%v%w%x%y%z%A%B%C%D%E%2%F%G%$ [ ( ;@ #H%I%J%v+K%L%M%N%@+O%~ [ { -@G P%Q%R%S%T%U%V%W%X%Y%Z%`% &.&",
+"+&@&#&$&%&&&*&=&-&;&>&,&'&)&U+!&~&$ {&;@[$[ ~&]&^&/&(&o$= _&:&( -@<&[&{ }&- |&1&Z+2&3&4&5&6&7&8&9&0&a&",
+"# b&c&d&e&f&g&h&i&j&k&l&m&n&o&p&q&k@&%( ( [ ~ ~&r&s&t&u&v&&%[ E { [ ( ~ w&x&y&z&A&B&C&D&E&7$S#F&G&H&I&",
+"{ o@G%J&-@K&- L&P$M&N&O&P&Q&- B#g+E ( { { ( R&$ S&T&G%( U&V&[ R&[${ 5%W&, X&Y&Z&`&w@4& *.*+*E@@*#*$*%*",
+"&*i.[ **=*| ( -*]#( ;*>*,*'*)*!*5%~*;@{*V&( [ o@- ]*[ ^*{ { ;@[ [ /*o@(*_*:*<*[*}*|*1*2*3*4*5*6*7*u$2 ",
+"| ( 8*~ {*j [&$ ~ : 9*1 0*a*: b*~ {&( { { c*[ o@~ :&( { d*/*{ e*@+[ 5%4%f*g*h*i*j*k*l*m*n*o*'#p*q*r*s*",
+"{ z$= t*u*( [ $ # v*j v*{ |#, w*~ [ n@e*{ ;@[ 5%e*{ **{ { { O%j &%G%~ ( x*y*h#z*A*B*C*D*E*F*~#G*H*w#/*",
+", I*J*|#K*L*M*N*~ R&~ :&[  #[$( ( ( ( ( ( ( ( -@( ( ( ( ( ( ( (  #&%[ [ [ [ @+R.[ 5%q&, O*P*Q*R*S*c#_.",
+"{ * T*[ U*$ A#V*{ U&{ U&{ y*j O%n@n@n@-@-@( ( ( ( ( ( ( ( ( ( ( ( -@-@c*( ( ( c*&%@+~ $ # W*X*t*h+]*Y*",
+"Z*R$`* =n+&@.=+=*%@=}$#=f*$ u*~ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( { {*{ { { e*{ { -@[$( <$[ [ $=~ n@[ %=",
+"{ }.&=*=o$==-=G &%[${ V&j &*=*1 n@n@n@n@-@-@( ( ( ( ( ( ( ( ( ( { e*V&U&{ {*{ ;=U&{ { ;={ >={ ,=V&n@%*",
+"$ d#'=)=!=u#~={=s&]=^=/=(== _=, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( {*{ { U&V&{ { {*[  #<$( -@( :={ <=5%[=",
+"j }=|=1=2=3=4=5=6=7=8=, 9=R&0=-@-@( ( ( ( ( ( -@( ( ( ( ( ( ( ( [ [ {&[ @+&%a=[ h+$ 4%# # b=c=-*d=e=f=",
+"j g=h=p.i=j=k=l=m=n=o=p=q=b r=s=t=u=v=N#n@( ( ( -@-@-@-@-@-@-@-@o@w=x=<&E 5%y=<&@=@=z=A=B=C=w+(&D=E=F=",
+"# !=G=H=I=J=K=L=M=N=O=P=Q=R=S=T=[$n@( ( ( ( ( -@-@-@-@-@-@-@-@-@U=$ H%$ V=~&6%$ W=X=Y=Z=`= -.-+-@-#-$-",
+", %-&-*-=---= ;->-9#,-'-)-!-~-d#<*{-, ]-~ :&{ { ( n@( m@~ , ^-R=/-r@(-Y+_-F$:-<-o$[-o$}-|-&-1-2-3-4-5-",
+"~ 8.6-7-8-9-0-a-b-c-d-e-f-g-h-i-W=j-k-]*~ [ ;@{ N#( ( [ l-m-G n-o-p-|-q-4=Q+r-s-t-u-v-w-x-y-z-A-B-C->#",
+"D-E-w-F-G-H-$ I-J-#%K-L-M-N-I#O-P-Q-R-S-T-&%( { ( ( -@ #$ U-/=9 B#V-W-X-Y-Z-`- ;.;+;@;S@#;$;%;m%&;*;=;",
+"~ -;;;>;,;';(@);!;~;{;];D*^;/;(;f&t G _;E.[ [$U&-@n@&%E f*|$o$:;!-<;[;n&J@<*};|;1;2;3;4;5;6;7;8;9;0;a;",
+"b;c;f-d;e;f;g;h;i;j;u$k;l;m;n;o;:-p;q;r;s;E ( { ( ;@&%t;, : u;v;w;U+x;y;z;b$A;V$'&B;C;D;E;F;G;H;I;[+J;",
+"# K;L;M;N;O;P;Q;R;S;T;U;@@V;W;O$X;Y;Z;`; >~ ( **( [ [ p@.>+>@>k.#>$>%>&> **>=>->B*;>>>,>'>)>!>~>{>m*#+",
+"( ]>^>/>(>_>f$:><>J=[>;$}>|>!&1>2>3>4>S=, R&c*{ ( R.5%# 5>6>7>8>H$9>0>a>y@b>c>= d>e>D;f>g>h>i>j>k>l>_.",
+"A+m>n>o>p>q>r>s>|>t>u>v>w>x>y>z>A>a%B>C>D>o@E>U&( [ ~ G%t*F>G>H>I>J>K>L>M>N>O>P>Q>R>S>5@T>U>V>W>X>Y>Z>",
+"= `> ,.,F;+,@,#,$,%,f$&,*,=,-,;,>,,,',),[ | !,{ ~,{ V&{,J;<*],^,/,(,k&w;_,:,<,[,},|,J=b 1,2,3,4,5,6,Y*",
+"5 7,8,9,0,a,<%b,c,d,e,A;f,g,h,X+i,j,_%k,l,~ ~ m,{ **{ [ ]*n,o,p,q,r,s,t,f>u,v,w,x,0@y,z,A,B,C,D,E,F,G,",
+"5 Z-H,I,B,J,K,L,N;M,B*N,O,1*F*P,Q,R,S,T,U,J;V,, {*{ N#&%W,G X,Y,F@3%Z,`,>+j$ '.'+'@'#'$'%'&'*',;='-'/@",
+"# )$;'>','''L+~#)'!'d#~'{']'^'n /'('_':'z=-@U&c*{ d%( ~ +#<'['}'==|'1'2'3'4'5'6'7'8'9'0'a'$,L+b'c'd'e'",
+"( f'g'h'i'j'G;k'l'5;m'n'o'p'q'r's't'u'l+<'@+{ { c*( c*~ +#n-w+v'3@w'x's>o#y'z'A'B'C' ;D'E'F'G'u>H'I'e'",
+"p$J'K'L'M'N' 'O'P'Q'R'p'd@S'T'U'V'W'X'Y'Z'-*E o@( N#[ p@+#`' ).)6#+)@)#)$)%)&)K'9>*)=)-);)>),)')))!)~)",
+"( {)])v@^)/)()_):)<)[)z;})|)1)2)3)4)5)6)7)# N#( n@(  #T-8)9)0)h#a)b)c)=)d)<%$)f'e)]$8-f)g)h)i)j)k)l)m)",
+"- '*n)o)p)q)r)s)t)u)v)w)x)1>y)O>0*z)A)B)C){ 1 >$( &%@+$ D): E)F)G)H)I)J)w;K)L)M)N)O)P)Q)R)S)T)U)V)W)/@",
+"= X)Y)Z)e$`)I, ,R@ !.!+!@!#!$!%!&!*!=!$>j $ -!| ;!1 **# >!,!'!)!!!z'T'~!{!]!^!+=/!(!_!:!<!9,[!}!|!1!2!",
+"| u#3!4!<@5!S$o*6!7!8!9!k=3*0! @e,i@o$a!~ b!$ | ( ;=( c![ d!e!f!g!h!i!j!k!:>l!m!n!o!p!q!r!s!t!u!v!w!x!",
+"$ y!z!A!1)B!C!D!E!F!X%G!H!I!J!K!L!M!Q&N!f # j j p@$ [ O!P!Q!R!U,S!T!U!V!W!X!Y!3!k>Z!`! ~.~+~@~#~$~%~&~",
+"{ *~=~-~;~>~o&,~'~)~!~9,~~{~]~^~/~(~_~:~<~[~p$j $ # :&[ /'E.}~|~<@1~2~3~4~5~6~7~8~9~0~a~b~c~d~e~f~g~h~",
+"o$C@i~j~k~l~m~n~o~p~P@q~r~2&s~t~u~v~w~t$G-y$j x~y~z~R&# A~B~C~D~E~F~G~H~I~J~K~L~M~N~O~P~Q~R~F;W>S~T~U~",
+"p$V~W~v!X~E&Y~Z~`~ {.{+{@{#{${%{&{*{={-{;{P)>{,{S&'{N%){!{~{{{]{p-^{/{({_{Z%:{<{.,[{}{|{1{2{3{~;4{5{6{",
+"# Z-b>c;{ o$7{8{9{0{a{b{o$c{= d{e{O)f{$#g{h{G#i{j{k{l{m{n{o{P$: j ~  @Y)# p{= / ^$q{r{s{t{P$u{w+v{w{. ",
+": x{0 1 1 -!, y{h=1>&,z{{ ~ A{1 B{C{D{E{F{G{H{! I{J{K{L{M{N{G%-*O{- P{Q{- j - x~|#R{S{T{[ W+5 { U{V{W{",
+"h+u;n=h+{ n@{ X{Y{Z{`{ ]{ N#{ -@.]+]@]#]$]%]&]*]=]-];]>],]'])]$ h#m=!]~]5%[ ~ _+- {]]]^]b=# | [$/](]>#",
+"$ _]n=$ { ( { :]<][]}]|]d%( e*( 1]2]3]4]5]6]7]8]9]0]a]b]c]d]e]f]g]h]i]j][ &%~ j.P#k]l]b=5%[ m]n]o]p]q]",
+"h+u;r]$ { n@{ s]t]u]v]w]( n@{ x]y]z]A]B]C]D]E]F]u*>-G]H]I]Y J]K]W*L]M]N]d%[$p@{ f*O]P]n@$ Q]j R]S]}%T]",
+"E.U]V]$ V&[${ W]X]Y]Z]`]( ( { (  ^T={ I%[ .^- ( U&- $ V++^@^_;{ [ #^$^%^{ ( # d%| &^~ &%, 5 *^=^-^;^>^",
+"$ u;,^$ { -@{ '^)^!^~^{^:&[ ;=U&]^, 1 y*^^{ # ;@( -*- /^(^_^: :^{ o@<^t.[^N#_&{ >$}^j [ |^1^2^3^4^5^`#",
+"$ U]A)$ { -@{ s].]6^%^7^~ @+{ { 8^7./*( U&9^0^a^5 ^^K][ b^c^d^{ O%~ &+e^j ( f^{ g^j h^i^[ j^k^l^m^n^o^",
+"h+p^q^$ U&n@U&X{r^s^t^#]~ [ { V&u^o$/*~ J;v^w^x^{ O%_&V,y^z^{ ~ U&E.A^B^!,d%$ { ~ C^- 1 [ D^E^F^G^H^f=",
+"$ I^J^$ { ( { K^L^M^N^O^~  #V&{ 4]_;1 U&$ P^Q^R^u*V&= , S^T^-@# n@, U^V^y*{ h+{ 5%$ e*j.J;d!W^X^Y^Z^`^",
+"d% /./b #=1 ~ +/@/#/$/%/&/p$5 */=/S=- ~ @+T,Y{-/# j O%~ C~;/n@5 j V,>/,/j ~,o@j B#'/: i.)/a&!/~/{/]/, ",
+"| ^///(/{ _/( :/</[/}/|/1/2/1 - 3/, ~ /*{ 4/x.5/# j j 5%O.6/~ 1 { $ 7/8/{ { $ { 9/0/+&+&a/b/c/d/e/f/, ",
+"g/^/h/$ Q]5 d%C>i/j/k/l/a;m/~ c;n/~&-@| | o/p/q/E j.{ <&r/s/# n@[$_&t/u/K]&%, ;=v/w/x/#+j y/{ z/A/B/h+",
+"1 C/D/, E/j w=&%F/G/H/E.K]c%# o;I/E.&%j ,=r]J/K/~ j { ~ L/M/, $ ~ u*N/O/{ E.- {*P/Q/R/S/~ T/1 |#U/V/W/",
+";=X/Y/Z/j 5%- { `/4  (2 1 U&0*.(u/, # [ 5%+(@(#([ j ( [ $(%(# # $ o@&(*({ ]*= { =(-(;(>($ ,(~ j '(z{%*",
+"~ )(!(~([ ~&= { {([$~ ( c*- ](^(/(h+_&V,$ ((_(:(R&U&-@c*<([(x]~ o@( C=}(2/J;t*{ |(1(2(3(4(# |## 5(6(7(",
+"@+8(9(0(a({ m,j { [ b(~ o@c(d(e(Q,j [ @+{ f(g(t%~ { [ /*h(i(=*{ [ j j(k(1 $ - | l(m(n(o(E.E.p(q([ r(s(",
+"{ a/P$t(E 1 ( 1 u(( [ v(j e*E.w(h#E/j { x(, -*o$$ c*[ y*b g%5 =*[ y(, z(5 5%, 1 p$<*A(~ B(C()/%*p$= T]"};
diff --git a/gui/linux-gtk/src/routes.c b/gui/linux-gtk/src/routes.c
new file mode 100644 (file)
index 0000000..91f838f
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI 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.
+ *
+ * uolsrGUI 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+
+/*
+ * Route entries are registered
+ * separatly from the node set
+ *
+ * This set is not used for anything in particular
+ * intended for future use
+ */
+
+#include "routes.h"
+
+
+int
+init_route_entries()
+{
+  route_count = 0;
+
+  route_set.next = &route_set;
+  route_set.prev = &route_set;
+
+  return 1;
+}
+
+
+int
+add_route_entry(struct route_entry *entry)
+{
+  struct route_entry *new_entry;
+
+  if((new_entry = malloc(sizeof(struct route_entry))) == 0)
+    {
+      fprintf(stderr, "OUT OF MEMORY!\n");
+      exit(1);
+    }
+
+  /* queue */
+  new_entry->next = route_set.next;
+  route_set.next->prev = new_entry;
+  route_set.next = new_entry;
+  new_entry->prev = &route_set;
+
+  route_count++;
+
+  return 1;
+
+}
+
+int
+del_route_entry(struct route_entry *entry)
+{
+
+  route_count--;
+
+  return 1;
+}
diff --git a/gui/linux-gtk/src/routes.h b/gui/linux-gtk/src/routes.h
new file mode 100644 (file)
index 0000000..e504592
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI 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.
+ *
+ * uolsrGUI 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+
+/*
+ * Route entries are registered
+ * separatly from the node set
+ *
+ * This set is not used for anything in particular
+ * intended for future use
+ */
+
+#ifndef _OLSRD_FRONTEND_ROUTE
+#define _OLSRD_FRONTEND_ROUTE
+
+#include "common.h"
+
+#define MAX_IF_NAMESIZ  10
+
+struct route_entry
+{
+  union olsr_ip_addr gw;
+  union olsr_ip_addr dst;
+  olsr_u16_t         hopcnt;
+  char               if_name[MAX_IF_NAMESIZ];
+  struct route_entry *next;
+  struct route_entry *prev;
+};
+
+/* List */
+struct route_entry route_set;
+
+/* Counter */
+olsr_u32_t route_count;
+
+/* Functions */
+
+int
+init_route_entries();
+
+int
+add_route_entry(struct route_entry *);
+
+int
+del_route_entry(struct route_entry *);
+
+
+#endif