DIP patch (dynamic IP address trapping, route 'default' option)

DIP patch (dynamic IP address trapping, route 'default' option)

Post by Uppi » Fri, 02 Jul 1993 23:29:35



[Moderator's note: This is a patch against the DIP sources found in
NET-2 (net-010.tar.z). The NET-2-FAQ can provide details. --mdw]

For those of us that have our SLIP IP addresses assigned dynamically,
here is a patch for dip that will trap the address when the remote
host 'displays' it.  (This is an option--those that don't want this
need not enable it.)

The meat of this patch was written by Paul Mossip (mos...@vizlab.rutgers.edu)
Someone mentioned the existance of his patch, so I emailed him requesting
a copy and he anonymously ftp'd it into my linux box.  

I have been using it heavily for several days now, and it works
beautifully.  Bravo to the author!  (And many thanks)

I extended his patch a slight bit; whenever I initiated a slip connection,
dip executed a 'route' command that assigned the remote machine's IP
address as both my Destination net/address and my Gateway address.
My connection would not function unless I deleted that route and created
a new one specifying my Destination net/address as 'default'.
I have added 'default' to the set of commands that dip accepts--
if you use it, your Destination net/address will be set to 'default',
if you don't use it, dip sets up the route as it did before.  (This
command, like the ones that Paul added, can either be entered in
dip's command mode, or read in from a script file.)

The abilites that Paul's patch added to dip allowed me to totally
automate my SLIP connections, with the exception of the routing change.
This patch has taken the last step; everything is done from a script
file and I haven't had a problem with the address assignment trapping once.

Those that have to deal with dynamically assigned IP address will
find this very useful.

Thanks once again to Paul Mossip--he put all of the real work into
this patch.

++++++++++ CUT HERE ++++++++++
diff -c ifconfig_old/dip/attach.c ifconfig/dip/attach.c
*** ifconfig_old/dip/attach.c   Tue Jun  8 08:58:49 1993
--- ifconfig/dip/attach.c       Wed Jun 30 02:36:40 1993
***************
*** 30,36 ****
  #endif
    if (system(buff) != 0) return(-1);

!   sprintf(buff, "%s add %s", _PATH_BIN_ROUTE, inet_ntoa(dip->rmt_ip));
    sprintf(&buff[strlen(buff)], " gw %s", inet_ntoa(dip->rmt_ip));
  #ifdef DEBUG
    syslog(LOG_ERR, ">>> ATTACH \"%s\"\n", buff);
--- 30,41 ----
  #endif
    if (system(buff) != 0) return(-1);

!   if (route_default == 1) {
!       sprintf(buff, "%s add default", _PATH_BIN_ROUTE);
!   } else {
!       sprintf(buff, "%s add %s", _PATH_BIN_ROUTE, inet_ntoa(dip->rmt_ip));
!   }
!
    sprintf(&buff[strlen(buff)], " gw %s", inet_ntoa(dip->rmt_ip));
  #ifdef DEBUG
    syslog(LOG_ERR, ">>> ATTACH \"%s\"\n", buff);
diff -c ifconfig_old/dip/command.c ifconfig/dip/command.c
*** ifconfig_old/dip/command.c  Mon May 31 09:54:06 1993
--- ifconfig/dip/command.c      Wed Jun 30 04:10:32 1993
***************
*** 15,29 ****

  static _PROTOTYPE( int        do_dial, (int, char **)                         );
  static _PROTOTYPE( int        do_goto, (int, char **)                         );
  static _PROTOTYPE( int        do_help, (int, char **)                         );
  static _PROTOTYPE( int        do_if, (int, char **)                           );
- static _PROTOTYPE( int        do_local, (int, char **)                        );
  static _PROTOTYPE( int        do_mode, (int, char **)                         );
- static _PROTOTYPE( int        do_mtu, (int, char **)                          );
  static _PROTOTYPE( int        do_port, (int, char **)                         );
  static _PROTOTYPE( int        do_print, (int, char **)                        );
