192680Sdarrenr/* 292680Sdarrenr * Simple netbios-dgm transparent proxy for in-kernel use. 392680Sdarrenr * For use with the NAT code. 4255332Scy * $Id$ 592680Sdarrenr */ 692680Sdarrenr 792680Sdarrenr/*- 8145516Sdarrenr * Copyright (c) 2002-2003 Paul J. Ledbetter III 992680Sdarrenr * All rights reserved. 1092680Sdarrenr * 1192680Sdarrenr * Redistribution and use in source and binary forms, with or without 1292680Sdarrenr * modification, are permitted provided that the following conditions 1392680Sdarrenr * are met: 1492680Sdarrenr * 1. Redistributions of source code must retain the above copyright 1592680Sdarrenr * notice, this list of conditions and the following disclaimer. 1692680Sdarrenr * 2. Redistributions in binary form must reproduce the above copyright 1792680Sdarrenr * notice, this list of conditions and the following disclaimer in the 1892680Sdarrenr * documentation and/or other materials provided with the distribution. 1992680Sdarrenr * 2092680Sdarrenr * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 2192680Sdarrenr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2292680Sdarrenr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2392680Sdarrenr * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2492680Sdarrenr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2592680Sdarrenr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2692680Sdarrenr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2792680Sdarrenr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2892680Sdarrenr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2992680Sdarrenr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3092680Sdarrenr * SUCH DAMAGE. 3192680Sdarrenr * 32255332Scy * $Id$ 3392680Sdarrenr */ 3492680Sdarrenr 3592680Sdarrenr#define IPF_NETBIOS_PROXY 3692680Sdarrenr 37255332Scyvoid ipf_p_netbios_main_load __P((void)); 38255332Scyvoid ipf_p_netbios_main_unload __P((void)); 39255332Scyint ipf_p_netbios_out __P((void *, fr_info_t *, ap_session_t *, nat_t *)); 4092680Sdarrenr 4192680Sdarrenrstatic frentry_t netbiosfr; 4292680Sdarrenr 43145516Sdarrenrint netbios_proxy_init = 0; 44145516Sdarrenr 4592680Sdarrenr/* 4692680Sdarrenr * Initialize local structures. 4792680Sdarrenr */ 48255332Scyvoid 49255332Scyipf_p_netbios_main_load() 5092680Sdarrenr{ 5192680Sdarrenr bzero((char *)&netbiosfr, sizeof(netbiosfr)); 5292680Sdarrenr netbiosfr.fr_ref = 1; 5392680Sdarrenr netbiosfr.fr_flags = FR_INQUE|FR_PASS|FR_QUICK|FR_KEEPSTATE; 54145516Sdarrenr MUTEX_INIT(&netbiosfr.fr_lock, "NETBIOS proxy rule lock"); 55145516Sdarrenr netbios_proxy_init = 1; 5692680Sdarrenr} 5792680Sdarrenr 58145516Sdarrenr 59255332Scyvoid 60255332Scyipf_p_netbios_main_unload() 61145516Sdarrenr{ 62145516Sdarrenr if (netbios_proxy_init == 1) { 63145516Sdarrenr MUTEX_DESTROY(&netbiosfr.fr_lock); 64145516Sdarrenr netbios_proxy_init = 0; 65145516Sdarrenr } 66145516Sdarrenr} 67145516Sdarrenr 68145516Sdarrenr 69255332Scyint 70255332Scyipf_p_netbios_out(arg, fin, aps, nat) 71255332Scy void *arg; 72255332Scy fr_info_t *fin; 73255332Scy ap_session_t *aps; 74255332Scy nat_t *nat; 7592680Sdarrenr{ 7692680Sdarrenr char dgmbuf[6]; 7792680Sdarrenr int off, dlen; 7892680Sdarrenr udphdr_t *udp; 79145516Sdarrenr ip_t *ip; 8092680Sdarrenr mb_t *m; 8192680Sdarrenr 82145516Sdarrenr aps = aps; /* LINT */ 83145516Sdarrenr nat = nat; /* LINT */ 84145516Sdarrenr 85153872Sguido m = fin->fin_m; 86153872Sguido dlen = fin->fin_dlen - sizeof(*udp); 8792680Sdarrenr /* 8892680Sdarrenr * no net bios datagram could possibly be shorter than this 8992680Sdarrenr */ 90145516Sdarrenr if (dlen < 11) 9192680Sdarrenr return 0; 9292680Sdarrenr 93153872Sguido ip = fin->fin_ip; 9492680Sdarrenr udp = (udphdr_t *)fin->fin_dp; 95153872Sguido off = (char *)udp - (char *)ip + sizeof(*udp) + fin->fin_ipoff; 9692680Sdarrenr 97145516Sdarrenr /* 9892680Sdarrenr * move past the 9992680Sdarrenr * ip header; 10092680Sdarrenr * udp header; 101145516Sdarrenr * 4 bytes into the net bios dgm header. 10292680Sdarrenr * According to rfc1002, this should be the exact location of 10392680Sdarrenr * the source address/port 10492680Sdarrenr */ 10592680Sdarrenr off += 4; 10692680Sdarrenr 10792680Sdarrenr /* Copy NATed source Address/port*/ 10892680Sdarrenr dgmbuf[0] = (char)((ip->ip_src.s_addr ) &0xFF); 10992680Sdarrenr dgmbuf[1] = (char)((ip->ip_src.s_addr >> 8) &0xFF); 11092680Sdarrenr dgmbuf[2] = (char)((ip->ip_src.s_addr >> 16)&0xFF); 11192680Sdarrenr dgmbuf[3] = (char)((ip->ip_src.s_addr >> 24)&0xFF); 11292680Sdarrenr 11392680Sdarrenr dgmbuf[4] = (char)((udp->uh_sport )&0xFF); 11492680Sdarrenr dgmbuf[5] = (char)((udp->uh_sport >> 8)&0xFF); 11592680Sdarrenr 11692680Sdarrenr /* replace data in packet */ 117145516Sdarrenr COPYBACK(m, off, sizeof(dgmbuf), dgmbuf); 11892680Sdarrenr 11992680Sdarrenr return 0; 12092680Sdarrenr} 121