summaryrefslogtreecommitdiffstats
path: root/ax25rtd/listener.c
diff options
context:
space:
mode:
authorThomas Osterried <thomas@osterried.de>2006-10-05 11:50:39 +0000
committerThomas Osterried <thomas@osterried.de>2006-10-05 11:50:39 +0000
commitbee3ed95da5f252caae391d51d3c4a0f210e14eb (patch)
tree10543b624b5359c414c22e8722d754ddd9eb6aef /ax25rtd/listener.c
parent981af1193d960e8234e7b0c8fe048aca1ebdb6e9 (diff)
- documentation (ax25rtd.8, ax25rtd.conf.5, ax25rtctl.8)
- new feature: advanced routing option
Diffstat (limited to 'ax25rtd/listener.c')
-rw-r--r--ax25rtd/listener.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/ax25rtd/listener.c b/ax25rtd/listener.c
index afaa19c..44a0601 100644
--- a/ax25rtd/listener.c
+++ b/ax25rtd/listener.c
@@ -1,4 +1,4 @@
-/* $Id: listener.c,v 1.4 2005/10/27 13:25:28 dl9sau Exp $
+/* $Id: listener.c,v 1.5 2006/10/05 11:50:39 dl9sau Exp $
*
* Copyright (c) 1996 Jörg Reuter (jreuter@poboxes.com)
*
@@ -48,6 +48,8 @@
#include "../pathnames.h"
#include "ax25rtd.h"
+#include <stdlib.h>
+
/* FIXME */
static unsigned long get_from_arp(unsigned char *data, int size)
@@ -167,6 +169,30 @@ int set_arp(config * config, long ip, ax25_address * call)
return 0;
}
+/* dl9sau: use iproute2 for advanced routing.
+ * Anyone likes to implement this directly, without system()?
+ */
+#define RT_DEL 0
+#define RT_ADD 1
+int iproute2(long ip, char *dev, int what)
+{
+ char buffer[256];
+ char ipa[32];
+ int ret;
+
+ sprintf(ipa, "%d.%d.%d.%d",
+ (int) (ip & 0x000000FF),
+ (int) ((ip & 0x0000FF00) >> 8),
+ (int) ((ip & 0x00FF0000) >> 16),
+ (int) ((ip & 0xFF000000) >> 24));
+
+ /* ip rule add table 44 */
+ sprintf(buffer, "/sbin/ip route %s %s dev %s table %s proto ax25rtd", (what ? "add" : "del"), ipa, dev, iproute2_table);
+
+ ret = system(buffer);
+ return ret;
+}
+
int set_route(config * config, long ip)
{
struct rtentry rt;
@@ -208,6 +234,9 @@ int set_route(config * config, long ip)
if (!config->ip_add_route)
return 0;
+ if (iproute2_table && *iproute2_table)
+ return iproute2(ip, config->dev, RT_ADD);
+
fds = socket(AF_INET, SOCK_DGRAM, 0);
memset((char *) &rt, 0, sizeof(rt));
@@ -236,6 +265,7 @@ int set_route(config * config, long ip)
return 1;
}
close(fds);
+
return 0;
}
@@ -250,6 +280,9 @@ int del_kernel_ip_route(char *dev, long ip)
if (config == NULL || !config->ip_add_route)
return 0;
+ if (iproute2_table && *iproute2_table)
+ return iproute2(ip, dev, RT_DEL);
+
fds = socket(AF_INET, SOCK_DGRAM, 0);
memset((char *) &rt, 0, sizeof(struct rtentry));
@@ -268,6 +301,7 @@ int del_kernel_ip_route(char *dev, long ip)
return 1;
}
close(fds);
+
return 0;
}