- static _PROTOTYPE( int        do_remote, (int, char **)                       );
  static _PROTOTYPE( int        do_reset, (int, char **)                        );
  static _PROTOTYPE( int        do_send, (int, char **)                         );
  static _PROTOTYPE( int        do_sleep, (int, char **)                        );
--- 15,28 ----

  static _PROTOTYPE( int        do_dial, (int, char **)                         );
+ static _PROTOTYPE( int        do_default, (int, char**)                       );
+ static _PROTOTYPE( int        do_get, (int, char **)                          );
  static _PROTOTYPE( int        do_goto, (int, char **)                         );
  static _PROTOTYPE( int        do_help, (int, char **)                         );
  static _PROTOTYPE( int        do_if, (int, char **)                           );
  static _PROTOTYPE( int        do_mode, (int, char **)                         );
  static _PROTOTYPE( int        do_port, (int, char **)                         );
  static _PROTOTYPE( int        do_print, (int, char **)                        );
  static _PROTOTYPE( int        do_reset, (int, char **)                        );
  static _PROTOTYPE( int        do_send, (int, char **)                         );
  static _PROTOTYPE( int        do_sleep, (int, char **)                        );
***************
*** 36,51 ****
    char        *name;
    int (*func)(int, char **);
  } commands[] = {
    { "dial",         do_dial         },
    { "goto",         do_goto         },
    { "help",         do_help         },
    { "if",           do_if           },
-   { "local",                do_local        },
    { "mode",         do_mode         },
-   { "mtu",          do_mtu          },
    { "print",                do_print        },
    { "port",         do_port         },
-   { "remote",               do_remote       },
    { "reset",                do_reset        },
    { "send",         do_send         },
    { "sleep",                do_sleep        },
--- 35,49 ----
    char        *name;
    int (*func)(int, char **);
  } commands[] = {
+   { "default",              do_default      },
    { "dial",         do_dial         },
+   { "get",          do_get          },
    { "goto",         do_goto         },
    { "help",         do_help         },
    { "if",           do_if           },
    { "mode",         do_mode         },
    { "print",                do_print        },
    { "port",         do_port         },
    { "reset",                do_reset        },
    { "send",         do_send         },
    { "sleep",                do_sleep        },
***************
*** 523,573 ****
   *                                                                    *
   ************************************************************************/

! /* Set the name of the local side. */
! static int do_local(argc, argv)
! int argc;
! char *argv[];
! {
!   struct hostent *hp;
!
!   if (argc != 2) {
!       fprintf(stderr, "Usage: local name\n");
!       return(-1);
!   }
!   strncpy(mydip.local, argv[1], 128);
!   if ((hp = gethostbyname(mydip.local)) == (struct hostent *)NULL) {
!       herror(mydip.local);
!       strcpy(mydip.local, "");
!       return(-1);
!   }
!   strncpy(mydip.local, hp->h_name, 128);
!   memcpy((char *) &mydip.loc_ip, (char *) hp->h_addr_list[0], hp->h_length);
!   return(0);
! }
!
!
! /* Set the name of the remote side. */
! static int do_remote(argc, argv)
! int argc;
! char *argv[];
! {
!   struct hostent *hp;
!
!   if (argc != 2) {
!       fprintf(stderr, "Usage: remote name\n");
!       return(-1);
!   }
!   strncpy(mydip.remote, argv[1], 128);
!   if ((hp = gethostbyname(mydip.remote)) == (struct hostent *)NULL) {
!       herror(mydip.remote);
!       strcpy(mydip.remote, "");
!       return(-1);
!   }
!   strncpy(mydip.remote, hp->h_name, 128);
!   memcpy((char *) &mydip.rmt_ip, (char *) hp->h_addr_list[0], hp->h_length);
!   return(0);
! }

  /* Enter a specific protocol. */
--- 521,655 ----
   *                                                                    *
   ************************************************************************/

+ /* Get or ask for the value of a variable */
+ /* get local IP#, Remote IP# and MTU */

! #define VAR_IP 1
! #define VAR_NUM 2
! #define VAR_STR 3
!
! static int do_get(argc, argv)
! int argc;
! char *argv[];
! {
!    char str[128]="";
!    int var=0;
!    void *v1=NULL,*v2=NULL;
!    _PROTOTYPE( void (*oldsig), (int) );
!    
!    if (argc <= 2 || argc > 4 || argv[1][0]!='$') {
!       fprintf(stderr, "Usage: get $variable [value|ask|remote [timeout_value]]\n");
!       return(-1);
!    }
!    
!    if (!strcmp(argv[1], "$locip")||!strcmp(argv[1], "$local"))
!        { v1= (void *) mydip.local; v2= (void *) &mydip.loc_ip; var=VAR_IP;}
!    else if (!strcmp(argv[1], "$rmtip")||!strcmp(argv[1], "$remote"))
!        { v1= (void *) mydip.remote; v2= (void *) &mydip.rmt_ip; var=VAR_IP;}
!    else if (!strcmp(argv[1], "$mtu"))
!        { v1= (void *) &mydip.mtu; var=VAR_NUM;}
!    else {
!      fprintf(stderr, "Variables must be :$locip|$rmtip|$local|$remote|$mtu\n");
!      return (-1);
!    }
!  
!    if (argc > 2) {
!      if (!strcmp(argv[2],"ask")) {
!        /* "ask" ask the stdinput for the value of the variable and
!           put it in str */
!        register char *sp;
!        fprintf(stderr, "Enter the value for %s: ",argv[1]);
!        if (fgets(str, 128, stdin) == (char *)NULL) return (1);
!        if ((sp = strchr(str, '\n')) != (char *)NULL) *sp = '\0';
!      }
!      else if (!strcmp(argv[2],"remote")) {
!        /* Get the variable string from the "remote" line */
!        register char c,*p;
!        int howlong=0,state=0;
!        if (argc == 4) howlong = atoi(argv[3]);
!
!        oldsig = signal(SIGALRM, TimeOut);
!        (void) alarm(howlong);
!
!        p = str;
!        timeout = state = 0;
!        if (var == VAR_IP ||var == VAR_NUM) state = 1;
!        while(!timeout && (state >= 0)) {
!        c = (char) tty_getc();
!        c &= 0177;
!        if (timeout == 1) break;
!        switch (state) {
!        case 0: /* start by throwing away "white space" */
!          if (!strchr(" \n\t",c)) break;
!          if (var == VAR_STR) { *(p++) = c; state = 10; break;}
!          state=1;
!        case 1:
!          if ( c >= '0' && c <='9' ) {
!            *(p++)=c;
!            if (var == VAR_IP) { state=2; break;}
!            else state=5;
!            break;
!          }
!          break;
!        case 2: case 3: case 4:
!          if ((c >= '0' && c <='9')|| c == '.') {
!            *(p++) = c;
!            if (c == '.') state++;
!            break;
!          }
!          p = str;
!          state = 0;
!          break;
!        case 5:
!          if (c >= '0' && c <='9') {
!            *(p++) = c;
!            break;
!          }
!          state=-1;
!          break;
!        case 10:
!          if (strchr(" \n\t",c)) state =-1;
!          else *(p++) = c;
!          break;
!        default:
!          break;
!        }
!        }
!        *p='\0';
!        (void) alarm(0);
!        (void) signal(SIGALRM, oldsig);
!        if (timeout == 1) return (1);
!      }
!      else   /* the third argv is the value for the variable */
!        strncpy(str,argv[2],128);
!    }
!    if (opt_v == 1) printf("About to set variable %s to %s\n",argv[1],str);
!
!    if (*str){
!      switch (var){
!      case VAR_IP:
!        {
!        struct hostent *hp;
!        if ((hp = gethostbyname(str)) == (struct hostent *)NULL){
!          herror (str);
!          return (-1);
!        }
!        strncpy((char *)v1,hp->h_name,128);
!        memcpy((char *)v2,(char *) hp->h_addr_list[0],hp->h_length);
!        }
!        break;
!      case VAR_NUM:
!        *(int *)v1= atoi(str);
!        break;
!      case VAR_STR:
!        strcpy((char *)v1,str);
!        break;
!      default:
!        break;
!      }
!    }
!        return(0);
!  }

  /* Enter a specific protocol. */
***************
*** 597,614 ****
  }

