alias_nbt.c revision f428c820be00a88cb87e3f70f666ca7b3513fd82
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * Written by Atsushi Murai <amurai@spec.co.jp>
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * Copyright (c) 1998, System Planning and Engineering Co.
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * All rights reserved.
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * Redistribution and use in source and binary forms, with or without
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * modification, are permitted provided that the following conditions
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * 1. Redistributions of source code must retain the above copyright
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * notice, this list of conditions and the following disclaimer.
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * 2. Redistributions in binary form must reproduce the above copyright
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * notice, this list of conditions and the following disclaimer in the
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * documentation and/or other materials provided with the distribution.
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * SUCH DAMAGE.
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * oClean up.
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * oConsidering for word alignment for other platform.
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias_nbt.c,v 1.20.8.1 2009/04/15 03:14:26 kensmith Exp $");
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync alias_nbt.c performs special processing for NetBios over TCP/IP
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync sessions by UDP.
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync Initial version: May, 1998 (Atsushi Murai <amurai@spec.co.jp>)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync See HISTORY file for record of revisions.
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync/* Includes */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#else /*VBOX*/
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif /*VBOX*/
53ffce10edad430eac13d39c63b4f2501452f50bvboxsyncAliasHandleUdpNbt(struct libalias *, struct ip *, struct alias_link *,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncAliasHandleUdpNbtNS(struct libalias *, struct ip *, struct alias_link *,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync struct in_addr *, u_short *, struct in_addr *, u_short *);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncfingerprint1(struct libalias *la, struct ip *pip, struct alias_data *ah)
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync if (ah->dport == NULL || ah->sport == NULL || ah->lnk == NULL ||
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (-1);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (0);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (-1);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncprotohandler1(struct libalias *la, struct ip *pip, struct alias_data *ah)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync AliasHandleUdpNbt(la, pip, ah->lnk, ah->aaddr, *ah->aport);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (0);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncfingerprint2(struct libalias *la, struct ip *pip, struct alias_data *ah)
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync if (ah->dport == NULL || ah->sport == NULL || ah->lnk == NULL ||
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (-1);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (0);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (-1);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncprotohandler2in(struct libalias *la, struct ip *pip, struct alias_data *ah)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync AliasHandleUdpNbtNS(la, pip, ah->lnk, ah->aaddr, ah->aport,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (0);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncprotohandler2out(struct libalias *la, struct ip *pip, struct alias_data *ah)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync AliasHandleUdpNbtNS(la, pip, ah->lnk, &pip->ip_src, ah->sport,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (0);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync/* Kernel module definition. */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#else /* !VBOX */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif /*VBOX*/
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#else /*!VBOX*/
ac50f06afde48ac748508b14be3d44428d3500d1vboxsyncstatic int nbt_alias_handler(PNATState pData, int type);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif /*VBOX*/
bbb8aa81a86685a168b3b7f45a9ebd6b8849e059vboxsync handlers = RTMemAllocZ(4 * sizeof(struct proto_handler));
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif /*VBOX*/
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif /*!VBOX*/
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncDECLARE_MODULE(alias_nbt, alias_mod, SI_SUB_DRIVERS, SI_ORDER_SECOND);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsynctypedef struct {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsynctypedef struct {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync unsigned char type;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync unsigned char flags;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsynctypedef struct {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync/* Handling Name field */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Following length field */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (*p & 0xc0) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if ((char *)p > pmax)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return ((u_char *) p);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (*p == 0x20)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Get next length field */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if ((char *)p > pmax) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync while (s < p) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync c = (u_char) (((((*s & 0x0f) << 4) | (*(s + 1) & 0x0f)) - 0x11));
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Set up to out of Name field */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return ((u_char *) p);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * NetBios Datagram Handler (IP/UDP)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Calculate data length of UDP packet */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (-1);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync p = AliasHandleName(p, pmax); /* Destination Name */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync p = AliasHandleName(p, pmax); /* Destination Name */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("%s:%d-->", inet_ntoa(ndh->source_ip), ntohs(ndh->source_port));
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Doing an IP address and Port number Translation */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("%s:%d\n", inet_ntoa(ndh->source_ip), ntohs(ndh->source_port));
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync/* Question Section */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsynctypedef struct {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync while (count != 0) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Name Filed */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync q = (NBTNsQuestion *) AliasHandleName((u_char *) q, pmax);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Type and Class filed */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("\nUnknown Type on Question %0x\n", ntohs(q->type));
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Set up to out of Question Section */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return ((u_char *) q);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync/* Resource Record */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsynctypedef struct {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync unsigned int ttl;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsynctypedef struct {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Check out a length */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Forward to Resource NB position */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync nb = (NBTNsRNB *) ((u_char *) q + SizeOfNsResource);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Processing all in_addr array */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("->%s, %dbytes] ", inet_ntoa(nbtarg->newaddr), bcount);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (!bcmp(&nbtarg->oldaddr, &nb->addr, sizeof(struct in_addr))) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsynctypedef struct {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Forward to Resource A position */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync a = (NBTNsResourceA *) ((u_char *) q + sizeof(NBTNsResource));
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Check out of length */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Processing all in_addr array */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync while (bcount != 0) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (!bcmp(&nbtarg->oldaddr, &a->addr, sizeof(struct in_addr))) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync a++; /* XXXX */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return ((u_char *) a);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsynctypedef struct {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Forward to Resource NULL position */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync n = (NBTNsResourceNULL *) ((u_char *) q + sizeof(NBTNsResource));
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Check out of length */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Processing all in_addr array */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync while (bcount != 0) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return ((u_char *) n);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Forward to Resource NULL position */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync n = (NBTNsResourceNULL *) ((u_char *) q + sizeof(NBTNsResource));
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Check out of length */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Resource Record Name Filed */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync q = (NBTNsResource *) AliasHandleName((u_char *) n, pmax); /* XXX */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (q == NULL || (char *)((u_char *) n + bcount) > pmax)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsynctypedef struct {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Forward to Resource NBSTAT position */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync n = (NBTNsResourceNBSTAT *) ((u_char *) q + sizeof(NBTNsResource));
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Check out of length */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (q == NULL || (char *)((u_char *) n + bcount) > pmax)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync while (count != 0) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Resource Record Name Filed */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync q = (NBTNsResource *) AliasHandleName((u_char *) q, pmax);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("type=%02x, count=%d\n", ntohs(q->type), count);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Type and Class filed */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync "\nUnknown Type of Resource %0x\n",
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return ((u_char *) q);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Set up Common Parameter */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Calculate data length of UDP packet */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (-1);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf(" [%s] ID=%02x, op=%01x, flag=%02x, rcode=%01x, qd=%04x"
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync ", an=%04x, ns=%04x, ar=%04x, [%d]-->",
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Question Entries */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Answer Resource Records */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Authority Resource Recodrs */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Additional Resource Recodrs */