projects
/
project
/
relayd.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
implement local ip access through policy routing
[project/relayd.git]
/
main.c
diff --git
a/main.c
b/main.c
index 407c8c2fb29b8a7f6956e37dd2230d8778840edf..8fbbed2e44804e723cc31277b9a689b97651725d 100644
(file)
--- a/
main.c
+++ b/
main.c
@@
-40,6
+40,9
@@
static int inet_sock;
static int forward_bcast;
static int forward_dhcp;
static int forward_bcast;
static int forward_dhcp;
+uint8_t local_addr[4];
+int local_route_table;
+
struct relayd_pending_route {
struct relayd_route rt;
struct uloop_timeout timeout;
struct relayd_pending_route {
struct relayd_route rt;
struct uloop_timeout timeout;
@@
-641,6
+644,7
@@
static int usage(const char *progname)
" -T <table> Set routing table number for automatically added routes\n"
" -B Enable broadcast forwarding\n"
" -D Enable DHCP forwarding\n"
" -T <table> Set routing table number for automatically added routes\n"
" -B Enable broadcast forwarding\n"
" -D Enable DHCP forwarding\n"
+ " -L <ipaddr> Enable local access using <ipaddr> as source address\n"
"\n",
progname);
return -1;
"\n",
progname);
return -1;
@@
-650,6
+654,7
@@
int main(int argc, char **argv)
{
struct relayd_interface *rif = NULL;
struct in_addr addr, addr2;
{
struct relayd_interface *rif = NULL;
struct in_addr addr, addr2;
+ bool local_addr_valid = false;
bool managed;
int ifnum = 0;
char *s, *s2;
bool managed;
int ifnum = 0;
char *s, *s2;
@@
-665,9
+670,10
@@
int main(int argc, char **argv)
host_timeout = 60;
forward_bcast = 0;
host_timeout = 60;
forward_bcast = 0;
+ local_route_table = 0;
uloop_init();
uloop_init();
- while ((ch = getopt(argc, argv, "I:i:t:BDdT:G:R:")) != -1) {
+ while ((ch = getopt(argc, argv, "I:i:t:BDdT:G:R:
L:
")) != -1) {
switch(ch) {
case 'I':
managed = true;
switch(ch) {
case 'I':
managed = true;
@@
-706,6
+712,14
@@
int main(int argc, char **argv)
}
relayd_add_pending_route((uint8_t *) &addr.s_addr, (const uint8_t *) "\x00\x00\x00\x00", 0, 0);
break;
}
relayd_add_pending_route((uint8_t *) &addr.s_addr, (const uint8_t *) "\x00\x00\x00\x00", 0, 0);
break;
+ case 'L':
+ if (!inet_aton(optarg, &addr)) {
+ fprintf(stderr, "Address '%s' not found\n", optarg);
+ return 1;
+ }
+ memcpy(&local_addr, &addr.s_addr, sizeof(local_addr));
+ local_addr_valid = true;
+ break;
case 'R':
s = strchr(optarg, ':');
if (!s)
case 'R':
s = strchr(optarg, ':');
if (!s)
@@
-755,6
+769,9
@@
int main(int argc, char **argv)
signal(SIGUSR1, die);
signal(SIGUSR2, die);
signal(SIGUSR1, die);
signal(SIGUSR2, die);
+ if (local_addr_valid)
+ local_route_table = route_table++;
+
if (relayd_rtnl_init() < 0)
return 1;
if (relayd_rtnl_init() < 0)
return 1;