2.9bsd network bug fixes

Greg Satz satz at sri-tsc.UUCP
Sat Jun 30 06:45:15 AEST 1984


Here are some fixes to the network code.  I found a few bugs while
bringing up the 4.2 version of rwho/rwhod.  I modified the loop-back
driver to look more like 4.2.

*** /tmp/,RCSt1017261	Fri Jun 29 13:20:34 1984
--- in.h	Wed Jun 27 23:48:00 1984
***************
*** 54,59
   */
  #define	IPPORT_BIFFUDP		512
  #define	IPPORT_WHOSERVER	513
  #define	IPPORT_ROUTESERVER	520
  #define	IPPORT_SYSLOG		2222
  

--- 54,60 -----
   */
  #define	IPPORT_BIFFUDP		512
  #define	IPPORT_WHOSERVER	513
+ #define	IPPORT_SYSLOG		514
  #define	IPPORT_ROUTESERVER	520
  
  /*
***************
*** 55,61
  #define	IPPORT_BIFFUDP		512
  #define	IPPORT_WHOSERVER	513
  #define	IPPORT_ROUTESERVER	520
- #define	IPPORT_SYSLOG		2222
  
  /*
   * Ports < IPPORT_RESERVED are reserved for

--- 56,61 -----
  #define	IPPORT_WHOSERVER	513
  #define	IPPORT_SYSLOG		514
  #define	IPPORT_ROUTESERVER	520
  
  /*
   * Ports < IPPORT_RESERVED are reserved for
***************
*** 127,133
  		((in).s_addr&IN_CLASSB) == 0 ? (in).s_addr&IN_CLASSB_LNA : \
  			(in).s_addr&IN_CLASSC_LNA)
  
! #define	INADDR_ANY	0x00000000
  
  /*
   * Socket address, internet style.

--- 127,133 -----
  		((in).s_addr&IN_CLASSB) == 0 ? (in).s_addr&IN_CLASSB_LNA : \
  			(in).s_addr&IN_CLASSC_LNA)
  
! #define	INADDR_ANY	0x00000000L
  
  /*
   * Socket address, internet style.

*** /tmp/,RCSt1017296	Fri Jun 29 13:23:25 1984
--- if.c	Wed Jun 27 23:39:51 1984
***************
*** 207,215
  	register struct ifreq *ifr;
  	struct ifreq uifr;		/* user's ifreq structure */
  
- 	if (copyin(data, (caddr_t) &uifr, sizeof(uifr))) {
- 		return(EFAULT);
- 	}
  	switch (cmd) {
  
  	case SIOCGIFCONF:

--- 207,212 -----
  	register struct ifreq *ifr;
  	struct ifreq uifr;		/* user's ifreq structure */
  
  	switch (cmd) {
  
  	case SIOCGIFCONF:
***************
*** 213,219
  	switch (cmd) {
  
  	case SIOCGIFCONF:
! 		return (ifconf(cmd, (caddr_t)&uifr));
  
  	case SIOCSIFADDR:
  	case SIOCSIFFLAGS:

--- 210,216 -----
  	switch (cmd) {
  
  	case SIOCGIFCONF:
! 		return (ifconf(cmd, data));
  
  	case SIOCSIFADDR:
  	case SIOCSIFFLAGS:
***************
*** 222,227
  			return (u.u_error);
  		break;
  	}
  	ifr = (struct ifreq *)&uifr;
  	ifp = ifunit(ifr->ifr_name);
  	if (ifp == (struct ifnet *)0)

--- 219,226 -----
  			return (u.u_error);
  		break;
  	}
+ 	if (copyin(data, (caddr_t) &uifr, sizeof(struct ifreq)))
+ 		return(EFAULT);
  	ifr = (struct ifreq *)&uifr;
  	ifp = ifunit(ifr->ifr_name);
  	if (ifp == (struct ifnet *)0)
***************
*** 256,262
  			return (EOPNOTSUPP);
  		return ((*ifp->if_ioctl)(ifp, cmd, (caddr_t)&uifr));
  	}
! 	if (copyout((caddr_t)&uifr, data, sizeof(uifr))) {
  		return(EFAULT);
  	}
  	return (0);

--- 255,261 -----
  			return (EOPNOTSUPP);
  		return ((*ifp->if_ioctl)(ifp, cmd, (caddr_t)&uifr));
  	}
! 	if (copyout((caddr_t)&uifr, data, sizeof(struct ifreq)))
  		return(EFAULT);
  	return (0);
  }
