192680Sdarrenr/* 292680Sdarrenr * Simple netbios-dgm transparent proxy for in-kernel use. 392680Sdarrenr * For use with the NAT code. 4153872Sguido * $Id: ip_netbios_pxy.c,v 2.8.2.1 2005/08/20 13:48:23 darrenr Exp $ 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 * 32153872Sguido * $Id: ip_netbios_pxy.c,v 2.8.2.1 2005/08/20 13:48:23 darrenr Exp $ 3392680Sdarrenr */ 3492680Sdarrenr 3592680Sdarrenr#define IPF_NETBIOS_PROXY 3692680Sdarrenr 3792680Sdarrenrint ippr_netbios_init __P((void)); 38145516Sdarrenrvoid ippr_netbios_fini __P((void)); 39145516Sdarrenrint ippr_netbios_out __P((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 */ 4892680Sdarrenrint ippr_netbios_init() 4992680Sdarrenr{ 5092680Sdarrenr bzero((char *)&netbiosfr, sizeof(netbiosfr)); 5192680Sdarrenr netbiosfr.fr_ref = 1; 5292680Sdarrenr netbiosfr.fr_flags = FR_INQUE|FR_PASS|FR_QUICK|FR_KEEPSTATE; 53145516Sdarrenr MUTEX_INIT(&netbiosfr.fr_lock, "NETBIOS proxy rule lock"); 54145516Sdarrenr netbios_proxy_init = 1; 55145516Sdarrenr 5692680Sdarrenr return 0; 5792680Sdarrenr} 5892680Sdarrenr 59145516Sdarrenr 60145516Sdarrenrvoid ippr_netbios_fini() 61145516Sdarrenr{ 62145516Sdarrenr if (netbios_proxy_init == 1) { 63145516Sdarrenr MUTEX_DESTROY(&netbiosfr.fr_lock); 64145516Sdarrenr netbios_proxy_init = 0; 65145516Sdarrenr } 66145516Sdarrenr} 67145516Sdarrenr 68145516Sdarrenr 69145516Sdarrenrint ippr_netbios_out(fin, aps, nat) 7092680Sdarrenrfr_info_t *fin; 7192680Sdarrenrap_session_t *aps; 7292680Sdarrenrnat_t *nat; 7392680Sdarrenr{ 7492680Sdarrenr char dgmbuf[6]; 7592680Sdarrenr int off, dlen; 7692680Sdarrenr udphdr_t *udp; 77145516Sdarrenr ip_t *ip; 7892680Sdarrenr mb_t *m; 7992680Sdarrenr 80145516Sdarrenr aps = aps; /* LINT */ 81145516Sdarrenr nat = nat; /* LINT */ 82145516Sdarrenr 83153872Sguido m = fin->fin_m; 84153872Sguido dlen = fin->fin_dlen - sizeof(*udp); 8592680Sdarrenr /* 8692680Sdarrenr * no net bios datagram could possibly be shorter than this 8792680Sdarrenr */ 88145516Sdarrenr if (dlen < 11) 8992680Sdarrenr return 0; 9092680Sdarrenr 91153872Sguido ip = fin->fin_ip; 9292680Sdarrenr udp = (udphdr_t *)fin->fin_dp; 93153872Sguido off = (char *)udp - (char *)ip + sizeof(*udp) + fin->fin_ipoff; 9492680Sdarrenr 95145516Sdarrenr /* 9692680Sdarrenr * move past the 9792680Sdarrenr * ip header; 9892680Sdarrenr * udp header; 99145516Sdarrenr * 4 bytes into the net bios dgm header. 10092680Sdarrenr * According to rfc1002, this should be the exact location of 10192680Sdarrenr * the source address/port 10292680Sdarrenr */ 10392680Sdarrenr off += 4; 10492680Sdarrenr 10592680Sdarrenr /* Copy NATed source Address/port*/ 10692680Sdarrenr dgmbuf[0] = (char)((ip->ip_src.s_addr ) &0xFF); 10792680Sdarrenr dgmbuf[1] = (char)((ip->ip_src.s_addr >> 8) &0xFF); 10892680Sdarrenr dgmbuf[2] = (char)((ip->ip_src.s_addr >> 16)&0xFF); 10992680Sdarrenr dgmbuf[3] = (char)((ip->ip_src.s_addr >> 24)&0xFF); 11092680Sdarrenr 11192680Sdarrenr dgmbuf[4] = (char)((udp->uh_sport )&0xFF); 11292680Sdarrenr dgmbuf[5] = (char)((udp->uh_sport >> 8)&0xFF); 11392680Sdarrenr 11492680Sdarrenr /* replace data in packet */ 115145516Sdarrenr COPYBACK(m, off, sizeof(dgmbuf), dgmbuf); 11692680Sdarrenr 11792680Sdarrenr return 0; 11892680Sdarrenr} 119