117#include <sys/param.h>
118#include <sys/systm.h>
120#include <sys/sysctl.h>
122#include <sys/types.h>
156SYSCTL_NODE(_net_inet_ip, OID_AUTO, alias, CTLFLAG_RW | CTLFLAG_MPSAFE, NULL,
157 "Libalias sysctl API");
166#if BYTE_ORDER == LITTLE_ENDIAN
197 if (th_flags & TH_RST)
199 else if (th_flags & TH_SYN)
203 if (th_flags & (TH_FIN | TH_RST))
214 if (th_flags & TH_RST)
216 else if (th_flags & TH_SYN)
220 if (th_flags & (TH_FIN | TH_RST))
297 ic = (
struct icmp *)ip_next(pip);
308 accumulate = ic->icmp_id;
309 accumulate -= original_id;
313 ic->icmp_id = original_id;
317 struct in_addr original_address;
321 &original_address, &pip->
ip_dst, 2);
322 pip->
ip_dst = original_address;
338 struct icmp *ic, *ic2;
344 ic = (
struct icmp *)ip_next(pip);
348 tc = (
struct tcphdr *)ip_next(
ip);
349 ic2 = (
struct icmp *)ip_next(
ip);
357 tc->th_dport, tc->th_sport,
369 int accumulate, accumulate2;
370 struct in_addr original_address;
371 u_short original_port;
378 accumulate -=
twowords(&original_address);
380 accumulate -= original_port;
381 accumulate2 = accumulate;
389 &original_address, &pip->
ip_dst, 2);
390 pip->
ip_dst = original_address;
395 ip->ip_src = original_address;
398 int accumulate, accumulate2;
399 struct in_addr original_address;
407 accumulate -=
twowords(&original_address);
408 accumulate += ic2->icmp_id;
409 accumulate -= original_id;
410 accumulate2 = accumulate;
418 &original_address, &pip->
ip_dst, 2);
419 pip->
ip_dst = original_address;
423 ip->ip_src = original_address;
424 ic2->icmp_id = original_id;
448 ic = (
struct icmp *)ip_next(pip);
486 ic = (
struct icmp *)ip_next(pip);
497 accumulate = ic->icmp_id;
498 accumulate -= alias_id;
502 ic->icmp_id = alias_id;
510 &alias_address, &pip->ip_src, 2);
511 pip->ip_src = alias_address;
527 struct icmp *ic, *ic2;
533 ic = (
struct icmp *)ip_next(pip);
537 tc = (
struct tcphdr *)ip_next(
ip);
538 ic2 = (
struct icmp *)ip_next(
ip);
546 tc->th_dport, tc->th_sport,
567 accumulate -=
twowords(&alias_address);
569 accumulate -= alias_port;
578 &alias_address, &pip->ip_src, 2);
579 pip->ip_src = alias_address;
595 accumulate -=
twowords(&alias_address);
596 accumulate += ic2->icmp_id;
597 accumulate -= alias_id;
606 &alias_address, &pip->ip_src, 2);
607 pip->ip_src = alias_address;
612 ic2->icmp_id = alias_id;
632 ic = (
struct icmp *)ip_next(pip);
674 struct in_addr original_address;
680 &original_address, &pip->
ip_dst, 2);
681 pip->
ip_dst = original_address;
716 &alias_address, &pip->ip_src, 2);
717 pip->ip_src = alias_address;
724#define MF_ISSET(_pip) (ntohs((_pip)->ip_off) & IP_MF)
725#define FRAG_NO_HDR(_pip) (ntohs((_pip)->ip_off) & IP_OFFMASK)
734 KASSERT(!
FRAG_NO_HDR(pip), (
"header-less fragment isn't expected here"));
737 if (dlen <
sizeof(
struct udphdr))
739 ud = (
struct udphdr *)ip_next(pip);
762 struct in_addr original_address;
770 .oaddr = &original_address,
771 .aaddr = &alias_address,
772 .aport = &alias_port,
795 accumulate = alias_port;
797 accumulate +=
twowords(&alias_address);
798 accumulate -=
twowords(&original_address);
802 if (proxy_port != 0) {
804 accumulate -= proxy_port;
807 if (proxy_address.
s_addr != 0) {
808 accumulate +=
twowords(&pip->ip_src);
809 accumulate -=
twowords(&proxy_address);
820 if (proxy_address.
s_addr != 0) {
822 &proxy_address, &pip->ip_src, 2);
823 pip->ip_src = proxy_address;
828 &original_address, &pip->
ip_dst, 2);
829 pip->
ip_dst = original_address;
842 struct in_addr proxy_server_address;
844 u_short proxy_server_port;
855 proxy_type =
ProxyCheck(la, &proxy_server_address, &proxy_server_port,
863 dest_address = pip->
ip_dst;
865 if (proxy_type != 0) {
869 accumulate -=
twowords(&proxy_server_address);
875 accumulate -=
twowords(&proxy_server_address);
877 accumulate -= proxy_server_port;
880 pip->
ip_dst = proxy_server_address;
892 .aaddr = &alias_address,
893 .aport = &alias_port,
902 if (proxy_type != 0) {
906 ud = (
struct udphdr *)ip_next(pip);
921 accumulate -= alias_port;
922 accumulate +=
twowords(&pip->ip_src);
923 accumulate -=
twowords(&alias_address);
931 &alias_address, &pip->ip_src, 2);
932 pip->ip_src = alias_address;
949 if (dlen <
sizeof(
struct tcphdr))
951 tc = (
struct tcphdr *)ip_next(pip);
954 tc->th_sport, tc->th_dport,
959 struct in_addr original_address;
963 int accumulate, error;
976 .sport = &tc->th_sport,
977 .dport = &tc->th_dport,
987 alias_port = tc->th_dport;
999 .oaddr = &original_address,
1000 .aaddr = &alias_address,
1001 .aport = &alias_port,
1002 .sport = &ud->uh_sport,
1003 .dport = &ud->uh_dport,
1009 if (error == EHDNOF)
1010 printf(
"Protocol handler not found\n");
1015 accumulate = alias_port;
1016 accumulate -= tc->th_dport;
1017 accumulate +=
twowords(&alias_address);
1018 accumulate -=
twowords(&original_address);
1022 if (proxy_port != 0) {
1023 accumulate += tc->th_sport;
1024 tc->th_sport = proxy_port;
1025 accumulate -= tc->th_sport;
1026 accumulate +=
twowords(&pip->ip_src);
1027 accumulate -=
twowords(&proxy_address);
1033 tc = (
struct tcphdr *)ip_next(pip);
1036 accumulate +=
twowords(&tc->th_ack);
1037 tc->th_ack = htonl(ntohl(tc->th_ack) - delta);
1038 accumulate -=
twowords(&tc->th_ack);
1045 pip->
ip_dst = original_address;
1050 if (proxy_address.
s_addr != 0) {
1051 accumulate +=
twowords(&pip->ip_src);
1052 pip->ip_src = proxy_address;
1053 accumulate -=
twowords(&pip->ip_src);
1058 tc = (
struct tcphdr *)ip_next(pip);
1069 int proxy_type, error;
1071 u_short proxy_server_port;
1074 struct in_addr proxy_server_address;
1081 if (dlen <
sizeof(
struct tcphdr))
1083 tc = (
struct tcphdr *)ip_next(pip);
1086 proxy_type =
ProxyCheck(la, &proxy_server_address,
1087 &proxy_server_port, pip->ip_src, pip->
ip_dst,
1088 tc->th_dport, pip->
ip_p);
1097 dest_port = tc->th_dport;
1098 dest_address = pip->
ip_dst;
1099 if (proxy_type != 0) {
1102 accumulate = tc->th_dport;
1103 tc->th_dport = proxy_server_port;
1104 accumulate -= tc->th_dport;
1106 accumulate -=
twowords(&proxy_server_address);
1110 pip->
ip_dst = proxy_server_address;
1115 tc->th_sport, tc->th_dport,
1126 .aaddr = &alias_address,
1127 .aport = &alias_port,
1128 .sport = &tc->th_sport,
1129 .dport = &tc->th_dport,
1130 .maxpktsize = maxpacketsize
1136 if (proxy_type != 0) {
1140 tc = (
struct tcphdr *)ip_next(pip);
1147 tc = (
struct tcphdr *)ip_next(pip);
1155 accumulate = tc->th_sport;
1156 tc->th_sport = alias_port;
1157 accumulate -= tc->th_sport;
1158 accumulate +=
twowords(&pip->ip_src);
1159 accumulate -=
twowords(&alias_address);
1165 tc = (
struct tcphdr *)ip_next(pip);
1168 accumulate +=
twowords(&tc->th_seq);
1169 tc->th_seq = htonl(ntohl(tc->th_seq) + delta);
1170 accumulate -=
twowords(&tc->th_seq);
1176 accumulate =
twowords(&pip->ip_src);
1177 pip->ip_src = alias_address;
1178 accumulate -=
twowords(&pip->ip_src);
1214 struct in_addr original_address;
1218 &original_address, &pip->
ip_dst, 2);
1219 pip->
ip_dst = original_address;
1234 &alias_address, &pip->ip_src, 2);
1235 pip->ip_src = alias_address;
1260 pip = (
struct ip *)ptr;
1279 pip = (
struct ip *)ptr;
1303 pip = (
struct ip *)ptr;
1304 fpip = (
struct ip *)ptr_fragment;
1315 int maxpacketsize,
int create);
1344 alias_addr = pip->
ip_dst;
1347 if (ntohs(pip->
ip_len) > maxpacketsize
1348 || (pip->
ip_hl << 2) > maxpacketsize) {
1360 switch (pip->
ip_p) {
1421#define UNREG_ADDR_A_LOWER 0x0a000000
1422#define UNREG_ADDR_A_UPPER 0x0affffff
1425#define UNREG_ADDR_B_LOWER 0xac100000
1426#define UNREG_ADDR_B_UPPER 0xac1fffff
1429#define UNREG_ADDR_C_LOWER 0xc0a80000
1430#define UNREG_ADDR_C_UPPER 0xc0a8ffff
1433#define UNREG_ADDR_CGN_LOWER 0x64400000
1434#define UNREG_ADDR_CGN_UPPER 0x647fffff
1477 if (ntohs(pip->
ip_len) > maxpacketsize
1478 || (pip->
ip_hl << 2) > maxpacketsize) {
1490 addr = ntohl(pip->ip_src.s_addr);
1510 goto getout_restore;
1514 switch (pip->
ip_p) {
1519 iresult =
UdpAliasOut(la, pip, maxpacketsize, create);
1522 iresult =
TcpAliasOut(la, pip, maxpacketsize, create);
1575 pip = (
struct ip *)ptr;
1578 if (ntohs(pip->
ip_len) > maxpacketsize
1579 || (pip->
ip_hl << 2) > maxpacketsize)
1582 ud = (
struct udphdr *)ip_next(pip);
1583 tc = (
struct tcphdr *)ip_next(pip);
1584 ic = (
struct icmp *)ip_next(pip);
1593 tc->th_dport, tc->th_sport,
1604 struct in_addr original_address;
1605 u_short original_port;
1611 accumulate =
twowords(&pip->ip_src);
1612 accumulate -=
twowords(&original_address);
1616 accumulate -= original_port;
1619 accumulate += tc->th_sport;
1620 accumulate -= original_port;
1626 &original_address, &pip->ip_src, 2);
1629 pip->ip_src = original_address;
1633 tc->th_sport = original_port;
1638 struct in_addr original_address;
1639 u_short original_id;
1645 accumulate =
twowords(&pip->ip_src);
1646 accumulate -=
twowords(&original_address);
1647 accumulate += ic->icmp_id;
1648 accumulate -= original_id;
1653 &original_address, &pip->ip_src, 2);
1656 pip->ip_src = original_address;
1657 ic->icmp_id = original_id;
1672 char buf[256], conf[] =
"/etc/libalias.conf";
1676 fd = fopen(conf,
"r");
1678 err(1,
"fopen(%s)", conf);
1683 fgets(buf, 256, fd);
1688 for (i = 0; i < len; i++)
1689 if (!isspace(buf[i]))
1693 buf[len - 1] =
'\0';
1710 handle = dlopen (path, RTLD_LAZY);
1712 fprintf(stderr,
"%s\n", dlerror());
1716 p = dlsym(handle,
"alias_mod");
1717 if ((error = dlerror()) != NULL) {
1718 fprintf(stderr,
"%s\n", dlerror());
1722 t = malloc(
sizeof(
struct dll));
1725 strncpy(t->name, p->name, DLL_LEN);
1727 if (attach_dll(t) == EEXIST) {
1729 fprintf(stderr,
"dll conflict\n");
1733 m = dlsym(t->handle,
"handlers");
1734 if ((error = dlerror()) != NULL) {
1735 fprintf(stderr,
"%s\n", error);
1753 while ((t = walk_dll_chain()) != NULL) {
1780 if (len > m->m_pkthdr.len)
1783 if (m->m_next == NULL && M_WRITABLE(m))
1786 if (len <= MJUMPAGESIZE)
1787 mcl = m_get2(len, M_NOWAIT, MT_DATA, M_PKTHDR);
1788 else if (len <= MJUM9BYTES)
1789 mcl = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, MJUM9BYTES);
1790 else if (len <= MJUM16BYTES)
1791 mcl = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, MJUM16BYTES);
1797 m_move_pkthdr(mcl, m);
1798 m_copydata(m, 0, len, mtod(mcl, caddr_t));
1799 mcl->m_len = mcl->m_pkthdr.len = len;
static SYSCTL_NODE(_net_inet_accf, OID_AUTO, http, CTLFLAG_RW|CTLFLAG_MPSAFE, 0, "HTTP accept filter")
static int LibAliasOutLocked(struct libalias *la, struct ip *pip, int maxpacketsize, int create)
#define UNREG_ADDR_CGN_LOWER
static int IcmpAliasOut1(struct libalias *, struct ip *, int create)
struct mbuf * m_megapullup(struct mbuf *m, int len)
static int ProtoAliasOut(struct libalias *la, struct ip *pip, struct in_addr ip_dst, u_char ip_p, u_short *ip_sum, int create)
static int UdpAliasOut(struct libalias *, struct ip *, int, int create)
int LibAliasOut(struct libalias *la, void *ptr, int maxpacketsize)
static int TcpAliasIn(struct libalias *, struct ip *)
static __inline int twowords(void *p)
static void TcpMonitorIn(u_char, struct alias_link *)
#define UNREG_ADDR_B_LOWER
#define UNREG_ADDR_A_UPPER
static int IcmpAliasOut2(struct libalias *, struct ip *)
static int IcmpAliasOut(struct libalias *, struct ip *, int create)
void * LibAliasGetFragment(struct libalias *la, void *ptr)
#define UNREG_ADDR_C_LOWER
static struct udphdr * ValidateUdpLength(struct ip *pip)
static int FragmentOut(struct libalias *, struct ip *pip, u_short *ip_sum)
int LibAliasSaveFragment(struct libalias *la, void *ptr)
#define UNREG_ADDR_CGN_UPPER
static int ProtoAliasIn(struct libalias *la, struct in_addr ip_src, struct ip *pip, u_char ip_p, u_short *ip_sum)
static int LibAliasInLocked(struct libalias *la, struct ip *pip, int maxpacketsize)
int LibAliasIn(struct libalias *la, void *ptr, int maxpacketsize)
static int IcmpAliasIn1(struct libalias *, struct ip *)
#define FRAG_NO_HDR(_pip)
void LibAliasFragmentIn(struct libalias *la, void *ptr, void *ptr_fragment)
#define UNREG_ADDR_B_UPPER
#define UNREG_ADDR_A_LOWER
static int IcmpAliasIn2(struct libalias *, struct ip *)
int LibAliasOutTry(struct libalias *la, void *ptr, int maxpacketsize, int create)
static int TcpAliasOut(struct libalias *, struct ip *, int, int create)
static int FragmentIn(struct libalias *la, struct in_addr ip_src, struct ip *pip, u_short ip_id, u_short *ip_sum)
static void TcpMonitorOut(u_char, struct alias_link *)
#define UNREG_ADDR_C_UPPER
int LibAliasUnaliasOut(struct libalias *la, void *ptr, int maxpacketsize)
static int IcmpAliasIn(struct libalias *, struct ip *)
static int UdpAliasIn(struct libalias *, struct ip *)
#define PKT_ALIAS_FOUND_HEADER_FRAGMENT
int LibAliasUnLoadAllModule(void)
int LibAliasRefreshModules(void)
#define PKT_ALIAS_PROXY_ONLY
#define PKT_ALIAS_UNREGISTERED_ONLY
#define PKT_ALIAS_REVERSE
#define PKT_ALIAS_UNREGISTERED_CGN
int LibAliasLoadModule(char *)
#define PKT_ALIAS_UNRESOLVED_FRAGMENT
#define PKT_ALIAS_IGNORED
struct alias_link * FindUdpTcpIn(struct libalias *la, struct in_addr dst_addr, struct in_addr alias_addr, u_short dst_port, u_short alias_port, u_char proto, int create)
void SetFragmentAddr(struct alias_link *lnk, struct in_addr src_addr)
u_short GetAliasPort(struct alias_link *lnk)
struct alias_link * FindProtoIn(struct libalias *la, struct in_addr dst_addr, struct in_addr alias_addr, u_char proto)
void SetProxyAddress(struct alias_link *lnk, struct in_addr addr)
void SetFragmentPtr(struct alias_link *lnk, void *fptr)
int GetAckModified(struct alias_link *lnk)
void SetStateIn(struct alias_link *lnk, int state)
u_short GetProxyPort(struct alias_link *lnk)
int GetDeltaAckIn(u_long ack, struct alias_link *lnk)
void SetStateOut(struct alias_link *lnk, int state)
struct in_addr GetAliasAddress(struct alias_link *lnk)
void SetDefaultAliasAddress(struct libalias *la, struct in_addr alias_addr)
struct alias_link * FindIcmpIn(struct libalias *la, struct in_addr dst_addr, struct in_addr alias_addr, u_short id_alias, int create)
void GetFragmentAddr(struct alias_link *lnk, struct in_addr *src_addr)
struct in_addr FindAliasAddress(struct libalias *la, struct in_addr original_addr)
struct alias_link * FindFragmentIn2(struct libalias *la, struct in_addr dst_addr, struct in_addr alias_addr, u_short ip_id)
struct alias_link * FindFragmentIn1(struct libalias *la, struct in_addr dst_addr, struct in_addr alias_addr, u_short ip_id)
void SetExpire(struct alias_link *lnk, int expire)
struct in_addr GetProxyAddress(struct alias_link *lnk)
struct alias_link * FindIcmpOut(struct libalias *la, struct in_addr src_addr, struct in_addr dst_addr, u_short id, int create)
struct alias_link * FindProtoOut(struct libalias *la, struct in_addr src_addr, struct in_addr dst_addr, u_char proto)
int GetStateOut(struct alias_link *lnk)
void GetFragmentPtr(struct alias_link *lnk, void **fptr)
struct alias_link * AddFragmentPtrLink(struct libalias *la, struct in_addr dst_addr, u_short ip_id)
void HouseKeeping(struct libalias *la)
int GetStateIn(struct alias_link *lnk)
struct in_addr GetOriginalAddress(struct alias_link *lnk)
void SetProxyPort(struct alias_link *lnk, u_short port)
u_short GetOriginalPort(struct alias_link *lnk)
struct alias_link * FindFragmentPtr(struct libalias *la, struct in_addr dst_addr, u_short ip_id)
struct in_addr GetDefaultAliasAddress(struct libalias *la)
int GetDeltaSeqOut(u_long seq, struct alias_link *lnk)
struct alias_link * FindUdpTcpOut(struct libalias *la, struct in_addr src_addr, struct in_addr dst_addr, u_short src_port, u_short dst_port, u_char proto, int create)
#define LIBALIAS_LOCK_ASSERT(l)
int SctpAlias(struct libalias *la, struct ip *ip, int direction)
Handles SCTP packets passed from libalias.
int ProxyCheck(struct libalias *la, struct in_addr *proxy_server_addr, u_short *proxy_server_port, struct in_addr src_addr, struct in_addr dst_addr, u_short dst_port, u_char ip_p)
#define ADJUST_CHECKSUM(acc, cksum)
#define LIBALIAS_UNLOCK(l)
void ProxyModify(struct libalias *la, struct alias_link *_lnk, struct ip *_pip, int _maxpacketsize, int _proxy_type)
@ ALIAS_TCP_STATE_NOT_CONNECTED
@ ALIAS_TCP_STATE_CONNECTED
@ ALIAS_TCP_STATE_DISCONNECTED
void DifferentialChecksum(u_short *_cksum, void *_new, void *_old, int _n)
int LibAliasAttachHandlers(struct proto_handler *p)
int find_handler(int8_t dir, int8_t proto, struct libalias *la, struct ip *ip, struct alias_data *ad)
int LibAliasDetachHandlers(struct proto_handler *p)
struct proto_handler * first_handler(void)
SYSCTL_DECL(_net_inet_tcp_cc)
struct in_addr ip_src ip_dst
#define ICMP_SOURCEQUENCH
struct in_addr alias_addr
struct in_addr ip_src ip_dst