Lines Matching defs:fin

527 /* Parameters:  fin(I) - pointer to packet information                      */
533 void fix_outcksum(fin, sp, n)
534 fr_info_t *fin;
546 n += fin->fin_dlen;
564 /* Parameters: fin(I) - pointer to packet information */
570 void fix_incksum(fin, sp, n)
571 fr_info_t *fin;
583 n += fin->fin_dlen;
1409 fr_info_t fin;
1496 bzero((char *)&fin, sizeof(fin));
1497 fin.fin_p = nat->nat_p;
1499 fin.fin_ifp = nat->nat_ifps[0];
1500 fin.fin_data[0] = ntohs(nat->nat_oport);
1501 fin.fin_data[1] = ntohs(nat->nat_outport);
1505 n = nat_inlookup(&fin, nat->nat_flags, fin.fin_p,
1515 fin.fin_ifp = nat->nat_ifps[0];
1516 fin.fin_data[0] = ntohs(nat->nat_outport);
1517 fin.fin_data[1] = ntohs(nat->nat_oport);
1521 n = nat_outlookup(&fin, nat->nat_flags, fin.fin_p,
1884 /* Parameters: fin(I) - pointer to packet information */
1894 static INLINE int nat_newmap(fin, nat, ni)
1895 fr_info_t *fin;
1934 hm = nat_hostmap(np, fin->fin_src, fin->fin_dst,
1956 in.s_addr |= fin->fin_saddr & ~np->in_inmsk;
1966 in.s_addr = ntohl(fin->fin_saddr);
1991 fr_ifpaddr(4, FRI_NORMAL, fin->fin_ifp,
2002 in.s_addr = ntohl(fin->fin_saddr);
2028 (ntohl(fin->fin_saddr) %
2080 sp = fin->fin_data[0];
2081 dp = fin->fin_data[1];
2082 fin->fin_data[0] = fin->fin_data[1];
2083 fin->fin_data[1] = htons(port);
2084 natl = nat_inlookup(fin, flags & ~(SI_WILDP|NAT_SEARCH),
2085 (u_int)fin->fin_p, fin->fin_dst, inb);
2086 fin->fin_data[0] = sp;
2087 fin->fin_data[1] = dp;
2104 nat->nat_inip = fin->fin_src;
2106 nat->nat_oip = fin->fin_dst;
2108 nat->nat_hm = nat_hostmap(np, fin->fin_src, fin->fin_dst,
2115 ni->nai_sum1 = LONG_SUM(ntohl(fin->fin_saddr));
2126 ((tcphdr_t *)fin->fin_dp)->th_sport = port;
2128 ((icmphdr_t *)fin->fin_dp)->icmp_id = port;
2131 } else if (fin->fin_p == IPPROTO_GRE) {
2133 nat->nat_gre.gs_flags = ((grehdr_t *)fin->fin_dp)->gr_flags;
2135 nat->nat_oport = 0;/*fin->fin_data[1];*/
2136 nat->nat_inport = 0;/*fin->fin_data[0];*/
2137 nat->nat_outport = 0;/*fin->fin_data[0];*/
2138 nat->nat_call[0] = fin->fin_data[0];
2139 nat->nat_call[1] = fin->fin_data[0];
2154 /* Parameters: fin(I) - pointer to packet information */
2162 static INLINE int nat_newrdr(fin, nat, ni)
2163 fr_info_t *fin;
2193 hm = nat_hostmap(NULL, fin->fin_src, fin->fin_dst, in,
2213 hm = nat_hostmap(NULL, fin->fin_src, fin->fin_dst,
2234 if (fr_ifpaddr(4, FRI_NORMAL, fin->fin_ifp, &in, NULL) == -1)
2242 in.s_addr = ntohl(fin->fin_daddr);
2250 in.s_addr |= fin->fin_daddr & ~np->in_inmsk;
2280 in.s_addr = ntohl(fin->fin_daddr);
2289 sp = fin->fin_data[0];
2290 dp = fin->fin_data[1];
2291 fin->fin_data[1] = fin->fin_data[0];
2292 fin->fin_data[0] = ntohs(nport);
2293 natl = nat_outlookup(fin, flags & ~(SI_WILDP|NAT_SEARCH),
2294 (u_int)fin->fin_p, inb, fin->fin_src);
2295 fin->fin_data[0] = sp;
2296 fin->fin_data[1] = dp;
2301 nat->nat_outip = fin->fin_dst;
2302 nat->nat_oip = fin->fin_src;
2304 nat->nat_hm = nat_hostmap(np, fin->fin_src, fin->fin_dst, in,
2307 ni->nai_sum1 = LONG_SUM(ntohl(fin->fin_daddr)) + ntohs(dport);
2318 ((tcphdr_t *)fin->fin_dp)->th_dport = nport;
2320 ((icmphdr_t *)fin->fin_dp)->icmp_id = nport;
2323 } else if (fin->fin_p == IPPROTO_GRE) {
2325 nat->nat_gre.gs_flags = ((grehdr_t *)fin->fin_dp)->gr_flags;
2327 nat->nat_call[0] = fin->fin_data[0];
2328 nat->nat_call[1] = fin->fin_data[1];
2329 nat->nat_oport = 0; /*fin->fin_data[0];*/
2330 nat->nat_inport = 0; /*fin->fin_data[1];*/
2331 nat->nat_outport = 0; /*fin->fin_data[1];*/
2343 /* Parameters: fin(I) - pointer to packet information */
2361 nat_t *nat_new(fin, np, natsave, flags, direction)
2362 fr_info_t *fin;
2378 qpktinfo_t *qpi = fin->fin_qpi;
2416 tcp = fin->fin_dp;
2417 ni.nai_sport = htons(fin->fin_sport);
2418 ni.nai_dport = htons(fin->fin_dport);
2433 ni.nai_sport = ((icmphdr_t *)fin->fin_dp)->icmp_id;
2454 natl = nat_outlookup(fin, nflags, (u_int)fin->fin_p,
2455 fin->fin_src, fin->fin_dst);
2462 move = nat_newmap(fin, nat, &ni);
2472 natl = nat_inlookup(fin, nflags, (u_int)fin->fin_p,
2473 fin->fin_src, fin->fin_dst);
2480 move = nat_newrdr(fin, nat, &ni);
2516 ni.nai_sum1 = LONG_SUM(ntohl(fin->fin_saddr));
2517 ni.nai_sum1 += LONG_SUM(ntohl(fin->fin_daddr));
2527 ni.nai_sum1 = LONG_SUM(ntohl(fin->fin_saddr));
2529 ni.nai_sum1 = LONG_SUM(ntohl(fin->fin_daddr));
2543 if (nat_finalise(fin, nat, &ni, tcp, natsave, direction) == -1) {
2549 fin->fin_flx |= FI_NEWNAT;
2568 /* Parameters: fin(I) - pointer to packet information */
2578 static int nat_finalise(fin, nat, ni, tcp, natsave, direction)
2579 fr_info_t *fin;
2599 nat->nat_sync = ipfsync_new(SMC_NAT, fin, nat);
2607 nat->nat_p = fin->fin_p;
2613 if (appr_new(fin, nat) == -1)
2616 if (nat_insert(nat, fin->fin_rev) == 0) {
2620 fr = fin->fin_fr;
2737 /* Parameters: fin(I) - pointer to packet information */
2744 nat_t *nat_icmperrorlookup(fin, dir)
2745 fr_info_t *fin;
2756 icmp = fin->fin_dp;
2763 if ((fin->fin_hlen != sizeof(ip_t)) || !(fin->fin_flx & FI_ICMPERR))
2769 oip = (ip_t *)((char *)fin->fin_dp + 8);
2772 (fin->fin_plen < ICMPERR_IPICMPHLEN + minlen))
2787 m = fin->fin_m;
2789 if ((char *)oip + fin->fin_dlen - ICMPERR_ICMPHLEN > (char *)m->b_wptr)
2792 if ((char *)oip + fin->fin_dlen - ICMPERR_ICMPHLEN >
2793 (char *)fin->fin_ip + M_LEN(m))
2799 if (fin->fin_daddr != oip->ip_src.s_addr)
2812 data[0] = fin->fin_data[0];
2813 data[1] = fin->fin_data[1];
2814 fin->fin_data[0] = 0;
2815 fin->fin_data[1] = orgicmp->icmp_id;
2824 nat = nat_inlookup(fin, flags, p, oip->ip_dst,
2827 nat = nat_outlookup(fin, flags, p, oip->ip_dst,
2829 fin->fin_data[0] = data[0];
2830 fin->fin_data[1] = data[1];
2837 if (fin->fin_plen < ICMPERR_IPICMPHLEN + minlen)
2840 data[0] = fin->fin_data[0];
2841 data[1] = fin->fin_data[1];
2843 fin->fin_data[0] = ntohs(tcp->th_dport);
2844 fin->fin_data[1] = ntohs(tcp->th_sport);
2847 nat = nat_inlookup(fin, flags, p, oip->ip_dst,
2850 nat = nat_outlookup(fin, flags, p, oip->ip_dst,
2853 fin->fin_data[0] = data[0];
2854 fin->fin_data[1] = data[1];
2858 return nat_inlookup(fin, 0, p, oip->ip_dst, oip->ip_src);
2860 return nat_outlookup(fin, 0, p, oip->ip_dst, oip->ip_src);
2867 /* Parameters: fin(I) - pointer to packet information */
2877 nat_t *nat_icmperror(fin, nflags, dir)
2878 fr_info_t *fin;
2892 if ((fin->fin_flx & (FI_SHORT|FI_FRAGBODY)))
2897 if ((fin->fin_v != 4) || !(nat = nat_icmperrorlookup(fin, dir)))
2905 icmp = fin->fin_dp;
2921 dlen = fin->fin_plen - ((char *)dp - (char *)fin->fin_ip);
3066 (fin->fin_rev == 0) && (np != NULL) &&
3068 fix_outcksum(fin, &icmp->icmp_cksum,
3071 fix_incksum(fin, &icmp->icmp_cksum,
3121 /* Parameters: fin(I) - pointer to packet information */
3139 nat_t *nat_inlookup(fin, flags, p, src, mapdst)
3140 fr_info_t *fin;
3154 ifp = fin->fin_ifp;
3165 sport = htons(fin->fin_data[0]);
3166 dport = htons(fin->fin_data[1]);
3170 sport = fin->fin_data[1];
3172 dport = fin->fin_data[1];
3203 if (nat->nat_call[1] != fin->fin_data[0])
3229 if (appr_match(fin, nat) != 0)
3263 if (nat->nat_p != fin->fin_p)
3275 if ((fin->fin_flx & FI_IGNORE) != 0)
3278 nat = fr_natclone(fin, nat);
3365 /* Parameters: fin(I) - pointer to packet information */
3384 nat_t *nat_outlookup(fin, flags, p, src, dst)
3385 fr_info_t *fin;
3398 ifp = fin->fin_ifp;
3408 sport = htons(fin->fin_data[0]);
3409 dport = htons(fin->fin_data[1]);
3413 sport = fin->fin_data[1];
3415 dport = fin->fin_data[1];
3444 if (nat->nat_call[1] != fin->fin_data[0])
3461 if (appr_match(fin, nat) != 0)
3495 if (nat->nat_p != fin->fin_p)
3507 if ((fin->fin_flx & FI_IGNORE) != 0)
3510 nat = fr_natclone(fin, nat);
3594 fr_info_t fin;
3595 bzero((char *)&fin, sizeof(fin));
3596 fin.fin_p = nat->nat_p;
3597 fin.fin_data[0] = ntohs(nat->nat_outport);
3598 fin.fin_data[1] = ntohs(nat->nat_oport);
3599 if (nat_inlookup(&fin, np->nl_flags, fin.fin_p,
3618 /* Parameters: fin(I) - pointer to packet information */
3624 static int nat_match(fin, np)
3625 fr_info_t *fin;
3630 if (fin->fin_v != 4)
3633 if (np->in_p && fin->fin_p != np->in_p)
3636 if (fin->fin_out) {
3639 if (((fin->fin_fi.fi_saddr & np->in_inmsk) != np->in_inip)
3642 if (((fin->fin_fi.fi_daddr & np->in_srcmsk) != np->in_srcip)
3648 if (((fin->fin_fi.fi_saddr & np->in_srcmsk) != np->in_srcip)
3651 if (((fin->fin_fi.fi_daddr & np->in_outmsk) != np->in_outip)
3657 if (!(fin->fin_flx & FI_TCPUDP) ||
3658 (fin->fin_flx & (FI_SHORT|FI_FRAGBODY))) {
3664 return fr_tcpudpchk(fin, ft);
3677 void nat_update(fin, nat, np)
3678 fr_info_t *fin;
3695 ifq2 = np->in_tqehead[fin->fin_rev];
3705 tcp = fin->fin_dp;
3707 dsize = fin->fin_dlen - (TCP_OFF(tcp) << 2) +
3714 if (SEQ_GT(ack, nat->nat_seqnext[1 - fin->fin_rev]))
3715 nat->nat_seqnext[1 - fin->fin_rev] = ack;
3717 if (nat->nat_seqnext[fin->fin_rev] == 0)
3718 nat->nat_seqnext[fin->fin_rev] = end;
3720 (void) fr_tcp_age(&nat->nat_tqe, fin, nat_tqb, 0);
3742 /* Parameters: fin(I) - pointer to packet information */
3752 int fr_checknatout(fin, passp)
3753 fr_info_t *fin;
3771 fr = fin->fin_fr;
3772 sifp = fin->fin_ifp;
3774 ifp = fr->fr_tifs[fin->fin_rev].fd_ifp;
3776 fin->fin_ifp = ifp;
3778 ifp = fin->fin_ifp;
3780 if (!(fin->fin_flx & FI_SHORT) && (fin->fin_off == 0)) {
3781 switch (fin->fin_p)
3790 icmp = fin->fin_dp;
3804 tcp = fin->fin_dp;
3807 ipa = fin->fin_saddr;
3811 if (((fin->fin_flx & FI_ICMPERR) != 0) &&
3812 (nat = nat_icmperror(fin, &nflags, NAT_OUTBOUND)))
3814 else if ((fin->fin_flx & FI_FRAG) && (nat = fr_nat_knownfrag(fin)))
3816 else if ((nat = nat_outlookup(fin, nflags|NAT_SEARCH, (u_int)fin->fin_p,
3817 fin->fin_src, fin->fin_dst))) {
3837 if (np->in_v != fin->fin_v)
3839 if (np->in_p && (np->in_p != fin->fin_p))
3844 if (!nat_match(fin, np))
3857 if (appr_ok(fin, tcp, np) == 0)
3861 if ((nat = nat_new(fin, np, NULL, nflags,
3884 rval = fr_natout(fin, nat, natadd, nflags);
3890 fin->fin_nat = nat;
3899 fin->fin_flx |= FI_BADNAT;
3901 fin->fin_ifp = sifp;
3909 /* Parameters: fin(I) - pointer to packet information */
3916 int fr_natout(fin, nat, natadd, nflags)
3917 fr_info_t *fin;
3933 if ((natadd != 0) && (fin->fin_flx & FI_FRAG) && (np != NULL))
3934 (void) fr_nat_newfrag(fin, 0, nat);
3937 nat->nat_bytes[1] += fin->fin_plen;
3949 if (fin->fin_v == 4) {
3953 s1 = LONG_SUM(ntohl(fin->fin_saddr));
3956 fix_outcksum(fin, &fin->fin_ip->ip_sum, sumd);
3968 fix_outcksum(fin, &fin->fin_ip->ip_sum,
3971 fix_incksum(fin, &fin->fin_ip->ip_sum,
3977 if (!(fin->fin_flx & FI_SHORT) && (fin->fin_off == 0)) {
3979 tcp = fin->fin_dp;
3982 fin->fin_data[0] = ntohs(nat->nat_outport);
3986 icmp = fin->fin_dp;
3990 csump = nat_proto(fin, nat, nflags);
3993 fin->fin_ip->ip_src = nat->nat_outip;
3995 nat_update(fin, nat, np);
4002 fix_outcksum(fin, csump, nat->nat_sumd[1]);
4004 fix_incksum(fin, csump, nat->nat_sumd[1]);
4007 ipfsync_update(SMC_NAT, fin, nat->nat_sync);
4020 i = appr_check(fin, nat);
4026 fin->fin_flx |= FI_NATED;
4036 /* Parameters: fin(I) - pointer to packet information */
4046 int fr_checknatin(fin, passp)
4047 fr_info_t *fin;
4070 ifp = fin->fin_ifp;
4072 if (!(fin->fin_flx & FI_SHORT) && (fin->fin_off == 0)) {
4073 switch (fin->fin_p)
4082 icmp = fin->fin_dp;
4097 tcp = fin->fin_dp;
4102 in = fin->fin_dst;
4106 if (((fin->fin_flx & FI_ICMPERR) != 0) &&
4107 (nat = nat_icmperror(fin, &nflags, NAT_INBOUND)))
4109 else if ((fin->fin_flx & FI_FRAG) && (nat = fr_nat_knownfrag(fin)))
4111 else if ((nat = nat_inlookup(fin, nflags|NAT_SEARCH, (u_int)fin->fin_p,
4112 fin->fin_src, in))) {
4131 if (np->in_v != fin->fin_v)
4133 if (np->in_p && (np->in_p != fin->fin_p))
4138 if (!nat_match(fin, np))
4150 if (!appr_ok(fin, tcp, np)) {
4155 nat = nat_new(fin, np, NULL, nflags, NAT_INBOUND);
4178 rval = fr_natin(fin, nat, natadd, nflags);
4184 fin->fin_nat = nat;
4193 fin->fin_flx |= FI_BADNAT;
4203 /* Parameters: fin(I) - pointer to packet information */
4211 int fr_natin(fin, nat, natadd, nflags)
4212 fr_info_t *fin;
4226 fin->fin_fr = nat->nat_fr;
4229 if ((natadd != 0) && (fin->fin_flx & FI_FRAG))
4230 (void) fr_nat_newfrag(fin, 0, nat);
4243 i = appr_check(fin, nat);
4251 ipfsync_update(SMC_NAT, fin, nat->nat_sync);
4255 nat->nat_bytes[0] += fin->fin_plen;
4259 fin->fin_ip->ip_dst = nat->nat_inip;
4260 fin->fin_fi.fi_daddr = nat->nat_inip.s_addr;
4262 tcp = fin->fin_dp;
4277 fix_incksum(fin, &fin->fin_ip->ip_sum, nat->nat_ipsumd);
4279 fix_outcksum(fin, &fin->fin_ip->ip_sum, nat->nat_ipsumd);
4282 if (!(fin->fin_flx & FI_SHORT) && (fin->fin_off == 0)) {
4285 fin->fin_data[1] = ntohs(nat->nat_inport);
4290 icmp = fin->fin_dp;
4295 csump = nat_proto(fin, nat, nflags);
4298 nat_update(fin, nat, np);
4305 fix_incksum(fin, csump, nat->nat_sumd[0]);
4307 fix_outcksum(fin, csump, nat->nat_sumd[0]);
4310 fin->fin_flx |= FI_NATED;
4312 fin->fin_nattag = &np->in_tag;
4322 /* Parameters: fin(I) - pointer to packet information */
4331 u_short *nat_proto(fin, nat, nflags)
4332 fr_info_t *fin;
4342 if (fin->fin_out == 0) {
4343 fin->fin_rev = (nat->nat_dir == NAT_OUTBOUND);
4345 fin->fin_rev = (nat->nat_dir == NAT_INBOUND);
4348 switch (fin->fin_p)
4351 tcp = fin->fin_dp;
4360 nat_mssclamp(tcp, nat->nat_mssclamp, fin, csump);
4365 udp = fin->fin_dp;
4372 icmp = fin->fin_dp;
4794 /* Parameters: fin(I) - pointer to packet information */
4800 static nat_t *fr_natclone(fin, nat)
4801 fr_info_t *fin;
4830 if (nat_insert(clone, fin->fin_rev) == -1) {
4853 (void) fr_tcp_age(&clone->nat_tqe, fin, nat_tqb,
4857 clone->nat_sync = ipfsync_new(SMC_NAT, fin, clone);
4938 /* fin(I) - pointer to packet information */
4945 static void nat_mssclamp(tcp, maxmss, fin, csump)
4948 fr_info_t *fin;
4984 fix_outcksum(fin, csump, sumd);