! /* Set the correct MTU to use. */
! static int do_mtu(argc, argv)
  int argc;
  char *argv[];
  {
!   if (argc != 2) {
!       fprintf(stderr, "Usage: mtu number\n");
        return(-1);
    }
!   mydip.mtu = atoi(argv[1]);
!   if (opt_v == 1) printf("MTU set to %d\n", mydip.mtu);

    return(0);
  }

--- 679,697 ----
  }

! /* Set routing as default */
! static int do_default(argc, argv)
  int argc;
  char *argv[];
  {
!   if (argc != 1) {
!       fprintf(stderr, "Usage: default\n");
        return(-1);
    }
!
!   if (opt_v == 1) printf("Destination net/address set to 'default'\n");

+   route_default = 1;
    return(0);
  }

diff -c ifconfig_old/dip/dip.8 ifconfig/dip/dip.8
*** ifconfig_old/dip/dip.8      Tue Jun  8 08:57:41 1993
--- ifconfig/dip/dip.8  Wed Jun 30 04:15:37 1993
***************
*** 56,65 ****
  .nf
  DIP knows about the following commands:

!       dial     goto     help     if       local    
!       mode     mtu      print    port     remote  
!       reset    send     sleep    speed    term    
!       wait    

  DIP> _
  .sp 1
