]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - ip_netbios_pxy.c
In preparation for the upcoming ipfilter vendor code import,
[FreeBSD/FreeBSD.git] / ip_netbios_pxy.c
1 /*      $NetBSD$        */
2
3 /*
4  * Simple netbios-dgm transparent proxy for in-kernel use.
5  * For use with the NAT code.
6  * Id: ip_netbios_pxy.c,v 2.8 2003/12/01 02:52:16 darrenr Exp
7  */
8
9 /*-
10  * Copyright (c) 2002-2003 Paul J. Ledbetter III
11  * All rights reserved.
12  *
13  * Redistribution and use in source and binary forms, with or without
14  * modification, are permitted provided that the following conditions
15  * are met:
16  * 1. Redistributions of source code must retain the above copyright
17  *    notice, this list of conditions and the following disclaimer.
18  * 2. Redistributions in binary form must reproduce the above copyright
19  *    notice, this list of conditions and the following disclaimer in the
20  *    documentation and/or other materials provided with the distribution.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  *
34  * Id: ip_netbios_pxy.c,v 2.8 2003/12/01 02:52:16 darrenr Exp
35  */
36
37 #define IPF_NETBIOS_PROXY
38
39 int ippr_netbios_init __P((void));
40 void ippr_netbios_fini __P((void));
41 int ippr_netbios_out __P((fr_info_t *, ap_session_t *, nat_t *));
42
43 static  frentry_t       netbiosfr;
44
45 int     netbios_proxy_init = 0;
46
47 /*
48  * Initialize local structures.
49  */
50 int ippr_netbios_init()
51 {
52         bzero((char *)&netbiosfr, sizeof(netbiosfr));
53         netbiosfr.fr_ref = 1;
54         netbiosfr.fr_flags = FR_INQUE|FR_PASS|FR_QUICK|FR_KEEPSTATE;
55         MUTEX_INIT(&netbiosfr.fr_lock, "NETBIOS proxy rule lock");
56         netbios_proxy_init = 1;
57
58         return 0;
59 }
60
61
62 void ippr_netbios_fini()
63 {
64         if (netbios_proxy_init == 1) {
65                 MUTEX_DESTROY(&netbiosfr.fr_lock);
66                 netbios_proxy_init = 0;
67         }
68 }
69
70
71 int ippr_netbios_out(fin, aps, nat)
72 fr_info_t *fin;
73 ap_session_t *aps;
74 nat_t *nat;
75 {
76         char dgmbuf[6];
77         int off, dlen;
78         udphdr_t *udp;
79         ip_t *ip;
80         mb_t *m;
81
82         aps = aps;      /* LINT */
83         nat = nat;      /* LINT */
84
85         ip = fin->fin_ip;
86         m = *(mb_t **)fin->fin_mp;
87         off = fin->fin_hlen + sizeof(udphdr_t);
88         dlen = M_LEN(m);
89         dlen -= off;
90
91         /*
92          * no net bios datagram could possibly be shorter than this
93          */
94         if (dlen < 11)
95                 return 0;
96
97         udp = (udphdr_t *)fin->fin_dp;
98
99         /*
100          * move past the
101          *      ip header;
102          *      udp header;
103          *      4 bytes into the net bios dgm header.
104          *  According to rfc1002, this should be the exact location of
105          *  the source address/port
106          */
107         off += 4;
108
109         /* Copy NATed source Address/port*/
110         dgmbuf[0] = (char)((ip->ip_src.s_addr     ) &0xFF);
111         dgmbuf[1] = (char)((ip->ip_src.s_addr >> 8) &0xFF);
112         dgmbuf[2] = (char)((ip->ip_src.s_addr >> 16)&0xFF);
113         dgmbuf[3] = (char)((ip->ip_src.s_addr >> 24)&0xFF);
114
115         dgmbuf[4] = (char)((udp->uh_sport     )&0xFF);
116         dgmbuf[5] = (char)((udp->uh_sport >> 8)&0xFF);
117
118         /* replace data in packet */
119         COPYBACK(m, off, sizeof(dgmbuf), dgmbuf);
120
121         return 0;
122 }