Date: Mon, 5 Aug 1996 07:26:06 -0400 (EDT) From: Andrew Webster <andrew@fortress.org> To: J Wunsch <j@uriah.heep.sax.de> Cc: FreeBSD hackers <freebsd-hackers@freebsd.org> Subject: Re: minor patch to ppp's route.c Message-ID: <Pine.BSF.3.91.960805072150.19849S-100000@guardian.fortress.org> In-Reply-To: <199608022038.WAA24508@uriah.heep.sax.de>
next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, 2 Aug 1996, J Wunsch wrote: > As Joe Greco wrote: > > > > struct ifreq reqbuf[32]; > > > > > > and change 32 to something higher (at ~2 per interface, this runs out of > > > steam at about 15 interfaces). > > > > I believe I posted a suggestion once to raise this to something like 1024 > > :-) which I had done on several boxes. > > Make it dynamic and i'll integrate it in less than an hour. :) I made this change, along with a similar one to ifconfig quite a while ago. Here are 2 patches to ppp. One to route.c for a dynamic reqbuf, and the other to fix the inherent limit of 10 ppp interfaces. There is probably a better way to set the maximum number of tun interfaces, I haven't figured it out yet. --- cut here --- start of route.c.diff --- *** route.c.orig Mon Jun 3 22:44:34 1996 --- route.c Mon Jun 3 22:56:58 1996 *************** *** 350,363 **** --- 350,369 ---- free(sp); } + + /* + * 960603 - Modified to use dynamic buffer allocator as in ifconfig + */ int GetIfIndex(name) char *name; { + char *buffer; struct ifreq *ifrp; int s, len, elen, index; struct ifconf ifconfs; struct ifreq reqbuf[256]; + int oldbufsize, bufsize = sizeof(struct ifreq); s = socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) { *************** *** 365,376 **** return(-1); } ! ifconfs.ifc_len = sizeof(reqbuf); ! ifconfs.ifc_buf = (caddr_t)reqbuf; ! if (ioctl(s, SIOCGIFCONF, &ifconfs) < 0) { ! perror("IFCONF"); ! return(-1); ! } ifrp = ifconfs.ifc_req; --- 371,397 ---- return(-1); } ! buffer = malloc(bufsize); /* allocate first buffer */ ! ifconfs.ifc_len = bufsize; /* Initial setting */ ! /* ! * Iterate through here until we don't get many more data ! */ ! ! do { ! oldbufsize = ifconfs.ifc_len; ! bufsize += 1+sizeof(struct ifreq); ! buffer = realloc((void *)buffer, bufsize); /* Make it bigger */ ! #ifdef DEBUG ! logprintf ("Growing buffer to %d\n", bufsize); ! #endif ! ifconfs.ifc_len = bufsize; ! ifconfs.ifc_buf = buffer; ! if (ioctl(s, SIOCGIFCONF, &ifconfs) < 0) { ! perror("IFCONF"); ! free(buffer); ! return(-1); ! } ! } while (ifconfs.ifc_len > oldbufsize); ifrp = ifconfs.ifc_req; *************** *** 384,389 **** --- 405,411 ---- #endif if (strcmp(ifrp->ifr_name, name) == 0) { IfIndex = index; + free(buffer); return(index); } index++; *************** *** 395,399 **** --- 417,422 ---- } close(s); + free(buffer); return(-1); } --- cut here --- end of route.c.diff --- --- cut here --- start of os.c.diff --- *** os.c Mon May 29 23:50:52 1995 --- /usr/local/src/OS/RELEASE-2.0.5/usr.sbin/ppp/os.c Tue Dec 26 12:28:02 1995 *************** *** 253,273 **** OpenTunnel(ptun) int *ptun; { int s; ! char *cp; ! char *suffix = "0123456789"; char ifname[IFNAMSIZ]; ! char devname[12]; ! strcpy(devname, "/dev/tun0"); ! for (cp = suffix; *cp; cp++) { ! devname[8] = *cp; tun_out = open(devname, O_RDWR); if (tun_out >= 0) break; } ! *ptun = cp - suffix; ! if (*cp == '\0') { fprintf(stderr, "No tunnel device is available.\n"); return(-1); } --- 253,272 ---- OpenTunnel(ptun) int *ptun; { + #define MAXTUNDEV 16 int s; ! int cp; char ifname[IFNAMSIZ]; ! char devname[16]; ! for (cp = 0; cp < MAXTUNDEV; ++ cp) { ! sprintf(devname, "/dev/tun%d", cp); tun_out = open(devname, O_RDWR); if (tun_out >= 0) break; } ! *ptun = cp; ! if (cp >= MAXTUNDEV) { fprintf(stderr, "No tunnel device is available.\n"); return(-1); } --- cut here --- end of os.c.diff --- Andrew Webster - andrew@pubnix.net - http://www.pubnix.net PubNIX Montreal - Connected to the world - Branche au monde 514-990-5911 - P.O. Box 147, Cote St-Luc, Quebec, H4V 2Y3
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.3.91.960805072150.19849S-100000>