diff options
-rw-r--r-- | usr.sbin/ppp/Makefile | 6 | ||||
-rw-r--r-- | usr.sbin/ppp/alias_cmd.c | 434 | ||||
-rw-r--r-- | usr.sbin/ppp/alias_cmd.h | 15 | ||||
-rw-r--r-- | usr.sbin/ppp/command.c | 2 | ||||
-rw-r--r-- | usr.sbin/ppp/mp.c | 2 | ||||
-rw-r--r-- | usr.sbin/ppp/nat_cmd.c | 2 | ||||
-rw-r--r-- | usr.sbin/ppp/physical.c | 2 |
7 files changed, 7 insertions, 456 deletions
diff --git a/usr.sbin/ppp/Makefile b/usr.sbin/ppp/Makefile index c5ddd1f..aeef933 100644 --- a/usr.sbin/ppp/Makefile +++ b/usr.sbin/ppp/Makefile @@ -25,7 +25,7 @@ CFLAGS+=-DRELEASE_CRUNCH CFLAGS+=-DNONAT .else .if !defined(RELEASE_CRUNCH) -SRCS+= alias_cmd.c +SRCS+= nat_cmd.c LDADD+= -lalias DPADD+= ${LIBALIAS} .endif @@ -59,8 +59,8 @@ SRCS+= i4b.c # We must create these objects because crunchgen will link them, # and we don't want any unused symbols to spoil the final link. CFLAGS+=-DNONAT -DNORADIUS -DNOI4B -OBJS+= alias_cmd.o chap_ms.o radius.o -chap_ms.o alias_cmd.o radius.o: +OBJS+= nat_cmd.o chap_ms.o radius.o +chap_ms.o nat_cmd.o radius.o: >null_${.PREFIX}.c cc -c -o ${.TARGET} null_${.PREFIX}.c .endif diff --git a/usr.sbin/ppp/alias_cmd.c b/usr.sbin/ppp/alias_cmd.c deleted file mode 100644 index 0439042..0000000 --- a/usr.sbin/ppp/alias_cmd.c +++ /dev/null @@ -1,434 +0,0 @@ -/*- - * The code in this file was written by Eivind Eklund <perhaps@yes.no>, - * who places it in the public domain without restriction. - * - * $FreeBSD$ - */ - -#include <sys/param.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <netdb.h> -#include <netinet/in_systm.h> -#include <netinet/in.h> -#include <netinet/ip.h> -#include <sys/un.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <termios.h> - -#ifdef __FreeBSD__ -#include <alias.h> -#else -#include "alias.h" -#endif -#include "layer.h" -#include "proto.h" -#include "defs.h" -#include "command.h" -#include "log.h" -#include "alias_cmd.h" -#include "descriptor.h" -#include "prompt.h" -#include "timer.h" -#include "fsm.h" -#include "slcompress.h" -#include "throughput.h" -#include "iplist.h" -#include "mbuf.h" -#include "lqr.h" -#include "hdlc.h" -#include "ipcp.h" -#include "lcp.h" -#include "ccp.h" -#include "link.h" -#include "mp.h" -#include "filter.h" -#ifndef NORADIUS -#include "radius.h" -#endif -#include "bundle.h" - - -static int StrToAddr(const char *, struct in_addr *); -static int StrToPortRange(const char *, u_short *, u_short *, const char *); -static int StrToAddrAndPort(const char *, struct in_addr *, u_short *, - u_short *, const char *); - -static void -lowhigh(u_short *a, u_short *b) -{ - if (a > b) { - u_short c; - - c = *b; - *b = *a; - *a = c; - } -} - -int -nat_RedirectPort(struct cmdargs const *arg) -{ - if (!arg->bundle->NatEnabled) { - prompt_Printf(arg->prompt, "Alias not enabled\n"); - return 1; - } else if (arg->argc == arg->argn + 3 || arg->argc == arg->argn + 4) { - char proto_constant; - const char *proto; - struct in_addr localaddr; - u_short hlocalport, llocalport; - struct in_addr aliasaddr; - u_short haliasport, laliasport; - struct in_addr remoteaddr; - u_short hremoteport, lremoteport; - struct alias_link *link; - int error; - - proto = arg->argv[arg->argn]; - if (strcmp(proto, "tcp") == 0) { - proto_constant = IPPROTO_TCP; - } else if (strcmp(proto, "udp") == 0) { - proto_constant = IPPROTO_UDP; - } else { - prompt_Printf(arg->prompt, "port redirect: protocol must be" - " tcp or udp\n"); - return -1; - } - - error = StrToAddrAndPort(arg->argv[arg->argn+1], &localaddr, &llocalport, - &hlocalport, proto); - if (error) { - prompt_Printf(arg->prompt, "nat port: error reading localaddr:port\n"); - return -1; - } - - error = StrToPortRange(arg->argv[arg->argn+2], &laliasport, &haliasport, - proto); - if (error) { - prompt_Printf(arg->prompt, "nat port: error reading alias port\n"); - return -1; - } - aliasaddr.s_addr = INADDR_ANY; - - if (arg->argc == arg->argn + 4) { - error = StrToAddrAndPort(arg->argv[arg->argn+3], &remoteaddr, - &lremoteport, &hremoteport, proto); - if (error) { - prompt_Printf(arg->prompt, "nat port: error reading " - "remoteaddr:port\n"); - return -1; - } - } else { - remoteaddr.s_addr = INADDR_ANY; - lremoteport = hremoteport = 0; - } - - lowhigh(&llocalport, &hlocalport); - lowhigh(&laliasport, &haliasport); - lowhigh(&lremoteport, &hremoteport); - - if (haliasport - laliasport != hlocalport - llocalport) { - prompt_Printf(arg->prompt, "nat port: local & alias port ranges " - "are not equal\n"); - return -1; - } - - if (hremoteport && hremoteport - lremoteport != hlocalport - llocalport) { - prompt_Printf(arg->prompt, "nat port: local & remote port ranges " - "are not equal\n"); - return -1; - } - - while (laliasport <= haliasport) { - link = PacketAliasRedirectPort(localaddr, htons(llocalport), - remoteaddr, htons(lremoteport), - aliasaddr, htons(laliasport), - proto_constant); - - if (link == NULL) { - prompt_Printf(arg->prompt, "nat port: %d: error %d\n", laliasport, - error); - return 1; - } - llocalport++; - laliasport++; - if (hremoteport) - lremoteport++; - } - - return 0; - } - - return -1; -} - - -int -nat_RedirectAddr(struct cmdargs const *arg) -{ - if (!arg->bundle->NatEnabled) { - prompt_Printf(arg->prompt, "nat not enabled\n"); - return 1; - } else if (arg->argc == arg->argn+2) { - int error; - struct in_addr localaddr, aliasaddr; - struct alias_link *link; - - error = StrToAddr(arg->argv[arg->argn], &localaddr); - if (error) { - prompt_Printf(arg->prompt, "address redirect: invalid local address\n"); - return 1; - } - error = StrToAddr(arg->argv[arg->argn+1], &aliasaddr); - if (error) { - prompt_Printf(arg->prompt, "address redirect: invalid alias address\n"); - prompt_Printf(arg->prompt, "Usage: nat %s %s\n", arg->cmd->name, - arg->cmd->syntax); - return 1; - } - link = PacketAliasRedirectAddr(localaddr, aliasaddr); - if (link == NULL) { - prompt_Printf(arg->prompt, "address redirect: packet aliasing" - " engine error\n"); - prompt_Printf(arg->prompt, "Usage: nat %s %s\n", arg->cmd->name, - arg->cmd->syntax); - } - } else - return -1; - - return 0; -} - - -static int -StrToAddr(const char *str, struct in_addr *addr) -{ - struct hostent *hp; - - if (inet_aton(str, addr)) - return 0; - - hp = gethostbyname(str); - if (!hp) { - log_Printf(LogWARN, "StrToAddr: Unknown host %s.\n", str); - return -1; - } - *addr = *((struct in_addr *) hp->h_addr); - return 0; -} - - -static int -StrToPort(const char *str, u_short *port, const char *proto) -{ - struct servent *sp; - char *end; - - *port = strtol(str, &end, 10); - if (*end != '\0') { - sp = getservbyname(str, proto); - if (sp == NULL) { - log_Printf(LogWARN, "StrToAddr: Unknown port or service %s/%s.\n", - str, proto); - return -1; - } - *port = ntohs(sp->s_port); - } - - return 0; -} - -static int -StrToPortRange(const char *str, u_short *low, u_short *high, const char *proto) -{ - char *minus; - int res; - - minus = strchr(str, '-'); - if (minus) - *minus = '\0'; /* Cheat the const-ness ! */ - - res = StrToPort(str, low, proto); - - if (minus) - *minus = '-'; /* Cheat the const-ness ! */ - - if (res == 0) { - if (minus) - res = StrToPort(minus + 1, high, proto); - else - *high = *low; - } - - return res; -} - -static int -StrToAddrAndPort(const char *str, struct in_addr *addr, u_short *low, - u_short *high, const char *proto) -{ - char *colon; - int res; - - colon = strchr(str, ':'); - if (!colon) { - log_Printf(LogWARN, "StrToAddrAndPort: %s is missing port number.\n", str); - return -1; - } - - *colon = '\0'; /* Cheat the const-ness ! */ - res = StrToAddr(str, addr); - *colon = ':'; /* Cheat the const-ness ! */ - if (res != 0) - return -1; - - return StrToPortRange(colon + 1, low, high, proto); -} - -int -nat_ProxyRule(struct cmdargs const *arg) -{ - char cmd[LINE_LEN]; - int f, pos; - size_t len; - - if (arg->argn >= arg->argc) - return -1; - - for (f = arg->argn, pos = 0; f < arg->argc; f++) { - len = strlen(arg->argv[f]); - if (sizeof cmd - pos < len + (f ? 1 : 0)) - break; - if (f) - cmd[pos++] = ' '; - strcpy(cmd + pos, arg->argv[f]); - pos += len; - } - - return PacketAliasProxyRule(cmd); -} - -int -nat_Pptp(struct cmdargs const *arg) -{ - struct in_addr addr; - - if (arg->argc == arg->argn) { - addr.s_addr = INADDR_NONE; - PacketAliasPptp(addr); - return 0; - } - - if (arg->argc != arg->argn + 1) - return -1; - - addr = GetIpAddr(arg->argv[arg->argn]); - if (addr.s_addr == INADDR_NONE) { - log_Printf(LogWARN, "%s: invalid address\n", arg->argv[arg->argn]); - return 1; - } - - PacketAliasPptp(addr); - return 0; -} - -static struct mbuf * -nat_PadMbuf(struct mbuf *bp, int type) -{ - struct mbuf **last; - int len; - - mbuf_SetType(bp, type); - for (last = &bp, len = 0; *last != NULL; last = &(*last)->next) - len += (*last)->cnt; - - len = MAX_MRU - len; - *last = mbuf_Alloc(len, type); - - return bp; -} - -static struct mbuf * -nat_LayerPush(struct bundle *bundle, struct link *l, struct mbuf *bp, - int pri, u_short *proto) -{ - if (!bundle->NatEnabled || *proto != PROTO_IP) - return bp; - - log_Printf(LogDEBUG, "nat_LayerPush: PROTO_IP -> PROTO_IP\n"); - bp = mbuf_Contiguous(nat_PadMbuf(bp, MB_NATOUT)); - PacketAliasOut(MBUF_CTOP(bp), bp->cnt); - bp->cnt = ntohs(((struct ip *)MBUF_CTOP(bp))->ip_len); - - return bp; -} - -static struct mbuf * -nat_LayerPull(struct bundle *bundle, struct link *l, struct mbuf *bp, - u_short *proto) -{ - struct ip *pip, *piip; - int ret, len; - struct mbuf **last; - char *fptr; - - if (!bundle->NatEnabled || *proto != PROTO_IP) - return bp; - - log_Printf(LogDEBUG, "nat_LayerPull: PROTO_IP -> PROTO_IP\n"); - bp = mbuf_Contiguous(nat_PadMbuf(bp, MB_NATIN)); - pip = (struct ip *)MBUF_CTOP(bp); - piip = (struct ip *)((char *)pip + (pip->ip_hl << 2)); - - if (pip->ip_p == IPPROTO_IGMP || - (pip->ip_p == IPPROTO_IPIP && IN_CLASSD(ntohl(piip->ip_dst.s_addr)))) - return bp; - - ret = PacketAliasIn(MBUF_CTOP(bp), bp->cnt); - - bp->cnt = ntohs(pip->ip_len); - if (bp->cnt > MAX_MRU) { - log_Printf(LogWARN, "nat_LayerPull: Problem with IP header length (%d)\n", - bp->cnt); - mbuf_Free(bp); - return NULL; - } - - switch (ret) { - case PKT_ALIAS_OK: - break; - - case PKT_ALIAS_UNRESOLVED_FRAGMENT: - /* Save the data for later */ - fptr = malloc(bp->cnt); - bp = mbuf_Read(bp, fptr, bp->cnt); - PacketAliasSaveFragment(fptr); - break; - - case PKT_ALIAS_FOUND_HEADER_FRAGMENT: - /* Fetch all the saved fragments and chain them on the end of `bp' */ - last = &bp->pnext; - while ((fptr = PacketAliasGetFragment(MBUF_CTOP(bp))) != NULL) { - PacketAliasFragmentIn(MBUF_CTOP(bp), fptr); - len = ntohs(((struct ip *)fptr)->ip_len); - *last = mbuf_Alloc(len, MB_NATIN); - memcpy(MBUF_CTOP(*last), fptr, len); - free(fptr); - last = &(*last)->pnext; - } - break; - - default: - mbuf_Free(bp); - bp = NULL; - break; - } - - return bp; -} - -struct layer natlayer = - { LAYER_NAT, "nat", nat_LayerPush, nat_LayerPull }; diff --git a/usr.sbin/ppp/alias_cmd.h b/usr.sbin/ppp/alias_cmd.h deleted file mode 100644 index 1ce19d1..0000000 --- a/usr.sbin/ppp/alias_cmd.h +++ /dev/null @@ -1,15 +0,0 @@ -/*- - * The code in this file was written by Eivind Eklund <perhaps@yes.no>, - * who places it in the public domain without restriction. - * - * $FreeBSD$ - */ - -struct cmdargs; - -extern int nat_RedirectPort(struct cmdargs const *); -extern int nat_RedirectAddr(struct cmdargs const *); -extern int nat_ProxyRule(struct cmdargs const *); -extern int nat_Pptp(struct cmdargs const *); - -extern struct layer natlayer; diff --git a/usr.sbin/ppp/command.c b/usr.sbin/ppp/command.c index 66edd60..45e0bcc 100644 --- a/usr.sbin/ppp/command.c +++ b/usr.sbin/ppp/command.c @@ -63,7 +63,7 @@ #include "hdlc.h" #include "ipcp.h" #ifndef NONAT -#include "alias_cmd.h" +#include "nat_cmd.h" #endif #include "systems.h" #include "filter.h" diff --git a/usr.sbin/ppp/mp.c b/usr.sbin/ppp/mp.c index 19406ff..43c5829 100644 --- a/usr.sbin/ppp/mp.c +++ b/usr.sbin/ppp/mp.c @@ -46,7 +46,7 @@ #include "layer.h" #ifndef NONAT -#include "alias_cmd.h" +#include "nat_cmd.h" #endif #include "vjcomp.h" #include "ua.h" diff --git a/usr.sbin/ppp/nat_cmd.c b/usr.sbin/ppp/nat_cmd.c index 0439042..ebf13e7 100644 --- a/usr.sbin/ppp/nat_cmd.c +++ b/usr.sbin/ppp/nat_cmd.c @@ -29,7 +29,7 @@ #include "defs.h" #include "command.h" #include "log.h" -#include "alias_cmd.h" +#include "nat_cmd.h" #include "descriptor.h" #include "prompt.h" #include "timer.h" diff --git a/usr.sbin/ppp/physical.c b/usr.sbin/ppp/physical.c index a11dcde..2ee96eb 100644 --- a/usr.sbin/ppp/physical.c +++ b/usr.sbin/ppp/physical.c @@ -46,7 +46,7 @@ #include "layer.h" #ifndef NONAT -#include "alias_cmd.h" +#include "nat_cmd.h" #endif #include "proto.h" #include "acf.h" |