Date: Fri, 16 Mar 2001 11:19:00 +0200 (EET) From: eugene@brain-fag.org To: FreeBSD-gnats-submit@freebsd.org Subject: bin/25847: inability of nos-tun to work correctly in multihomed environment Message-ID: <200103160919.LAA51340@kabir.zssm.zp.ua>
next in thread | raw e-mail | index | archive | help
>Number: 25847
>Category: bin
>Synopsis: inability of nos-tun to work correctly in multihomed environment
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Fri Mar 16 01:20:00 PST 2001
>Closed-Date:
>Last-Modified:
>Originator: Eugene Polovnikov
>Release: FreeBSD 5.0-CURRENT i386
>Organization:
ZSS JSC
>Environment:
All versions of FreeBSD which include nos-tun.
>Description:
Current version of nos-tun doesn't allow for setting a source address of
outgoing IP packets that prevents it to work on some situation.
>How-To-Repeat:
>Fix:
--- nos-tun.c.orig Fri Mar 16 11:01:38 2001
+++ nos-tun.c Fri Mar 16 11:17:35 2001
@@ -239,11 +239,13 @@
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 @@
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 @@
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 @@
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 @@
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);
}
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200103160919.LAA51340>
