33#include <sys/kernel.h>
35#include <sys/malloc.h>
38#include <sys/syslog.h>
40#include <netinet/in_systm.h>
41#include <netinet/in.h>
42#include <netinet/ip.h>
43#include <netinet/ip_var.h>
44#include <netinet/tcp.h>
45#include <machine/in_cksum.h>
48#include <net/ethernet.h>
50#include <netinet/libalias/alias.h>
51#include <netinet/libalias/alias_local.h>
126 const u_char *start,
const u_char *buf)
282 struct alias_link *lnk;
302#define NGNAT_CONNECTED 0x1
303#define NGNAT_ADDR_DEFINED 0x2
311 priv = malloc(
sizeof(*
priv), M_NETGRAPH, M_WAITOK | M_ZERO);
314 priv->lib = LibAliasInit(NULL);
317 (void )LibAliasSetMode(
priv->lib, PKT_ALIAS_SAME_PORTS,
318 PKT_ALIAS_SAME_PORTS);
324 STAILQ_INIT(&
priv->redirhead);
351 if (
priv->out != NULL &&
373 struct in_addr *
const ia = (
struct in_addr *)msg->
data;
380 LibAliasSetAddress(
priv->lib, *ia);
395 if (LibAliasSetMode(
priv->lib,
405 struct in_addr *
const ia = (
struct in_addr *)msg->
data;
412 LibAliasSetTarget(
priv->lib, *ia);
427 M_NETGRAPH, M_NOWAIT | M_ZERO)) == NULL) {
433 entry->lnk = LibAliasRedirectPort(
priv->lib,
439 if (entry->lnk == NULL) {
441 free(entry, M_NETGRAPH);
452 entry->rdr.proto = rp->
proto;
459 entry->rdr.id =
priv->nextid++;
463 STAILQ_INSERT_TAIL(&
priv->redirhead, entry, entries);
471 bcopy(&entry->rdr.id, resp->
data,
sizeof(entry->rdr.id));
486 M_NETGRAPH, M_NOWAIT | M_ZERO)) == NULL) {
492 entry->lnk = LibAliasRedirectAddr(
priv->lib,
495 if (entry->lnk == NULL) {
497 free(entry, M_NETGRAPH);
511 entry->rdr.id =
priv->nextid++;
515 STAILQ_INSERT_TAIL(&
priv->redirhead, entry, entries);
523 bcopy(&entry->rdr.id, resp->
data,
sizeof(entry->rdr.id));
538 M_NETGRAPH, M_NOWAIT | M_ZERO)) == NULL) {
544 entry->lnk = LibAliasRedirectProto(
priv->lib,
548 if (entry->lnk == NULL) {
550 free(entry, M_NETGRAPH);
558 entry->rdr.proto = rp->
proto;
565 entry->rdr.id =
priv->nextid++;
569 STAILQ_INSERT_TAIL(&
priv->redirhead, entry, entries);
577 bcopy(&entry->rdr.id, resp->
data,
sizeof(entry->rdr.id));
584 uint32_t *
const id = (uint32_t *)msg->
data;
592 STAILQ_FOREACH(entry, &
priv->redirhead, entries) {
593 if (entry->rdr.id == *
id)
604 if (LibAliasRedirectDynamic(
priv->lib,
610 LibAliasRedirectDelete(
priv->lib, entry->lnk);
616 free(entry, M_NETGRAPH);
631 STAILQ_FOREACH(entry, &
priv->redirhead, entries) {
632 if (entry->rdr.id == as->
id)
642 if (LibAliasAddServer(
priv->lib, entry->lnk,
658 (
priv->rdrcount) *
sizeof(*entry), M_NOWAIT);
667 STAILQ_FOREACH(entry, &
priv->redirhead, entries) {
682 if (LibAliasProxyRule(
priv->lib,
cmd) != 0)
697#define
COPY(F)
do { \
698 if (
priv->lib->F >= 0 &&
priv->lib->F < UINT32_MAX) \
699 i->F =
priv->lib->F; \
721 switch (*(uint8_t *) msg->
data) {
742 *((uint8_t *) resp->
data) =
priv->dlt;
760 int rval, ipofs, error = 0;
775 if ((m = m_megapullup(m, m->m_pkthdr.len)) == NULL) {
789 struct ether_header *eh;
791 if (m->m_pkthdr.len <
sizeof(
struct ether_header)) {
795 eh = mtod(m,
struct ether_header *);
796 switch (ntohs(eh->ether_type)) {
798 ipofs =
sizeof(
struct ether_header);
806 panic(
"Corrupted priv->dlt: %u",
priv->dlt);
809 if (m->m_pkthdr.len < ipofs +
sizeof(
struct ip))
812 c = (
char *)mtodo(m, ipofs);
813 ip = (
struct ip *)mtodo(m, ipofs);
815 if (ip->ip_v != IPVERSION)
817 if (m->m_pkthdr.len < ipofs + ntohs(ip->ip_len))
828 if (hook ==
priv->in) {
829 rval = LibAliasIn(
priv->lib, c, m->m_len - ipofs +
831 if (rval == PKT_ALIAS_ERROR ||
832 rval == PKT_ALIAS_UNRESOLVED_FRAGMENT ||
833 (rval == PKT_ALIAS_IGNORED &&
834 (
priv->lib->packetAliasMode &
835 PKT_ALIAS_DENY_INCOMING) != 0)) {
839 }
else if (hook ==
priv->out) {
840 rval = LibAliasOut(
priv->lib, c, m->m_len - ipofs +
842 if (rval == PKT_ALIAS_ERROR) {
847 panic(
"ng_nat: unknown hook!\n");
849 if (rval == PKT_ALIAS_RESPOND)
850 m->m_flags |= M_SKIP_FIREWALL;
851 m->m_pkthdr.len = m->m_len = ntohs(ip->ip_len) + ipofs;
853 if ((ip->ip_off & htons(IP_OFFMASK)) == 0 &&
854 ip->ip_p == IPPROTO_TCP) {
855 struct tcphdr *th = (
struct tcphdr *)((caddr_t)ip +
881 uint16_t ip_len = ntohs(ip->ip_len);
884 th->th_sum = in_pseudo(ip->ip_src.s_addr,
885 ip->ip_dst.s_addr, htons(IPPROTO_TCP +
886 ip_len - (ip->ip_hl << 2)));
888 if ((m->m_pkthdr.csum_flags & CSUM_TCP) == 0) {
889 m->m_pkthdr.csum_data = offsetof(
struct tcphdr,
897 if (hook ==
priv->in)
914 while (!STAILQ_EMPTY(&
priv->redirhead)) {
916 STAILQ_REMOVE_HEAD(&
priv->redirhead, entries);
917 free(entry, M_NETGRAPH);
921 LibAliasUninit(
priv->lib);
922 free(
priv, M_NETGRAPH);
932 priv->flags &= ~NGNAT_CONNECTED;
934 if (hook ==
priv->out)
936 if (hook ==
priv->in)
939 if (
priv->out == NULL &&
priv->in == NULL)
948 unsigned int res = 0;
951 res |= PKT_ALIAS_LOG;
953 res |= PKT_ALIAS_DENY_INCOMING;
955 res |= PKT_ALIAS_SAME_PORTS;
957 res |= PKT_ALIAS_UNREGISTERED_ONLY;
959 res |= PKT_ALIAS_RESET_ON_ADDR_CHANGE;
961 res |= PKT_ALIAS_PROXY_ONLY;
963 res |= PKT_ALIAS_REVERSE;
965 res |= PKT_ALIAS_UNREGISTERED_CGN;
#define NG_HOOK_NODE(hook)
int ng_rcvmsg_t(node_p node, item_p item, hook_p lasthook)
#define NG_FWD_ITEM_HOOK(error, item, hook)
int ng_disconnect_t(hook_p hook)
#define NG_NODE_SET_PRIVATE(node, val)
#define NG_RESPOND_MSG(error, here, item, resp)
#define NG_NODE_FORCE_WRITER(node)
#define NG_NODE_UNREF(node)
int ng_rmnode_self(node_p here)
int ng_rcvdata_t(hook_p hook, item_p item)
int ng_shutdown_t(node_p node)
#define NG_FREE_ITEM(item)
int ng_constructor_t(node_p node)
#define NGI_GET_MSG(i, m)
#define NG_NODE_PRIVATE(node)
int ng_newhook_t(node_p node, hook_p hook, const char *name)
#define NG_MKRESPONSE(rsp, msg, len, how)
static const struct ng_parse_array_info ng_nat_listrdrs_ary_info
static const struct ng_parse_struct_field ng_nat_libalias_info_fields[]
struct ng_nat_priv * priv_p
NETGRAPH_INIT(nat, &typestruct)
static unsigned int ng_nat_translate_flags(unsigned int x)
static ng_disconnect_t ng_nat_disconnect
static const struct ng_cmdlist ng_nat_cmdlist[]
static const struct ng_parse_fixedstring_info ng_nat_description_info
static const struct ng_parse_type ng_nat_mode_type
static const struct ng_parse_struct_field ng_nat_list_redirects_fields[]
static ng_rcvdata_t ng_nat_rcvdata
static ng_rcvmsg_t ng_nat_rcvmsg
static const struct ng_parse_type ng_nat_libalias_info_type
static ng_constructor_t ng_nat_constructor
static const struct ng_parse_type ng_nat_listrdrs_ary_type
static const struct ng_parse_type ng_nat_redirect_addr_type
static ng_shutdown_t ng_nat_shutdown
static const struct ng_parse_type ng_nat_redirect_proto_type
static int ng_nat_listrdrs_ary_getLength(const struct ng_parse_type *type, const u_char *start, const u_char *buf)
static const struct ng_parse_struct_field ng_nat_redirect_port_fields[]
static const struct ng_parse_type ng_nat_description_type
static struct ng_type typestruct
static const struct ng_parse_type ng_nat_add_server_type
static const struct ng_parse_struct_field ng_nat_listrdrs_entry_fields[]
static const struct ng_parse_type ng_nat_list_redirects_type
static ng_newhook_t ng_nat_newhook
#define NGNAT_ADDR_DEFINED
static const struct ng_parse_struct_field ng_nat_mode_fields[]
STAILQ_HEAD(rdrhead, ng_nat_rdr_lst)
static const struct ng_parse_struct_field ng_nat_add_server_fields[]
static const struct ng_parse_struct_field ng_nat_redirect_proto_fields[]
static const struct ng_parse_type ng_nat_redirect_port_type
static const struct ng_parse_struct_field ng_nat_redirect_addr_fields[]
static const struct ng_parse_type ng_nat_listrdrs_entry_type
MODULE_DEPEND(ng_nat, libalias, 1, 1, 1)
#define NG_NAT_UNREGISTERED_ONLY
#define NG_NAT_DENY_INCOMING
#define NG_NAT_PROXY_ONLY
#define NG_NAT_REDIRECT_PROTO_TYPE_INFO(desctype)
#define NG_NAT_ADD_SERVER_TYPE_INFO
#define NG_NAT_LISTRDRS_ENTRY_TYPE_INFO(desctype)
#define NG_NAT_REDIRECT_ADDR_TYPE_INFO(desctype)
#define NG_NAT_DESC_LENGTH
#define NG_NAT_UNREGISTERED_CGN
#define NG_NAT_LIBALIAS_INFO
#define NG_NAT_REDIRECT_PORT_TYPE_INFO(desctype)
#define NG_NAT_REDIRPROTO_ADDR
#define NG_NAT_LIST_REDIRECTS_TYPE_INFO(redirtype)
#define NG_NAT_SAME_PORTS
#define NG_NAT_RESET_ON_ADDR_CHANGE
@ NGM_NAT_REDIRECT_DYNAMIC
@ NGM_NAT_REDIRECT_DELETE
const struct ng_parse_type ng_parse_fixedstring_type
const struct ng_parse_type ng_parse_ipaddr_type
const struct ng_parse_type ng_parse_array_type
const struct ng_parse_type ng_parse_string_type
const struct ng_parse_type ng_parse_struct_type
const struct ng_parse_type ng_parse_uint32_type
const struct ng_parse_type ng_parse_uint8_type
struct ng_mesg::ng_msghdr header
uint32_t fragmentPtrLinkCount
uint32_t fragmentIdLinkCount
struct ng_nat_listrdrs_entry redirects[]
struct in_addr alias_addr
struct in_addr local_addr
char description[NG_NAT_DESC_LENGTH]
struct in_addr remote_addr
struct in_addr local_addr
struct in_addr alias_addr
char description[NG_NAT_DESC_LENGTH]
char description[NG_NAT_DESC_LENGTH]
struct in_addr remote_addr
struct in_addr alias_addr
struct in_addr local_addr