--- 56,64 ----
  .nf
  DIP knows about the following commands:

!       default  dial     get      goto     help          
!       if       mode     print    port     reset
!       send     sleep    speed    term     wait

  DIP> _
  .sp 1
***************
*** 211,221 ****
  main:
    # First of all, set up our name for this connection.
    # I am called "uwalt.hacktic.nl"  (== 193.78.33.238)
!   local uwalt.hacktic.nl

    # Next, set up the other side's name and address.
    # My dialin machine is called 'xs4all.hacktic.nl' (== 193.78.33.42)
!   remote xs4all.hacktic.nl

    # Set the desired serial port and speed.
    port cua0
--- 210,220 ----
  main:
    # First of all, set up our name for this connection.
    # I am called "uwalt.hacktic.nl"  (== 193.78.33.238)
!   get $local uwalt.hacktic.nl

    # Next, set up the other side's name and address.
    # My dialin machine is called 'xs4all.hacktic.nl' (== 193.78.33.42)
!   get $remote xs4all.hacktic.nl

    # Set the desired serial port and speed.
    port cua0
***************
*** 254,264 ****
    wait SOME-STRING 15

    # Set up the SLIP operating parameters.
!   mtu 1500

    # Say hello and fire up!
  done:
!   print CONNECTED to $host with address $ip
    mode SLIP
    goto exit
  error:
--- 253,268 ----
    wait SOME-STRING 15

    # Set up the SLIP operating parameters.
!   get $mtu 1500

+   # Set Destination net/address as type 'default' (vice an address).
+   # This is used by the 'route' command to set the kernel routing table.
+   # Some machines seem to require this be done for SLIP to work properly.
+   default
+
    # Say hello and fire up!
  done:
!   print CONNECTED to $remote with address $locip
    mode SLIP
    goto exit
  error:
