Lines Matching +full:link +full:- +full:loss +full:- +full:low

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
73 #include "link.h"
107 if (!arg->bundle->NatEnabled) { in nat_RedirectPort()
108 prompt_Printf(arg->prompt, "Alias not enabled\n"); in nat_RedirectPort()
110 } else if (arg->argc == arg->argn + 3 || arg->argc == arg->argn + 4) { in nat_RedirectPort()
119 struct alias_link *link; in nat_RedirectPort() local
122 proto = arg->argv[arg->argn]; in nat_RedirectPort()
128 prompt_Printf(arg->prompt, "port redirect: protocol must be" in nat_RedirectPort()
130 return -1; in nat_RedirectPort()
133 error = StrToAddrAndPort(arg->argv[arg->argn+1], &localaddr, &llocalport, in nat_RedirectPort()
136 prompt_Printf(arg->prompt, "nat port: error reading localaddr:port\n"); in nat_RedirectPort()
137 return -1; in nat_RedirectPort()
140 error = StrToPortRange(arg->argv[arg->argn+2], &laliasport, &haliasport, in nat_RedirectPort()
143 prompt_Printf(arg->prompt, "nat port: error reading alias port\n"); in nat_RedirectPort()
144 return -1; in nat_RedirectPort()
148 if (arg->argc == arg->argn + 4) { in nat_RedirectPort()
149 error = StrToAddrAndPort(arg->argv[arg->argn+3], &remoteaddr, in nat_RedirectPort()
152 prompt_Printf(arg->prompt, "nat port: error reading " in nat_RedirectPort()
154 return -1; in nat_RedirectPort()
165 if (haliasport - laliasport != hlocalport - llocalport) { in nat_RedirectPort()
166 prompt_Printf(arg->prompt, "nat port: local & alias port ranges " in nat_RedirectPort()
168 return -1; in nat_RedirectPort()
171 if (hremoteport && hremoteport - lremoteport != hlocalport - llocalport) { in nat_RedirectPort()
172 prompt_Printf(arg->prompt, "nat port: local & remote port ranges " in nat_RedirectPort()
174 return -1; in nat_RedirectPort()
178 link = LibAliasRedirectPort(la, localaddr, htons(llocalport), in nat_RedirectPort()
183 if (link == NULL) { in nat_RedirectPort()
184 prompt_Printf(arg->prompt, "nat port: %d: error %d\n", laliasport, in nat_RedirectPort()
196 return -1; in nat_RedirectPort()
203 if (!arg->bundle->NatEnabled) { in nat_RedirectAddr()
204 prompt_Printf(arg->prompt, "nat not enabled\n"); in nat_RedirectAddr()
206 } else if (arg->argc == arg->argn+2) { in nat_RedirectAddr()
209 struct alias_link *link; in nat_RedirectAddr() local
211 error = StrToAddr(arg->argv[arg->argn], &localaddr); in nat_RedirectAddr()
213 prompt_Printf(arg->prompt, "address redirect: invalid local address\n"); in nat_RedirectAddr()
216 error = StrToAddr(arg->argv[arg->argn+1], &aliasaddr); in nat_RedirectAddr()
218 prompt_Printf(arg->prompt, "address redirect: invalid alias address\n"); in nat_RedirectAddr()
219 prompt_Printf(arg->prompt, "usage: nat %s %s\n", arg->cmd->name, in nat_RedirectAddr()
220 arg->cmd->syntax); in nat_RedirectAddr()
223 link = LibAliasRedirectAddr(la, localaddr, aliasaddr); in nat_RedirectAddr()
224 if (link == NULL) { in nat_RedirectAddr()
225 prompt_Printf(arg->prompt, "address redirect: packet aliasing" in nat_RedirectAddr()
227 prompt_Printf(arg->prompt, "usage: nat %s %s\n", arg->cmd->name, in nat_RedirectAddr()
228 arg->cmd->syntax); in nat_RedirectAddr()
231 return -1; in nat_RedirectAddr()
240 if (!arg->bundle->NatEnabled) { in nat_RedirectProto()
241 prompt_Printf(arg->prompt, "nat not enabled\n"); in nat_RedirectProto()
243 } else if (arg->argc >= arg->argn + 2 && arg->argc <= arg->argn + 4) { in nat_RedirectProto()
245 struct alias_link *link; in nat_RedirectProto() local
250 len = strlen(arg->argv[arg->argn]); in nat_RedirectProto()
252 prompt_Printf(arg->prompt, "proto redirect: invalid protocol\n"); in nat_RedirectProto()
255 if (strspn(arg->argv[arg->argn], "01234567") == len) in nat_RedirectProto()
256 pe = getprotobynumber(atoi(arg->argv[arg->argn])); in nat_RedirectProto()
258 pe = getprotobyname(arg->argv[arg->argn]); in nat_RedirectProto()
260 prompt_Printf(arg->prompt, "proto redirect: invalid protocol\n"); in nat_RedirectProto()
264 error = StrToAddr(arg->argv[arg->argn + 1], &localIP); in nat_RedirectProto()
266 prompt_Printf(arg->prompt, "proto redirect: invalid src address\n"); in nat_RedirectProto()
270 if (arg->argc >= arg->argn + 3) { in nat_RedirectProto()
271 error = StrToAddr(arg->argv[arg->argn + 2], &publicIP); in nat_RedirectProto()
273 prompt_Printf(arg->prompt, "proto redirect: invalid alias address\n"); in nat_RedirectProto()
274 prompt_Printf(arg->prompt, "usage: nat %s %s\n", arg->cmd->name, in nat_RedirectProto()
275 arg->cmd->syntax); in nat_RedirectProto()
281 if (arg->argc == arg->argn + 4) { in nat_RedirectProto()
282 error = StrToAddr(arg->argv[arg->argn + 2], &remoteIP); in nat_RedirectProto()
284 prompt_Printf(arg->prompt, "proto redirect: invalid dst address\n"); in nat_RedirectProto()
285 prompt_Printf(arg->prompt, "usage: nat %s %s\n", arg->cmd->name, in nat_RedirectProto()
286 arg->cmd->syntax); in nat_RedirectProto()
292 link = LibAliasRedirectProto(la, localIP, remoteIP, publicIP, pe->p_proto); in nat_RedirectProto()
293 if (link == NULL) { in nat_RedirectProto()
294 prompt_Printf(arg->prompt, "proto redirect: packet aliasing" in nat_RedirectProto()
296 prompt_Printf(arg->prompt, "usage: nat %s %s\n", arg->cmd->name, in nat_RedirectProto()
297 arg->cmd->syntax); in nat_RedirectProto()
300 return -1; in nat_RedirectProto()
317 return -1; in StrToAddr()
319 *addr = *((struct in_addr *) hp->h_addr); in StrToAddr()
336 return -1; in StrToPort()
338 *port = ntohs(sp->s_port); in StrToPort()
345 StrToPortRange(const char *str, u_short *low, u_short *high, const char *proto) in StrToPortRange() argument
350 minus = strchr(str, '-'); in StrToPortRange()
352 *minus = '\0'; /* Cheat the const-ness ! */ in StrToPortRange()
354 res = StrToPort(str, low, proto); in StrToPortRange()
357 *minus = '-'; /* Cheat the const-ness ! */ in StrToPortRange()
363 *high = *low; in StrToPortRange()
370 StrToAddrAndPort(const char *str, struct in_addr *addr, u_short *low, in StrToAddrAndPort() argument
379 return -1; in StrToAddrAndPort()
382 *colon = '\0'; /* Cheat the const-ness ! */ in StrToAddrAndPort()
384 *colon = ':'; /* Cheat the const-ness ! */ in StrToAddrAndPort()
386 return -1; in StrToAddrAndPort()
388 return StrToPortRange(colon + 1, low, high, proto); in StrToAddrAndPort()
398 if (arg->argn >= arg->argc) in nat_ProxyRule()
399 return -1; in nat_ProxyRule()
401 for (f = arg->argn, pos = 0; f < arg->argc; f++) { in nat_ProxyRule()
402 len = strlen(arg->argv[f]); in nat_ProxyRule()
403 if (sizeof cmd - pos < len + (len ? 1 : 0)) in nat_ProxyRule()
407 strcpy(cmd + pos, arg->argv[f]); in nat_ProxyRule()
419 if (arg->argc == arg->argn) { in nat_SetTarget()
425 if (arg->argc != arg->argn + 1) in nat_SetTarget()
426 return -1; in nat_SetTarget()
428 if (!strcasecmp(arg->argv[arg->argn], "MYADDR")) { in nat_SetTarget()
434 addr = GetIpAddr(arg->argv[arg->argn]); in nat_SetTarget()
436 log_Printf(LogWARN, "%s: invalid address\n", arg->argv[arg->argn]); in nat_SetTarget()
451 if (arg->argc == arg->argn) { in nat_PunchFW()
456 if (arg->argc != arg->argn + 2) in nat_PunchFW()
457 return -1; in nat_PunchFW()
459 base = strtol(arg->argv[arg->argn], &end, 10); in nat_PunchFW()
461 return -1; in nat_PunchFW()
463 count = strtol(arg->argv[arg->argn + 1], &end, 10); in nat_PunchFW()
465 return -1; in nat_PunchFW()
480 if (arg->argc == arg->argn) { in nat_SkinnyPort()
485 if (arg->argc != arg->argn + 1) in nat_SkinnyPort()
486 return -1; in nat_SkinnyPort()
488 port = strtol(arg->argv[arg->argn], &end, 10); in nat_SkinnyPort()
490 return -1; in nat_SkinnyPort()
498 nat_LayerPush(struct bundle *bundle, struct link *l __unused, struct mbuf *bp, in nat_LayerPush()
501 if (!bundle->NatEnabled || *proto != PROTO_IP) in nat_LayerPush()
504 log_Printf(LogDEBUG, "nat_LayerPush: PROTO_IP -> PROTO_IP\n"); in nat_LayerPush()
508 LibAliasOut(la, MBUF_CTOP(bp), bp->m_len); in nat_LayerPush()
509 bp->m_len = ntohs(((struct ip *)MBUF_CTOP(bp))->ip_len); in nat_LayerPush()
515 nat_LayerPull(struct bundle *bundle, struct link *l __unused, struct mbuf *bp, in nat_LayerPull()
523 if (!bundle->NatEnabled || *proto != PROTO_IP) in nat_LayerPull()
526 log_Printf(LogDEBUG, "nat_LayerPull: PROTO_IP -> PROTO_IP\n"); in nat_LayerPull()
530 ret = LibAliasIn(la, MBUF_CTOP(bp), bp->m_len); in nat_LayerPull()
532 bp->m_len = ntohs(((struct ip *)MBUF_CTOP(bp))->ip_len); in nat_LayerPull()
533 if (bp->m_len > MAX_MRU) { in nat_LayerPull()
535 (unsigned long)bp->m_len); in nat_LayerPull()
546 if ((fptr = malloc(bp->m_len)) == NULL) { in nat_LayerPull()
547 log_Printf(LogWARN, "nat_LayerPull: Dropped unresolved fragment -" in nat_LayerPull()
552 bp = mbuf_Read(bp, fptr, bp->m_len); in nat_LayerPull()
554 log_Printf(LogDEBUG, "Store another frag (%lu) - now %d\n", in nat_LayerPull()
555 (unsigned long)((struct ip *)fptr)->ip_id, ++gfrags); in nat_LayerPull()
561 last = &bp->m_nextpkt; in nat_LayerPull()
566 len = ntohs(((struct ip *)fptr)->ip_len); in nat_LayerPull()
570 last = &(*last)->m_nextpkt; in nat_LayerPull()
572 gfrags -= nfrags; in nat_LayerPull()
573 log_Printf(LogDEBUG, "Found a frag header (%lu) - plus %d more frags (no" in nat_LayerPull()
574 "w %d)\n", (unsigned long)((struct ip *)MBUF_CTOP(bp))->ip_id, in nat_LayerPull()
585 PacketCheck(bundle, AF_INET, MBUF_CTOP(bp), bp->m_len, NULL, in nat_LayerPull()