***************
*** 258,264
  	}
  	if (copyout((caddr_t)&uifr, data, sizeof(uifr))) {
  		return(EFAULT);
- 	}
  	return (0);
  }
  

--- 257,262 -----
  	}
  	if (copyout((caddr_t)&uifr, data, sizeof(struct ifreq)))
  		return(EFAULT);
  	return (0);
  }
  
***************
*** 273,279
  	int cmd;
  	caddr_t data;
  {
! 	register struct ifconf *ifc = (struct ifconf *)data;
  	register struct ifnet *ifp = ifnet;
  	register char *cp, *ep;
  	struct ifreq ifr, *ifrp;

--- 271,277 -----
  	int cmd;
  	caddr_t data;
  {
! 	register struct ifconf ifcnf, *ifc;
  	register struct ifnet *ifp = ifnet;
  	register char *cp, *ep;
  	struct ifreq ifr, *ifrp;
***************
*** 277,283
  	register struct ifnet *ifp = ifnet;
  	register char *cp, *ep;
  	struct ifreq ifr, *ifrp;
! 	int space = ifc->ifc_len, error = 0;
  
  	ifrp = ifc->ifc_req;
  	ep = ifr.ifr_name + sizeof (ifr.ifr_name) - 2;

--- 275,281 -----
  	register struct ifnet *ifp = ifnet;
  	register char *cp, *ep;
  	struct ifreq ifr, *ifrp;
! 	int space, error = 0;
  
  	if (copyin(data, (caddr_t) &ifcnf, sizeof(struct ifconf)))
  		return(EFAULT);
***************
*** 279,284
  	struct ifreq ifr, *ifrp;
  	int space = ifc->ifc_len, error = 0;
  
  	ifrp = ifc->ifc_req;
  	ep = ifr.ifr_name + sizeof (ifr.ifr_name) - 2;
  	for (; space > sizeof (ifr) && ifp; ifp = ifp->if_next) {

--- 277,286 -----
  	struct ifreq ifr, *ifrp;
  	int space, error = 0;
  
+ 	if (copyin(data, (caddr_t) &ifcnf, sizeof(struct ifconf)))
+ 		return(EFAULT);
+ 	ifc = &ifcnf;
+ 	space = ifc->ifc_len;
  	ifrp = ifc->ifc_req;
  	ep = ifr.ifr_name + sizeof (ifr.ifr_name) - 2;
  	for (; space > sizeof (ifr) && ifp; ifp = ifp->if_next) {
***************
*** 285,291
  		bcopy(ifp->if_name, ifr.ifr_name, sizeof (ifr.ifr_name) - 2);
  		for (cp = ifr.ifr_name; cp < ep && *cp; cp++)
  			;
! 		*cp+= '0' + ifp->if_unit; *cp = '\0';
  		ifr.ifr_addr = ifp->if_addr;
  		error = copyout((caddr_t)&ifr, (caddr_t)ifrp, sizeof (ifr));
  		if (error)

--- 287,293 -----
  		bcopy(ifp->if_name, ifr.ifr_name, sizeof (ifr.ifr_name) - 2);
  		for (cp = ifr.ifr_name; cp < ep && *cp; cp++)
  			;
! 		*cp++ = '0' + ifp->if_unit; *cp = '\0';
  		ifr.ifr_addr = ifp->if_addr;
  		error = copyout((caddr_t)&ifr, (caddr_t)ifrp, sizeof (ifr));
  		if (error)
***************
*** 293,297
  		space -= sizeof (ifr), ifrp++;
  	}
  	ifc->ifc_len -= space;
  	return (error);
  }

--- 295,301 -----
  		space -= sizeof (ifr), ifrp++;
  	}
  	ifc->ifc_len -= space;
+ 	if (copyout((caddr_t)&ifcnf, data, sizeof(struct ifconf)))
+ 		error = EFAULT;
  	return (error);
  }

*** /tmp/,RCSt1017287	Fri Jun 29 13:22:45 1984
--- if_loop.c	Wed Jun 27 23:43:30 1984
***************
*** 8,13
  #include <sys/systm.h>
  #include <sys/mbuf.h>
  #include <sys/socket.h>
  #include "../net/in.h"
  #include "../net/in_systm.h"
  #include "../net/if.h"

--- 8,15 -----
  #include <sys/systm.h>
  #include <sys/mbuf.h>
  #include <sys/socket.h>
