mirror of
https://github.com/freebsd/freebsd-src
synced 2024-09-23 02:04:46 +00:00
Cosmetic:
alias_cmd -> nat_cmd after a repo-copy
This commit is contained in:
parent
4255717924
commit
f02c2029cf
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=51075
|
@ -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
|
||||
|
|
|
@ -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 };
|
|
@ -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;
|
|
@ -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"
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
|
||||
#include "layer.h"
|
||||
#ifndef NONAT
|
||||
#include "alias_cmd.h"
|
||||
#include "nat_cmd.h"
|
||||
#endif
|
||||
#include "vjcomp.h"
|
||||
#include "ua.h"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
|
||||
#include "layer.h"
|
||||
#ifndef NONAT
|
||||
#include "alias_cmd.h"
|
||||
#include "nat_cmd.h"
|
||||
#endif
|
||||
#include "proto.h"
|
||||
#include "acf.h"
|
||||
|
|
Loading…
Reference in a new issue