diff -c ifconfig_old/dip/dip.c ifconfig/dip/dip.c
*** ifconfig_old/dip/dip.c      Tue Jun  8 08:52:54 1993
--- ifconfig/dip/dip.c  Wed Jun 30 02:50:32 1993
***************
*** 23,32 ****
  #include "dip.h"

! #define VERSION       "3.2.2"

! char *Version = "@(#) dip 3.2.2 (06/08/93)";

  struct protosw protosw[] = {
--- 23,32 ----
  #include "dip.h"

! #define VERSION       "3.2.2a"

! char *Version = "@(#) dip 3.2.2a (06/08/93)";

  struct protosw protosw[] = {
***************
*** 113,118 ****
--- 113,119 ----
    opt_t = 0;
    opt_v = 0;
    opt_i = 0;
+   route_default = 0;

    /* Scan command line for any arguments. */
    opterr = 0;
diff -c ifconfig_old/dip/dip.h ifconfig/dip/dip.h
*** ifconfig_old/dip/dip.h      Mon May 31 10:33:43 1993
--- ifconfig/dip/dip.h  Wed Jun 30 01:12:02 1993
***************
*** 112,117 ****
--- 112,118 ----
  #ifndef GLOBAL
  #   define GLOBAL     extern
  #endif
+ GLOBAL int    route_default;          /* flag: set route as default   */
  GLOBAL int    opt_i;                  /* flag: incoming connection    */
  GLOBAL int    opt_t;                  /* flag: dump incoming IP packs */
  GLOBAL int    opt_v;                  /* flag: be verbose!            */
diff -c ifconfig_old/dip/sample.dip ifconfig/dip/sample.dip
*** ifconfig_old/dip/sample.dip Fri May 28 13:03:05 1993
--- ifconfig/dip/sample.dip     Wed Jun 30 04:20:02 1993
***************
*** 5,15 ****
  main:
    # First of all, set up our name for this connection.
    # I am called "uwalt.hacktic.nl"  (== 193.78.33.238)
!   local uwalt.hacktic.nl

    # Next, set up the other side's name and address.
    # My dialin machine is called 'xs4all.hacktic.nl' (== 193.78.33.42)
!   remote xs4all.hacktic.nl

    # Set the desired serial port and speed.
    port cua0
--- 5,15 ----
  main:
    # First of all, set up our name for this connection.
    # I am called "uwalt.hacktic.nl"  (== 193.78.33.238)
!   get $local uwalt.hacktic.nl

    # Next, set up the other side's name and address.
    # My dialin machine is called 'xs4all.hacktic.nl' (== 193.78.33.42)
!   get $remote xs4all.hacktic.nl

    # Set the desired serial port and speed.
    port cua0
***************
*** 50,58 ****
    # Set up the SLIP operating parameters.
    mtu 1500

    # Say hello and fire up!
  done:
!   print CONNECTED to $host with address $ip
    mode SLIP
    goto exit
  error:
--- 50,63 ----
    # Set up the SLIP operating parameters.
    mtu 1500

+   # Set Destination net/address as type 'default' (vice an address).
+   # This is used by the 'route' command to set the kernel routing table.
+   # Some machines seem to require this be done for SLIP to work properly.
+   default
+
    # Say hello and fire up!
  done:
!   print CONNECTED to $remote with address $locip
    mode SLIP
    goto exit
  error:
diff -c ifconfig_old/dip/serial.c ifconfig/dip/serial.c
*** ifconfig_old/dip/serial.c   Tue May 25 12:39:39 1993
--- ifconfig/dip/serial.c       Wed Jun 30 00:42:45 1993
***************
*** 243,249 ****
        return(-errno);
    }
    if ((baud = set_baud(speed)) < 0) return(baud);
!   tty.c_cflag |= ((tty.c_cflag & ~CBAUD) | baud);
    if (ioctl(tty_fd, TCSETS, &tty) < 0) {
        fprintf(stderr, "dip: cannot ioctl(%d, SETS): %d\n", tty_fd, errno);
        return(-errno);
--- 243,249 ----
        return(-errno);
    }
    if ((baud = set_baud(speed)) < 0) return(baud);
!   tty.c_cflag = ((tty.c_cflag & ~CBAUD) | baud);
    if (ioctl(tty_fd, TCSETS, &tty) < 0) {
        fprintf(stderr, "dip: cannot ioctl(%d, SETS): %d\n", tty_fd, errno);
        return(-errno);
++++++++++ CUT HERE ++++++++++
--
Jeff Uphoff -- "Uppie"     |  "The secret to good teaching is sincerity.  As
uph...@astro.psu.edu       |  soon as you learn to fake that, you've got it
juph...@nrao.edu           |  made."

--
Send submissions for comp.os.linux.announce to: linux-annou...@tc.cornell.edu

 
 
 

1. Route by IP address over tun0 - 'ip rule add from a.b.c.d'

Would anyone be kind enough to give me some pointers to route packets
from a specific ip on my subnet via the tun0 OpenVPN interface, and
all other hosts out the default route of the main routing table
(192.168.1.1 on br0)?

i.e. 192.168.1.2-9 -> via br0, and 192.168.1.200 -> via tun0

I have created the tables:

mkdir /etc/iproute2
echo 201 table1 >> /etc/iproute2/rt_tables
ip rule add from 192.168.1.200/32 table table1

But i am really stuck from here. I tried adding default routes in the
table1 but all traffic stops at this point (i am pinging from the host
192.168.1.200 out onto the net, it works as soon as this command below
is entered it times out):

ip route add 10.19.0.5 dev tun0 scope link src 10.19.0.6 table table1
(not sure if this is needed - either way doesnt work with or without)
ip route add default via 10.19.0.5 dev tun0 table table1

I did try: ip route add default dev tun0 table table1. and again that
fails to work. I appreciate this isnt a guessing game hence moving to
post here in hope of some expert advice.

Routing table for the main table (table 1 contains the entries from
above commands):


default via 10.19.0.5 dev tun0


10.20.30.40 via 192.168.1.1 dev br0
10.19.0.1 via 10.19.0.5 dev tun0
10.19.0.5 dev tun0  proto kernel  scope link  src 10.19.0.6
192.168.1.0/24 dev br0  proto kernel  scope link  src 192.168.1.4
default via 192.168.1.1 dev br0

There is a point to point link to the OpenVPN server on 10.19.0.5 with
a local address of 10.19.0.6, but im not sure if this needs to be
added in the table1? I did try by adding ip route add 10.19.0.5 dev
tun0 scope link src 10.19.0.6 table table1, but again still the same
issue.

With OpenVPN setup to push the redirect-gateway option, all works well
with the routing table and the box acts as a router sending everything
through it (table shown below - this works fine apart from everyone is
routed through it). As mentioned, I would like the tables default
route below to only apply to the host 192.168.1.200. I am posting the
table below as this does work for all hosts:


10.20.30.40 via 192.168.1.1 dev br0
10.19.0.1 via 10.19.0.5 dev tun0
10.19.0.5 dev tun0  proto kernel  scope link  src 10.19.0.6
192.168.1.0/24 dev br0  proto kernel  scope link  src 192.168.1.4
default via 10.19.0.5 dev tun0

Many thanks in advance

2. AD: TCAT C/C++ for Windows 95, NT and 3.1x Available by FTP

3. 'iijppp -auto' and Dynamic IP Address Allocation

4. Need Advice about upgrading my redhat distribution.

5. Dynamic IP address and 'r' commands?

6. Samba question

7. 'Static Hostnames' while having a dynamic IP address

8. xdm and Num Lock

9. ksh: trap '...' exit int ... or just trap '...' exit?

10. Apache patch to allow 'Options None' when Options override disallowed

11. DIP:can't load dynamic linker '/lib/ld.so'

12. routed is trashing my 'default' route

13. README's on dip and dynamic IP needed...