+ #include <errno.h>
+ #include <sys/ioctl.h>
  #include "../net/in.h"
  #include "../net/in_systm.h"
  #include "../net/if.h"
***************
*** 14,20
  #include "../net/ip.h"
  #include "../net/ip_var.h"
  #include "../net/route.h"
- #include <errno.h>
  
  #define LONET   0x7f000000
  #define	LOMTU	(1024+512)

--- 16,21 -----
  #include "../net/ip.h"
  #include "../net/ip_var.h"
  #include "../net/route.h"
  
  #define LONET   0x7f000000
  #define	LOHOST	1
***************
*** 17,22
  #include <errno.h>
  
  #define LONET   0x7f000000
  #define	LOMTU	(1024+512)
  
  struct	ifnet loif;

--- 18,24 -----
  #include "../net/route.h"
  
  #define LONET   0x7f000000
+ #define	LOHOST	1
  #define	LOMTU	(1024+512)
  
  struct	ifnet loif;
***************
*** 20,26
  #define	LOMTU	(1024+512)
  
  struct	ifnet loif;
! int	looutput();
  
  loattach()
  {

--- 22,28 -----
  #define	LOMTU	(1024+512)
  
  struct	ifnet loif;
! int	looutput(), loioctl();
  
  loattach()
  {
***************
*** 30,35
  	ifp->if_name = "lo";
  	ifp->if_mtu = LOMTU;
  	ifp->if_net = htonl((u_long)LONET);
  	sin = (struct sockaddr_in *)&ifp->if_addr;
  	sin->sin_family = AF_INET;
  	sin->sin_addr = if_makeaddr(ifp->if_net, 0);

--- 32,38 -----
  	ifp->if_name = "lo";
  	ifp->if_mtu = LOMTU;
  	ifp->if_net = htonl((u_long)LONET);
+ 	ifp->if_host[0] = LOHOST;
  	sin = (struct sockaddr_in *)&ifp->if_addr;
  	sin->sin_family = AF_INET;
  	sin->sin_addr = if_makeaddr(ifp->if_net, LOHOST);
***************
*** 32,39
  	ifp->if_net = htonl((u_long)LONET);
  	sin = (struct sockaddr_in *)&ifp->if_addr;
  	sin->sin_family = AF_INET;
! 	sin->sin_addr = if_makeaddr(ifp->if_net, 0);
! 	ifp->if_flags = IFF_UP;
  	ifp->if_output = looutput;
  	if_attach(ifp);
  	if_rtinit(ifp, RTF_UP);

--- 35,43 -----
  	ifp->if_host[0] = LOHOST;
  	sin = (struct sockaddr_in *)&ifp->if_addr;
  	sin->sin_family = AF_INET;
! 	sin->sin_addr = if_makeaddr(ifp->if_net, LOHOST);
! 	ifp->if_flags = IFF_UP | IFF_RUNNING;
! 	ifp->if_ioctl = loioctl;
  	ifp->if_output = looutput;
  	if_attach(ifp);
  	if_rtinit(ifp, RTF_UP);
***************
*** 73,76
  	ifp->if_ipackets++;
  	splx(s);
  	return (0);
  }

--- 77,111 -----
  	ifp->if_ipackets++;
  	splx(s);
  	return (0);
+ }
+ 
+ /*
+  * Process an ioctl request.
+  */
+ loioctl(ifp, cmd, data)
+ 	register struct ifnet *ifp;
+ 	int cmd;
+ 	caddr_t data;
+ {
+ 	struct ifreq *ifr = (struct ifreq *)data;
+ 	struct sockaddr_in *sin;
+ 	int s = splimp(), error = 0;
+ 
+ 	switch (cmd) {
+ 
+ 	case SIOCSIFADDR:
+ 		if (ifp->if_flags & IFF_RUNNING)
+ 			if_rtinit(ifp, -1);  /* delete previous route */
+ 		ifp->if_addr = ifr->ifr_addr;
+ 		sin = (struct sockaddr_in *)&ifp->if_addr;
+ 		ifp->if_net = in_netof(sin->sin_addr);
+ 		ifp->if_host[0] = in_lnaof(sin->sin_addr);
+ 		if_rtinit(ifp, RTF_UP);
+ 		break;
+ 
+ 	default:
+ 		error = EINVAL;
+ 	}
+ 	splx(s);
+ 	return (error);
  }



More information about the Comp.bugs.2bsd mailing list