diff options
author | phk <phk@FreeBSD.org> | 2001-03-28 17:30:26 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2001-03-28 17:30:26 +0000 |
commit | a9b78ad42bc85ce744ced384a31f437409b86363 (patch) | |
tree | b0a11ebd77a167c95f3adb85c690c54d2d8bdf50 /sbin | |
parent | 1012e7d28ca598029be825c2c47478d34df61ca5 (diff) | |
download | FreeBSD-src-a9b78ad42bc85ce744ced384a31f437409b86363.zip FreeBSD-src-a9b78ad42bc85ce744ced384a31f437409b86363.tar.gz |
Allow specification of which source address to use for encapsulation.
PR: 25847
Submitted by: Eugene Polovnikov <eugene@brain-fag.org>
Diffstat (limited to 'sbin')
-rw-r--r-- | sbin/nos-tun/nos-tun.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/sbin/nos-tun/nos-tun.c b/sbin/nos-tun/nos-tun.c index ceed05f..95abd5f 100644 --- a/sbin/nos-tun/nos-tun.c +++ b/sbin/nos-tun/nos-tun.c @@ -239,11 +239,13 @@ int main (int argc, char **argv) char *point_to = NULL; char *to_point = NULL; char *target; + char *source = NULL; char *protocol = NULL; int protnum; struct sockaddr t_laddr; /* Source address of tunnel */ struct sockaddr whereto; /* Destination of tunnel */ + struct sockaddr wherefrom; /* Source of tunnel */ struct sockaddr_in *to; char buf[0x2000]; /* Packets buffer */ @@ -272,7 +274,7 @@ int main (int argc, char **argv) argc -= optind; argv += optind; - if (argc != 1 || (devname == NULL) || + if ((argc != 1 && argc != 2) || (devname == NULL) || (point_to == NULL) || (to_point == NULL)) { usage(); } @@ -282,7 +284,11 @@ int main (int argc, char **argv) else protnum = atoi(protocol); - target = *argv; + if (argc == 1) { + target = *argv; + } else { + source = *argv++; target = *argv; + } /* Establish logging through 'syslog' */ openlog("nos-tun", LOG_PID, LOG_DAEMON); @@ -306,6 +312,15 @@ int main (int argc, char **argv) Finish(5); } + if (source) { + if (Set_address(source, (struct sockaddr_in *)&wherefrom)) + Finish(9); + if (bind(net, &wherefrom, sizeof(wherefrom)) < 0) { + syslog(LOG_ERR, "can't bind source address - %m"); + Finish(10); + } + } + if (connect(net,&whereto,sizeof(struct sockaddr_in)) < 0 ) { syslog(LOG_ERR,"can't connect to target - %m"); close(net); @@ -365,7 +380,7 @@ static void usage() { fprintf(stderr, -"usage: nos-tun -t <tun_name> -s <source_addr> -d <dest_addr> -p <protocol_number> <target_addr>\n"); +"usage: nos-tun -t <tun_name> -s <source_addr> -d <dest_addr> -p <protocol_number> [<source_addr>] <target_addr>\n"); exit(1); } |