Lines Matching defs:nat

438 /*              nat(I) - pointer to NAT entry                               */
448 ipf_nat6_newmap(fr_info_t *fin, nat_t *nat, natinfo_t *ni)
469 flags = nat->nat_flags;
500 nat->nat_hm = hm;
689 nat->nat_osrc6 = fin->fin_src6;
690 nat->nat_nsrc6 = in;
691 nat->nat_odst6 = fin->fin_dst6;
692 nat->nat_ndst6 = fin->fin_dst6;
693 if (nat->nat_hm == NULL)
694 nat->nat_hm = ipf_nat6_hostmap(softn, np, &fin->fin_src6,
696 &nat->nat_nsrc6, 0);
699 nat->nat_osport = sport;
700 nat->nat_nsport = port; /* sport */
701 nat->nat_odport = dport;
702 nat->nat_ndport = dport;
705 nat->nat_oicmpid = fin->fin_data[1];
707 nat->nat_nicmpid = port;
718 /* nat(I) - pointer to NAT entry */
726 ipf_nat6_newrdr(fr_info_t *fin, nat_t *nat, natinfo_t *ni)
746 flags = nat->nat_flags;
891 nat->nat_ndst6 = in;
892 nat->nat_odst6 = fin->fin_dst6;
893 nat->nat_nsrc6 = fin->fin_src6;
894 nat->nat_osrc6 = fin->fin_src6;
895 if ((nat->nat_hm == NULL) && ((np->in_flags & IPN_STICKY) != 0))
896 nat->nat_hm = ipf_nat6_hostmap(softn, np, &fin->fin_src6,
901 nat->nat_odport = dport;
902 nat->nat_ndport = nport;
903 nat->nat_osport = sport;
904 nat->nat_nsport = sport;
907 nat->nat_oicmpid = fin->fin_data[1];
909 nat->nat_nicmpid = nport;
944 nat_t *nat, *natl;
973 /* Give me a new nat */
974 KMALLOC(nat, nat_t *);
975 if (nat == NULL) {
1010 bzero((char *)nat, sizeof(*nat));
1011 nat->nat_flags = flags;
1012 nat->nat_redir = np->in_redir;
1013 nat->nat_dir = direction;
1014 nat->nat_pr[0] = fin->fin_p;
1015 nat->nat_pr[1] = fin->fin_p;
1022 move = ipf_nat6_newdivert(fin, nat, &ni);
1025 move = ipf_nat6_newrewrite(fin, nat, &ni);
1037 KFREE(nat);
1038 nat = natl;
1042 move = ipf_nat6_newmap(fin, nat, &ni);
1051 KFREE(nat);
1052 nat = natl;
1056 move = ipf_nat6_newrdr(fin, nat, &ni);
1063 nat->nat_mssclamp = np->in_mssclamp;
1064 nat->nat_me = natsave;
1065 nat->nat_fr = fin->fin_fr;
1066 nat->nat_rev = fin->fin_rev;
1067 nat->nat_ptr = np;
1068 nat->nat_dlocal = np->in_dlocal;
1070 if ((np->in_apr != NULL) && ((nat->nat_flags & NAT_SLAVE) == 0)) {
1071 if (ipf_proxy_new(fin, nat) == -1) {
1077 nat->nat_ifps[0] = np->in_ifps[0];
1079 COPYIFNAME(np->in_v[0], np->in_ifps[0], nat->nat_ifnames[0]);
1082 nat->nat_ifps[1] = np->in_ifps[1];
1084 COPYIFNAME(np->in_v[1], np->in_ifps[1], nat->nat_ifnames[1]);
1087 if (ipf_nat6_finalise(fin, nat) == -1) {
1105 softn->ipf_nat_stats.ns_proto[nat->nat_pr[0]]++;
1110 if ((hm = nat->nat_hm) != NULL)
1112 KFREE(nat);
1113 nat = NULL;
1115 if (nat != NULL && np != NULL)
1118 *natsave = nat;
1119 return nat;
1127 /* nat(I) - pointer to NAT entry */
1135 ipf_nat6_finalise(fr_info_t *fin, nat_t *nat)
1145 sum1 = LONG_SUM6(&nat->nat_osrc6);
1146 sum1 += ntohs(nat->nat_oicmpid);
1147 sum2 = LONG_SUM6(&nat->nat_nsrc6);
1148 sum2 += ntohs(nat->nat_nicmpid);
1150 nat->nat_sumd[0] = (sumd & 0xffff) + (sumd >> 16);
1152 sum1 = LONG_SUM6(&nat->nat_odst6);
1153 sum2 = LONG_SUM6(&nat->nat_ndst6);
1155 nat->nat_sumd[0] += (sumd & 0xffff) + (sumd >> 16);
1160 sum1 = LONG_SUM6(&nat->nat_osrc6);
1161 sum1 += ntohs(nat->nat_osport);
1162 sum2 = LONG_SUM6(&nat->nat_nsrc6);
1163 sum2 += ntohs(nat->nat_nsport);
1165 nat->nat_sumd[0] = (sumd & 0xffff) + (sumd >> 16);
1167 sum1 = LONG_SUM6(&nat->nat_odst6);
1168 sum1 += ntohs(nat->nat_odport);
1169 sum2 = LONG_SUM6(&nat->nat_ndst6);
1170 sum2 += ntohs(nat->nat_ndport);
1172 nat->nat_sumd[0] += (sumd & 0xffff) + (sumd >> 16);
1176 sum1 = LONG_SUM6(&nat->nat_osrc6);
1177 sum2 = LONG_SUM6(&nat->nat_nsrc6);
1179 nat->nat_sumd[0] = (sumd & 0xffff) + (sumd >> 16);
1181 sum1 = LONG_SUM6(&nat->nat_odst6);
1182 sum2 = LONG_SUM6(&nat->nat_ndst6);
1184 nat->nat_sumd[0] += (sumd & 0xffff) + (sumd >> 16);
1193 if (nat->nat_dir == NAT_OUTBOUND) {
1194 sum1 = LONG_SUM6(&nat->nat_nsrc6);
1195 sum1 += LONG_SUM6(&nat->nat_ndst6);
1197 sum1 = LONG_SUM6(&nat->nat_osrc6);
1198 sum1 += LONG_SUM6(&nat->nat_odst6);
1200 sum1 += nat->nat_pr[1];
1201 nat->nat_sumd[1] = (sum1 & 0xffff) + (sum1 >> 16);
1203 if ((nat->nat_flags & SI_CLONE) == 0)
1204 nat->nat_sync = ipf_sync_new(softc, SMC_NAT, fin, nat);
1206 if ((nat->nat_ifps[0] != NULL) && (nat->nat_ifps[0] != (void *)-1)) {
1207 nat->nat_mtu[0] = GETIFMTU_6(nat->nat_ifps[0]);
1210 if ((nat->nat_ifps[1] != NULL) && (nat->nat_ifps[1] != (void *)-1)) {
1211 nat->nat_mtu[1] = GETIFMTU_6(nat->nat_ifps[1]);
1214 nat->nat_v[0] = 6;
1215 nat->nat_v[1] = 6;
1217 if (ipf_nat6_insert(softc, softn, nat) == 0) {
1219 ipf_nat_log(softc, softn, nat, NL_NEW);
1220 fr = nat->nat_fr;
1233 if (nat->nat_sync != NULL)
1234 ipf_sync_del_nat(softc->ipf_sync_soft, nat->nat_sync);
1244 /* nat(I) - pointer to NAT structure */
1251 ipf_nat6_insert(ipf_main_softc_t *softc, ipf_nat_softc_t *softn, nat_t *nat)
1261 if ((nat->nat_flags & (SI_W_SPORT|SI_W_DPORT)) == 0) {
1262 if ((nat->nat_flags & IPN_TCPUDP) != 0) {
1263 sp = nat->nat_osport;
1264 dp = nat->nat_odport;
1265 } else if ((nat->nat_flags & IPN_ICMPQUERY) != 0) {
1267 dp = nat->nat_oicmpid;
1272 hv0 = NAT_HASH_FN6(&nat->nat_osrc6, sp, 0xffffffff);
1273 hv0 = NAT_HASH_FN6(&nat->nat_odst6, hv0 + dp,
1281 if ((nat->nat_flags & IPN_TCPUDP) != 0) {
1282 sp = nat->nat_nsport;
1283 dp = nat->nat_ndport;
1284 } else if ((nat->nat_flags & IPN_ICMPQUERY) != 0) {
1286 dp = nat->nat_nicmpid;
1291 hv1 = NAT_HASH_FN6(&nat->nat_nsrc6, sp, 0xffffffff);
1292 hv1 = NAT_HASH_FN6(&nat->nat_ndst6, hv1 + dp,
1299 hv0 = NAT_HASH_FN6(&nat->nat_osrc6, 0, 0xffffffff);
1300 hv0 = NAT_HASH_FN6(&nat->nat_odst6, hv0,
1304 hv1 = NAT_HASH_FN6(&nat->nat_nsrc6, 0, 0xffffffff);
1305 hv1 = NAT_HASH_FN6(&nat->nat_ndst6, hv1,
1310 if ((nat->nat_dir & NAT_OUTBOUND) == NAT_OUTBOUND) {
1311 nat->nat_hv[0] = hv0;
1312 nat->nat_hv[1] = hv1;
1314 nat->nat_hv[0] = hv1;
1315 nat->nat_hv[1] = hv0;
1318 MUTEX_INIT(&nat->nat_lock, "nat entry lock");
1320 in = nat->nat_ptr;
1321 nat->nat_ref = nat->nat_me ? 2 : 1;
1323 nat->nat_ifnames[0][LIFNAMSIZ - 1] = '\0';
1324 nat->nat_ifps[0] = ipf_resolvenic(softc, nat->nat_ifnames[0],
1325 nat->nat_v[0]);
1327 if (nat->nat_ifnames[1][0] != '\0') {
1328 nat->nat_ifnames[1][LIFNAMSIZ - 1] = '\0';
1329 nat->nat_ifps[1] = ipf_resolvenic(softc, nat->nat_ifnames[1],
1330 nat->nat_v[1]);
1336 (void) strncpy(nat->nat_ifnames[1],
1337 nat->nat_ifnames[0], LIFNAMSIZ);
1338 nat->nat_ifnames[1][LIFNAMSIZ - 1] = '\0';
1339 nat->nat_ifps[1] = nat->nat_ifps[0];
1342 if ((nat->nat_ifps[0] != NULL) && (nat->nat_ifps[0] != (void *)-1)) {
1343 nat->nat_mtu[0] = GETIFMTU_6(nat->nat_ifps[0]);
1345 if ((nat->nat_ifps[1] != NULL) && (nat->nat_ifps[1] != (void *)-1)) {
1346 nat->nat_mtu[1] = GETIFMTU_6(nat->nat_ifps[1]);
1349 return ipf_nat_hashtab_add(softc, softn, nat);
1360 /* ICMP query nat entry. It is assumed that the packet is already of the */
1374 nat_t *nat;
1455 nat = ipf_nat6_inlookup(fin, flags, p,
1459 nat = ipf_nat6_outlookup(fin, flags, p,
1464 return nat;
1483 nat = ipf_nat6_inlookup(fin, flags, p, &oip6->ip6_dst,
1486 nat = ipf_nat6_outlookup(fin, flags, p, &oip6->ip6_dst,
1491 return nat;
1494 nat = ipf_nat6_inlookup(fin, 0, p, &oip6->ip6_dst,
1497 nat = ipf_nat6_outlookup(fin, 0, p, &oip6->ip6_dst,
1500 return nat;
1566 nat_t *nat;
1577 if ((fin->fin_v != 6) || !(nat = ipf_nat6_icmperrorlookup(fin, dir))) {
1675 if (((fin->fin_out == 0) && ((nat->nat_redir & NAT_MAP) != 0)) ||
1676 ((fin->fin_out == 1) && ((nat->nat_redir & NAT_REDIRECT) != 0))) {
1677 a1 = nat->nat_osrc6;
1679 a3 = nat->nat_odst6;
1685 a1 = nat->nat_ndst6;
1687 a3 = nat->nat_nsrc6;
1735 sum1 = ntohs(nat->nat_osport);
1737 sum3 = ntohs(nat->nat_odport);
1743 sum1 = ntohs(nat->nat_ndport);
1745 sum3 = ntohs(nat->nat_nsport);
1811 if (orgicmp->icmp6_id != nat->nat_osport) {
1826 sum2 = ntohs(nat->nat_osport);
1828 orgicmp->icmp6_id = nat->nat_oicmpid;
1833 return nat;
1859 /* Lookup a nat entry based on the mapped destination ip address/port and */
1878 nat_t *nat;
1912 nat = softn->ipf_nat_table[1][hv];
1913 /* TRACE dst, dport, src, sport, hv, nat */
1915 for (; nat; nat = nat->nat_hnext[1]) {
1916 if (nat->nat_ifps[0] != NULL) {
1917 if ((ifp != NULL) && (ifp != nat->nat_ifps[0]))
1921 if (nat->nat_pr[0] != p)
1924 switch (nat->nat_dir)
1927 if (nat->nat_v[0] != 6)
1929 if (IP6_NEQ(&nat->nat_osrc6, src) ||
1930 IP6_NEQ(&nat->nat_odst6, &dst))
1932 if ((nat->nat_flags & IPN_TCPUDP) != 0) {
1933 if (nat->nat_osport != sport)
1935 if (nat->nat_odport != dport)
1939 if (nat->nat_osport != dport) {
1945 if (nat->nat_v[1] != 6)
1947 if (IP6_NEQ(&nat->nat_ndst6, src) ||
1948 IP6_NEQ(&nat->nat_nsrc6, &dst))
1950 if ((nat->nat_flags & IPN_TCPUDP) != 0) {
1951 if (nat->nat_ndport != sport)
1953 if (nat->nat_nsport != dport)
1957 if (nat->nat_osport != dport) {
1965 if ((nat->nat_flags & IPN_TCPUDP) != 0) {
1967 if ((nat->nat_ptr != NULL) && (nat->nat_aps != NULL))
1968 if (appr_match(fin, nat) != 0)
1972 if ((nat->nat_ifps[0] == NULL) && (ifp != NULL)) {
1973 nat->nat_ifps[0] = ifp;
1974 nat->nat_mtu[0] = GETIFMTU_6(ifp);
1976 return nat;
2002 nat = softn->ipf_nat_table[1][hv];
2003 /* TRACE dst, src, hv, nat */
2004 for (; nat; nat = nat->nat_hnext[1]) {
2005 if (nat->nat_ifps[0] != NULL) {
2006 if ((ifp != NULL) && (ifp != nat->nat_ifps[0]))
2010 if (nat->nat_pr[0] != fin->fin_p)
2013 switch (nat->nat_dir)
2016 if (nat->nat_v[0] != 6)
2018 if (IP6_NEQ(&nat->nat_osrc6, src) ||
2019 IP6_NEQ(&nat->nat_odst6, &dst))
2023 if (nat->nat_v[1] != 6)
2025 if (IP6_NEQ(&nat->nat_ndst6, src) ||
2026 IP6_NEQ(&nat->nat_nsrc6, &dst))
2031 nflags = nat->nat_flags;
2035 if (ipf_nat_wildok(nat, (int)sport, (int)dport, nflags,
2040 nat = ipf_nat_clone(fin, nat);
2041 if (nat == NULL)
2049 if (nat->nat_dir == NAT_INBOUND) {
2050 if (nat->nat_osport == 0) {
2051 nat->nat_osport = sport;
2052 nat->nat_nsport = sport;
2054 if (nat->nat_odport == 0) {
2055 nat->nat_odport = dport;
2056 nat->nat_ndport = dport;
2059 if (nat->nat_osport == 0) {
2060 nat->nat_osport = dport;
2061 nat->nat_nsport = dport;
2063 if (nat->nat_odport == 0) {
2064 nat->nat_odport = sport;
2065 nat->nat_ndport = sport;
2068 if ((nat->nat_ifps[0] == NULL) && (ifp != NULL)) {
2069 nat->nat_ifps[0] = ifp;
2070 nat->nat_mtu[0] = GETIFMTU_6(ifp);
2072 nat->nat_flags &= ~(SI_W_DPORT|SI_W_SPORT);
2073 ipf_nat6_tabmove(softn, nat);
2080 if (nat == NULL) {
2083 return nat;
2090 /* Parameters: nat(I) - pointer to NAT structure */
2098 ipf_nat6_tabmove(ipf_nat_softc_t *softn, nat_t *nat)
2103 if (nat->nat_flags & SI_CLONE)
2109 if (nat->nat_hnext[0])
2110 nat->nat_hnext[0]->nat_phnext[0] = nat->nat_phnext[0];
2111 *nat->nat_phnext[0] = nat->nat_hnext[0];
2112 softn->ipf_nat_stats.ns_side[0].ns_bucketlen[nat->nat_hv[0]]--;
2114 if (nat->nat_hnext[1])
2115 nat->nat_hnext[1]->nat_phnext[1] = nat->nat_phnext[1];
2116 *nat->nat_phnext[1] = nat->nat_hnext[1];
2117 softn->ipf_nat_stats.ns_side[1].ns_bucketlen[nat->nat_hv[1]]--;
2122 rhv0 = NAT_HASH_FN6(&nat->nat_osrc6, nat->nat_osport, 0xffffffff);
2123 rhv0 = NAT_HASH_FN6(&nat->nat_odst6, rhv0 + nat->nat_odport,
2125 rhv1 = NAT_HASH_FN6(&nat->nat_nsrc6, nat->nat_nsport, 0xffffffff);
2126 rhv1 = NAT_HASH_FN6(&nat->nat_ndst6, rhv1 + nat->nat_ndport,
2129 if ((nat->nat_dir & NAT_OUTBOUND) == NAT_OUTBOUND) {
2130 nat->nat_hv[0] = rhv0;
2131 nat->nat_hv[1] = rhv1;
2133 nat->nat_hv[0] = rhv1;
2134 nat->nat_hv[1] = rhv0;
2137 hv0 = nat->nat_hv[0] % softn->ipf_nat_table_sz;
2138 hv1 = nat->nat_hv[1] % softn->ipf_nat_table_sz;
2145 (*natp)->nat_phnext[0] = &nat->nat_hnext[0];
2146 nat->nat_phnext[0] = natp;
2147 nat->nat_hnext[0] = *natp;
2148 *natp = nat;
2153 (*natp)->nat_phnext[1] = &nat->nat_hnext[1];
2154 nat->nat_phnext[1] = natp;
2155 nat->nat_hnext[1] = *natp;
2156 *natp = nat;
2172 /* Lookup a nat entry based on the source 'real' ip address/port and */
2191 nat_t *nat;
2221 nat = softn->ipf_nat_table[0][hv];
2223 /* TRACE src, sport, dst, dport, hv, nat */
2225 for (; nat; nat = nat->nat_hnext[0]) {
2226 if (nat->nat_ifps[1] != NULL) {
2227 if ((ifp != NULL) && (ifp != nat->nat_ifps[1]))
2231 if (nat->nat_pr[1] != p)
2234 switch (nat->nat_dir)
2237 if (nat->nat_v[1] != 6)
2239 if (IP6_NEQ(&nat->nat_ndst6, src) ||
2240 IP6_NEQ(&nat->nat_nsrc6, dst))
2243 if ((nat->nat_flags & IPN_TCPUDP) != 0) {
2244 if (nat->nat_ndport != sport)
2246 if (nat->nat_nsport != dport)
2250 if (nat->nat_osport != dport) {
2256 if (nat->nat_v[0] != 6)
2258 if (IP6_NEQ(&nat->nat_osrc6, src) ||
2259 IP6_NEQ(&nat->nat_odst6, dst))
2262 if ((nat->nat_flags & IPN_TCPUDP) != 0) {
2263 if (nat->nat_odport != dport)
2265 if (nat->nat_osport != sport)
2269 if (nat->nat_osport != dport) {
2277 if ((nat->nat_ptr != NULL) && (nat->nat_aps != NULL))
2278 if (appr_match(fin, nat) != 0)
2282 if ((nat->nat_ifps[1] == NULL) && (ifp != NULL)) {
2283 nat->nat_ifps[1] = ifp;
2284 nat->nat_mtu[1] = GETIFMTU_6(ifp);
2286 return nat;
2313 nat = softn->ipf_nat_table[0][hv];
2314 for (; nat; nat = nat->nat_hnext[0]) {
2315 if (nat->nat_ifps[1] != NULL) {
2316 if ((ifp != NULL) && (ifp != nat->nat_ifps[1]))
2320 if (nat->nat_pr[1] != fin->fin_p)
2323 switch (nat->nat_dir)
2326 if (nat->nat_v[1] != 6)
2328 if (IP6_NEQ(&nat->nat_ndst6, src) ||
2329 IP6_NEQ(&nat->nat_nsrc6, dst))
2333 if (nat->nat_v[0] != 6)
2335 if (IP6_NEQ(&nat->nat_osrc6, src) ||
2336 IP6_NEQ(&nat->nat_odst6, dst))
2341 if (!(nat->nat_flags & (NAT_TCPUDP|SI_WILDP)))
2344 if (ipf_nat_wildok(nat, (int)sport, (int)dport, nat->nat_flags,
2348 if ((nat->nat_flags & SI_CLONE) != 0) {
2349 nat = ipf_nat_clone(fin, nat);
2350 if (nat == NULL)
2358 if (nat->nat_dir == NAT_OUTBOUND) {
2359 if (nat->nat_osport == 0) {
2360 nat->nat_osport = sport;
2361 nat->nat_nsport = sport;
2363 if (nat->nat_odport == 0) {
2364 nat->nat_odport = dport;
2365 nat->nat_ndport = dport;
2368 if (nat->nat_osport == 0) {
2369 nat->nat_osport = dport;
2370 nat->nat_nsport = dport;
2372 if (nat->nat_odport == 0) {
2373 nat->nat_odport = sport;
2374 nat->nat_ndport = sport;
2377 if ((nat->nat_ifps[1] == NULL) && (ifp != NULL)) {
2378 nat->nat_ifps[1] = ifp;
2379 nat->nat_mtu[1] = GETIFMTU_6(ifp);
2381 nat->nat_flags &= ~(SI_W_DPORT|SI_W_SPORT);
2382 ipf_nat6_tabmove(softn, nat);
2389 if (nat == NULL) {
2392 return nat;
2420 nat_t *nat;
2444 if ((nat = ipf_nat6_inlookup(&fi, np->nl_flags, fi.fin_p,
2447 np->nl_inip6 = nat->nat_odst6.in6;
2448 np->nl_inport = nat->nat_odport;
2455 if ((nat = ipf_nat6_outlookup(&fi, np->nl_flags, fi.fin_p,
2461 fin.fin_p = nat->nat_pr[0];
2462 fin.fin_data[0] = ntohs(nat->nat_ndport);
2463 fin.fin_data[1] = ntohs(nat->nat_nsport);
2466 &nat->nat_ndst6.in6,
2467 &nat->nat_nsrc6.in6) !=
2473 np->nl_realip6 = nat->nat_odst6.in6;
2474 np->nl_realport = nat->nat_odport;
2478 return nat;
2574 nat_t *nat;
2632 (nat = ipf_nat6_icmperror(fin, &nflags, NAT_OUTBOUND)))
2634 else if ((fin->fin_flx & FI_FRAG) && (nat = ipf_frag_natknown(fin)))
2636 else if ((nat = ipf_nat6_outlookup(fin, nflags|NAT_SEARCH,
2640 nflags = nat->nat_flags;
2646 * If there is no current entry in the nat table for this IP#,
2699 nat = ipf_nat6_add(fin, np, NULL, nflags, NAT_OUTBOUND);
2701 if (nat != NULL) {
2713 if (nat != NULL) {
2714 rval = ipf_nat6_out(fin, nat, natadd, nflags);
2716 MUTEX_ENTER(&nat->nat_lock);
2717 ipf_nat_update(fin, nat);
2718 nat->nat_bytes[1] += fin->fin_plen;
2719 nat->nat_pkts[1]++;
2720 MUTEX_EXIT(&nat->nat_lock);
2754 /* nat(I) - pointer to NAT structure */
2761 ipf_nat6_out(fr_info_t *fin, nat_t *nat, int natadd, u_32_t nflags)
2773 np = nat->nat_ptr;
2776 (void) ipf_frag_natnew(softc, fin, 0, nat);
2784 switch (nat->nat_dir)
2787 fin->fin_ip6->ip6_src = nat->nat_nsrc6.in6;
2788 fin->fin_src6 = nat->nat_nsrc6;
2789 fin->fin_ip6->ip6_dst = nat->nat_ndst6.in6;
2790 fin->fin_dst6 = nat->nat_ndst6;
2794 fin->fin_ip6->ip6_src = nat->nat_odst6.in6;
2795 fin->fin_src6 = nat->nat_ndst6;
2796 fin->fin_ip6->ip6_dst = nat->nat_osrc6.in6;
2797 fin->fin_dst6 = nat->nat_nsrc6;
2804 skip = ipf_nat6_decap(fin, nat);
2824 MUTEX_ENTER(&nat->nat_lock);
2825 ipf_nat_update(fin, nat);
2826 MUTEX_EXIT(&nat->nat_lock);
2871 if ((nat->nat_nsport != 0) && (nflags & IPN_TCPUDP)) {
2874 switch (nat->nat_dir)
2877 tcp->th_sport = nat->nat_nsport;
2878 fin->fin_data[0] = ntohs(nat->nat_nsport);
2879 tcp->th_dport = nat->nat_ndport;
2880 fin->fin_data[1] = ntohs(nat->nat_ndport);
2884 tcp->th_sport = nat->nat_odport;
2885 fin->fin_data[0] = ntohs(nat->nat_odport);
2886 tcp->th_dport = nat->nat_osport;
2887 fin->fin_data[1] = ntohs(nat->nat_osport);
2892 if ((nat->nat_nsport != 0) && (nflags & IPN_ICMPQUERY)) {
2894 icmp6->icmp6_id = nat->nat_nicmpid;
2897 csump = ipf_nat_proto(fin, nat, nflags);
2904 if (nat->nat_dir == NAT_OUTBOUND)
2906 nat->nat_sumd[0],
2907 nat->nat_sumd[1] +
2911 nat->nat_sumd[0],
2912 nat->nat_sumd[1] +
2917 ipf_sync_update(softc, SMC_NAT, fin, nat->nat_sync);
2929 i = ipf_proxy_check(fin, nat);
2973 nat_t *nat;
3033 (nat = ipf_nat6_icmperror(fin, &nflags, NAT_INBOUND)))
3035 else if ((fin->fin_flx & FI_FRAG) && (nat = ipf_frag_natknown(fin)))
3037 else if ((nat = ipf_nat6_inlookup(fin, nflags|NAT_SEARCH,
3040 nflags = nat->nat_flags;
3046 * If there is no current entry in the nat table for this IP#,
3099 nat = ipf_nat6_add(fin, np, NULL, nflags, NAT_INBOUND);
3101 if (nat != NULL) {
3113 if (nat != NULL) {
3114 rval = ipf_nat6_in(fin, nat, natadd, nflags);
3116 MUTEX_ENTER(&nat->nat_lock);
3117 ipf_nat_update(fin, nat);
3118 nat->nat_bytes[0] += fin->fin_plen;
3119 nat->nat_pkts[0]++;
3120 MUTEX_EXIT(&nat->nat_lock);
3154 /* nat(I) - pointer to NAT structure */
3162 ipf_nat6_in(fr_info_t *fin, nat_t *nat, int natadd, u_32_t nflags)
3175 np = nat->nat_ptr;
3176 fin->fin_fr = nat->nat_fr;
3180 (void) ipf_frag_natnew(softc, fin, 0, nat);
3193 i = ipf_proxy_check(fin, nat);
3201 ipf_sync_update(softc, SMC_NAT, fin, nat->nat_sync);
3214 switch (nat->nat_dir)
3218 fin->fin_ip6->ip6_src = nat->nat_nsrc6.in6;
3219 fin->fin_src6 = nat->nat_nsrc6;
3221 fin->fin_ip6->ip6_dst = nat->nat_ndst6.in6;
3222 fin->fin_dst6 = nat->nat_ndst6;
3227 fin->fin_ip6->ip6_src = nat->nat_odst6.in6;
3228 fin->fin_src6 = nat->nat_odst6;
3230 fin->fin_ip6->ip6_dst = nat->nat_osrc6.in6;
3231 fin->fin_dst6 = nat->nat_osrc6;
3267 skip = ipf_nat6_decap(fin, nat);
3287 ipf_nat_update(fin, nat);
3299 if ((nat->nat_odport != 0) && (nflags & IPN_TCPUDP)) {
3300 switch (nat->nat_dir)
3303 tcp->th_sport = nat->nat_nsport;
3304 fin->fin_data[0] = ntohs(nat->nat_nsport);
3305 tcp->th_dport = nat->nat_ndport;
3306 fin->fin_data[1] = ntohs(nat->nat_ndport);
3310 tcp->th_sport = nat->nat_odport;
3311 fin->fin_data[0] = ntohs(nat->nat_odport);
3312 tcp->th_dport = nat->nat_osport;
3313 fin->fin_data[1] = ntohs(nat->nat_osport);
3319 if ((nat->nat_odport != 0) && (nflags & IPN_ICMPQUERY)) {
3322 icmp6->icmp6_id = nat->nat_nicmpid;
3325 csump = ipf_nat_proto(fin, nat, nflags);
3332 if (nat->nat_dir == NAT_OUTBOUND)
3333 ipf_fix_incksum(0, csump, nat->nat_sumd[0], 0);
3335 ipf_fix_outcksum(0, csump, nat->nat_sumd[0], 0);
3349 /* nat(I) - pointer to NAT entry */
3363 ipf_nat6_newrewrite(fr_info_t *fin, nat_t *nat, natinfo_t *nai)
3378 flags = nat->nat_flags;
3381 nat->nat_hm = NULL;
3555 nat->nat_osrc6 = fin->fin_src6;
3556 nat->nat_odst6 = fin->fin_dst6;
3557 nat->nat_nsrc6 = frnat.fin_src6;
3558 nat->nat_ndst6 = frnat.fin_dst6;
3561 nat->nat_osport = htons(fin->fin_data[0]);
3562 nat->nat_odport = htons(fin->fin_data[1]);
3563 nat->nat_nsport = htons(frnat.fin_data[0]);
3564 nat->nat_ndport = htons(frnat.fin_data[1]);
3566 nat->nat_oicmpid = fin->fin_data[1];
3567 nat->nat_nicmpid = frnat.fin_data[1];
3578 /* nat(I) - pointer to NAT entry */
3589 ipf_nat6_newdivert(fr_info_t *fin, nat_t *nat, natinfo_t *nai)
3601 nat->nat_pr[0] = 0;
3602 nat->nat_osrc6 = fin->fin_src6;
3603 nat->nat_odst6 = fin->fin_dst6;
3604 nat->nat_osport = htons(fin->fin_data[0]);
3605 nat->nat_odport = htons(fin->fin_data[1]);
3633 nat->nat_nsrc6 = frnat.fin_src6;
3634 nat->nat_ndst6 = frnat.fin_dst6;
3636 nat->nat_nsport = htons(frnat.fin_data[0]);
3637 nat->nat_ndport = htons(frnat.fin_data[1]);
3639 nat->nat_pr[fin->fin_out] = fin->fin_p;
3640 nat->nat_pr[1 - fin->fin_out] = p;
3643 nat->nat_dir = NAT_DIVERTIN;
3645 nat->nat_dir = NAT_DIVERTOUT;
3712 /* nat(I) - pointer to current NAT session */
3724 ipf_nat6_decap(fr_info_t *fin, nat_t *nat)
3739 switch (nat->nat_dir)