Abstract data read from and written to the tun device,
allowing for a possible header on the front of all packets. In OpenBSD, there's a structure containing the address family here. If we're building under OpenBSD, set up the ``flags'' part of struct tuninfo (not there under FreeBSD) so that we config the interface as POINTOPOINT. Prefix prototypes with ``extern'' in os.c for consistency. These changes are cosmetic under FreeBSD, but allow ppp to build & work under OpenBSD (bar the srandomdev() stuff, the inclusing of <net/if_var.h> and some Makefile symantecs).
This commit is contained in:
parent
0c96ca09b7
commit
6a6b4bbb08
@ -1,10 +1,11 @@
|
||||
# $Id: Makefile,v 1.28 1997/10/26 01:01:58 brian Exp $
|
||||
# $Id: Makefile,v 1.29 1997/11/09 06:22:37 brian Exp $
|
||||
|
||||
PROG= ppp
|
||||
SRCS= alias_cmd.c arp.c async.c auth.c ccp.c chap.c chat.c command.c \
|
||||
defs.c filter.c fsm.c hdlc.c id.c ip.c ipcp.c lcp.c loadalias.c log.c \
|
||||
lqr.c main.c mbuf.c modem.c os.c pap.c phase.c pred.c route.c \
|
||||
server.c sig.c slcompress.c systems.c timer.c vars.c vjcomp.c
|
||||
SRCS= alias_cmd.c arp.c async.c auth.c ccp.c chap.c chat.c \
|
||||
command.c defs.c filter.c fsm.c hdlc.c id.c ip.c ipcp.c lcp.c \
|
||||
loadalias.c log.c lqr.c main.c mbuf.c modem.c os.c pap.c phase.c \
|
||||
pred.c route.c server.c sig.c slcompress.c systems.c timer.c tun.c \
|
||||
vars.c vjcomp.c
|
||||
CFLAGS+=-Wall -Wmissing-prototypes
|
||||
LDADD+= -lmd -lcrypt -lutil
|
||||
DPADD+= ${LIBMD} ${LIBCRYPT} ${LIBUTIL}
|
||||
|
@ -17,13 +17,16 @@
|
||||
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* $Id: ip.c,v 1.28 1997/11/12 19:48:45 brian Exp $
|
||||
* $Id: ip.c,v 1.29 1997/11/12 21:04:21 brian Exp $
|
||||
*
|
||||
* TODO:
|
||||
* o Return ICMP message for filterd packet
|
||||
* and optionaly record it into log.
|
||||
*/
|
||||
#include <sys/param.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/select.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/in_systm.h>
|
||||
#include <netinet/ip.h>
|
||||
@ -31,6 +34,9 @@
|
||||
#include <netinet/udp.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <net/if.h>
|
||||
#include <net/if_var.h>
|
||||
#include <net/if_tun.h>
|
||||
|
||||
#include <alias.h>
|
||||
#include <errno.h>
|
||||
@ -57,6 +63,7 @@
|
||||
#include "vjcomp.h"
|
||||
#include "lcp.h"
|
||||
#include "modem.h"
|
||||
#include "tun.h"
|
||||
#include "ip.h"
|
||||
|
||||
static struct pppTimer IdleTimer;
|
||||
@ -369,9 +376,10 @@ IpInput(struct mbuf * bp)
|
||||
u_char *cp;
|
||||
struct mbuf *wp;
|
||||
int nb, nw;
|
||||
u_char tunbuff[MAX_MRU];
|
||||
struct tun_data tun, *frag;
|
||||
|
||||
cp = tunbuff;
|
||||
tun_fill_header(tun, AF_INET);
|
||||
cp = tun.data;
|
||||
nb = 0;
|
||||
for (wp = bp; wp; wp = wp->next) { /* Copy to contiguous region */
|
||||
memcpy(cp, MBUF_CTOP(wp), wp->cnt);
|
||||
@ -383,8 +391,8 @@ IpInput(struct mbuf * bp)
|
||||
int iresult;
|
||||
char *fptr;
|
||||
|
||||
iresult = VarPacketAliasIn(tunbuff, sizeof tunbuff);
|
||||
nb = ntohs(((struct ip *) tunbuff)->ip_len);
|
||||
iresult = VarPacketAliasIn(tun.data, sizeof tun.data);
|
||||
nb = ntohs(((struct ip *) tun.data)->ip_len);
|
||||
|
||||
if (nb > MAX_MRU) {
|
||||
LogPrintf(LogERROR, "IpInput: Problem with IP header length\n");
|
||||
@ -393,14 +401,15 @@ IpInput(struct mbuf * bp)
|
||||
}
|
||||
if (iresult == PKT_ALIAS_OK
|
||||
|| iresult == PKT_ALIAS_FOUND_HEADER_FRAGMENT) {
|
||||
if (PacketCheck(tunbuff, nb, FL_IN) < 0) {
|
||||
if (PacketCheck(tun.data, nb, FL_IN) < 0) {
|
||||
pfree(bp);
|
||||
return;
|
||||
}
|
||||
ipInOctets += nb;
|
||||
|
||||
nb = ntohs(((struct ip *) tunbuff)->ip_len);
|
||||
nw = write(tun_out, tunbuff, nb);
|
||||
nb = ntohs(((struct ip *) tun.data)->ip_len);
|
||||
nb += sizeof(tun)-sizeof(tun.data);
|
||||
nw = write(tun_out, &tun, nb);
|
||||
if (nw != nb)
|
||||
if (nw == -1)
|
||||
LogPrintf(LogERROR, "IpInput: wrote %d, got %s\n", nb,
|
||||
@ -409,36 +418,41 @@ IpInput(struct mbuf * bp)
|
||||
LogPrintf(LogERROR, "IpInput: wrote %d, got %d\n", nb, nw);
|
||||
|
||||
if (iresult == PKT_ALIAS_FOUND_HEADER_FRAGMENT) {
|
||||
while ((fptr = VarPacketAliasGetFragment(tunbuff)) != NULL) {
|
||||
VarPacketAliasFragmentIn(tunbuff, fptr);
|
||||
while ((fptr = VarPacketAliasGetFragment(tun.data)) != NULL) {
|
||||
VarPacketAliasFragmentIn(tun.data, fptr);
|
||||
nb = ntohs(((struct ip *) fptr)->ip_len);
|
||||
nw = write(tun_out, fptr, nb);
|
||||
frag = (struct tun_data *)((char *)fptr-sizeof(tun)+sizeof(tun.data));
|
||||
nb += sizeof(tun)-sizeof(tun.data);
|
||||
nw = write(tun_out, frag, nb);
|
||||
if (nw != nb)
|
||||
if (nw == -1)
|
||||
LogPrintf(LogERROR, "IpInput: wrote %d, got %s\n", nb,
|
||||
strerror(errno));
|
||||
else
|
||||
LogPrintf(LogERROR, "IpInput: wrote %d, got %d\n", nb, nw);
|
||||
free(fptr);
|
||||
free(frag);
|
||||
}
|
||||
}
|
||||
} else if (iresult == PKT_ALIAS_UNRESOLVED_FRAGMENT) {
|
||||
nb = ntohs(((struct ip *) tunbuff)->ip_len);
|
||||
fptr = malloc(nb);
|
||||
if (fptr == NULL)
|
||||
nb = ntohs(((struct ip *) tun.data)->ip_len);
|
||||
nb += sizeof(tun)-sizeof(tun.data);
|
||||
frag = (struct tun_data *)malloc(nb);
|
||||
if (frag == NULL)
|
||||
LogPrintf(LogALERT, "IpInput: Cannot allocate memory for fragment\n");
|
||||
else {
|
||||
memcpy(fptr, tunbuff, nb);
|
||||
VarPacketAliasSaveFragment(fptr);
|
||||
tun_fill_header(*frag, AF_INET);
|
||||
memcpy(frag->data, tun.data, nb-sizeof(tun)+sizeof(tun.data));
|
||||
VarPacketAliasSaveFragment(frag->data);
|
||||
}
|
||||
}
|
||||
} else { /* no aliasing */
|
||||
if (PacketCheck(tunbuff, nb, FL_IN) < 0) {
|
||||
if (PacketCheck(tun.data, nb, FL_IN) < 0) {
|
||||
pfree(bp);
|
||||
return;
|
||||
}
|
||||
ipInOctets += nb;
|
||||
nw = write(tun_out, tunbuff, nb);
|
||||
nb += sizeof(tun)-sizeof(tun.data);
|
||||
nw = write(tun_out, &tun, nb);
|
||||
if (nw != nb)
|
||||
if (nw == -1)
|
||||
LogPrintf(LogERROR, "IpInput: wrote %d, got %s\n", nb, strerror(errno));
|
||||
|
@ -17,15 +17,21 @@
|
||||
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* $Id: lcp.c,v 1.44 1997/11/11 13:08:12 brian Exp $
|
||||
* $Id: lcp.c,v 1.45 1997/11/14 15:39:15 brian Exp $
|
||||
*
|
||||
* TODO:
|
||||
* o Validate magic number received from peer.
|
||||
* o Limit data field length by MRU
|
||||
*/
|
||||
#include <sys/param.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/select.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <net/if.h>
|
||||
#include <net/if_var.h>
|
||||
#include <net/if_tun.h>
|
||||
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
@ -58,6 +64,7 @@
|
||||
#include "main.h"
|
||||
#include "ip.h"
|
||||
#include "modem.h"
|
||||
#include "tun.h"
|
||||
|
||||
struct lcpstate LcpInfo;
|
||||
|
||||
@ -350,7 +357,7 @@ static void
|
||||
LcpLayerUp(struct fsm * fp)
|
||||
{
|
||||
LogPrintf(LogLCP, "LcpLayerUp\n");
|
||||
OsSetInterfaceParams(23, LcpInfo.his_mru, ModemSpeed());
|
||||
tun_configure(LcpInfo.his_mru, ModemSpeed());
|
||||
SetLinkParams(&LcpInfo);
|
||||
|
||||
NewPhase(PHASE_AUTHENTICATE);
|
||||
|
@ -17,19 +17,24 @@
|
||||
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* $Id: main.c,v 1.97 1997/11/13 14:44:06 brian Exp $
|
||||
* $Id: main.c,v 1.98 1997/11/13 15:35:06 brian Exp $
|
||||
*
|
||||
* TODO:
|
||||
* o Add commands for traffic summary, version display, etc.
|
||||
* o Add signal handler for misc controls.
|
||||
*/
|
||||
#include <sys/param.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/select.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/in_systm.h>
|
||||
#include <netinet/ip.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#include <net/if.h>
|
||||
#include <net/if_var.h>
|
||||
#include <net/if_tun.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
@ -70,6 +75,7 @@
|
||||
#include "vjcomp.h"
|
||||
#include "async.h"
|
||||
#include "pathnames.h"
|
||||
#include "tun.h"
|
||||
|
||||
#ifndef O_NONBLOCK
|
||||
#ifdef O_NDELAY
|
||||
@ -728,11 +734,12 @@ DoLoop()
|
||||
struct timeval timeout, *tp;
|
||||
int ssize = sizeof(hisaddr);
|
||||
u_char *cp;
|
||||
u_char rbuff[MAX_MRU];
|
||||
int tries;
|
||||
int qlen;
|
||||
int res;
|
||||
pid_t pgroup;
|
||||
struct tun_data tun;
|
||||
#define rbuff tun.data
|
||||
|
||||
pgroup = getpgrp();
|
||||
|
||||
@ -1004,11 +1011,18 @@ DoLoop()
|
||||
}
|
||||
if (tun_in >= 0 && FD_ISSET(tun_in, &rfds)) { /* something to read
|
||||
* from tun */
|
||||
n = read(tun_in, rbuff, sizeof(rbuff));
|
||||
n = read(tun_in, &tun, sizeof(tun));
|
||||
if (n < 0) {
|
||||
LogPrintf(LogERROR, "read from tun: %s\n", strerror(errno));
|
||||
continue;
|
||||
}
|
||||
n -= sizeof(tun)-sizeof(tun.data);
|
||||
if (n <= 0) {
|
||||
LogPrintf(LogERROR, "read from tun: Only %d bytes read\n", n);
|
||||
continue;
|
||||
}
|
||||
if (!tun_check_header(tun, AF_INET))
|
||||
continue;
|
||||
if (((struct ip *) rbuff)->ip_dst.s_addr == IpcpInfo.want_ipaddr.s_addr) {
|
||||
/* we've been asked to send something addressed *to* us :( */
|
||||
if (VarLoopback) {
|
||||
|
@ -17,7 +17,7 @@
|
||||
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* $Id: os.c,v 1.32 1997/11/11 22:58:12 brian Exp $
|
||||
* $Id: os.c,v 1.33 1997/11/13 12:09:57 brian Exp $
|
||||
*
|
||||
*/
|
||||
#include <sys/param.h>
|
||||
@ -287,21 +287,6 @@ OsInterfaceDown(int final)
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
OsSetInterfaceParams(int type, int mtu, int speed)
|
||||
{
|
||||
struct tuninfo info;
|
||||
|
||||
info.type = type;
|
||||
info.mtu = mtu;
|
||||
if (VarPrefMTU != 0 && VarPrefMTU < mtu)
|
||||
info.mtu = VarPrefMTU;
|
||||
info.baudrate = speed;
|
||||
if (ioctl(tun_out, TUNSIFINFO, &info) < 0)
|
||||
LogPrintf(LogERROR, "OsSetInterfaceParams: ioctl(TUNSIFINFO): %s\n",
|
||||
strerror(errno));
|
||||
}
|
||||
|
||||
/*
|
||||
* Open tunnel device and returns its descriptor
|
||||
*/
|
||||
|
@ -15,19 +15,18 @@
|
||||
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* $Id: os.h,v 1.9 1997/10/26 01:03:27 brian Exp $
|
||||
* $Id: os.h,v 1.10 1997/10/29 01:19:48 brian Exp $
|
||||
*
|
||||
* TODO:
|
||||
*/
|
||||
|
||||
extern char *IfDevName;
|
||||
|
||||
int OsSetIpaddress(struct in_addr, struct in_addr, struct in_addr);
|
||||
int OsInterfaceDown(int);
|
||||
void OsSetInterfaceParams(int, int, int);
|
||||
int OpenTunnel(int *);
|
||||
void OsLinkup(void);
|
||||
int OsLinkIsUp(void);
|
||||
void OsLinkdown(void);
|
||||
void OsSetRoute(int, struct in_addr, struct in_addr, struct in_addr);
|
||||
void DeleteIfRoutes(int);
|
||||
extern int OsSetIpaddress(struct in_addr, struct in_addr, struct in_addr);
|
||||
extern int OsInterfaceDown(int);
|
||||
extern int OpenTunnel(int *);
|
||||
extern void OsLinkup(void);
|
||||
extern int OsLinkIsUp(void);
|
||||
extern void OsLinkdown(void);
|
||||
extern void OsSetRoute(int, struct in_addr, struct in_addr, struct in_addr);
|
||||
extern void DeleteIfRoutes(int);
|
||||
|
39
usr.sbin/ppp/tun.c
Normal file
39
usr.sbin/ppp/tun.c
Normal file
@ -0,0 +1,39 @@
|
||||
#include <sys/param.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/select.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <net/if.h>
|
||||
#include <net/if_var.h>
|
||||
#include <net/if_tun.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/errno.h>
|
||||
|
||||
#include "hdlc.h"
|
||||
#include "defs.h"
|
||||
#include "loadalias.h"
|
||||
#include "command.h"
|
||||
#include "vars.h"
|
||||
#include "log.h"
|
||||
#include "tun.h"
|
||||
|
||||
void
|
||||
tun_configure(int mtu, int speed)
|
||||
{
|
||||
struct tuninfo info;
|
||||
|
||||
info.type = 23;
|
||||
info.mtu = mtu;
|
||||
if (VarPrefMTU != 0 && VarPrefMTU < mtu)
|
||||
info.mtu = VarPrefMTU;
|
||||
info.baudrate = speed;
|
||||
#ifdef __OpenBSD__
|
||||
info.flags = IFF_UP|IFF_POINTOPOINT;
|
||||
#endif
|
||||
if (ioctl(tun_out, TUNSIFINFO, &info) < 0)
|
||||
LogPrintf(LogERROR, "tun_configure: ioctl(TUNSIFINFO): %s\n",
|
||||
strerror(errno));
|
||||
}
|
16
usr.sbin/ppp/tun.h
Normal file
16
usr.sbin/ppp/tun.h
Normal file
@ -0,0 +1,16 @@
|
||||
struct tun_data {
|
||||
#ifdef __OpenBSD__
|
||||
struct tunnel_header head;
|
||||
#endif
|
||||
u_char data[MAX_MRU];
|
||||
};
|
||||
|
||||
#ifdef __OpenBSD__
|
||||
#define tun_fill_header(f,proto) do { (f).head.tun_af = (proto); } while (0)
|
||||
#define tun_check_header(f,proto) ((f).head.tun_af == (proto))
|
||||
#else
|
||||
#define tun_fill_header(f,proto) do { } while (0)
|
||||
#define tun_check_header(f,proto) (1)
|
||||
#endif
|
||||
|
||||
extern void tun_configure(int, int);
|
Loading…
Reference in New Issue
Block a user