Skip site navigation (1)Skip section navigation (2)
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>