ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync/*-
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * Written by Atsushi Murai <amurai@spec.co.jp>
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * Copyright (c) 1998, System Planning and Engineering Co.
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * All rights reserved.
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync *
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * Redistribution and use in source and binary forms, with or without
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * modification, are permitted provided that the following conditions
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * are met:
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 *
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 * TODO:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * oClean up.
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * oConsidering for word alignment for other platform.
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifndef VBOX
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#include <sys/cdefs.h>
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias_nbt.c,v 1.20.8.1 2009/04/15 03:14:26 kensmith Exp $");
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync/*
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync alias_nbt.c performs special processing for NetBios over TCP/IP
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync sessions by UDP.
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync Initial version: May, 1998 (Atsushi Murai <amurai@spec.co.jp>)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync See HISTORY file for record of revisions.
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync*/
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync/* Includes */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef _KERNEL
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#include <sys/param.h>
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#include <sys/systm.h>
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#include <sys/kernel.h>
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#include <sys/module.h>
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#else
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#include <errno.h>
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#include <sys/types.h>
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#include <stdio.h>
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#include <netinet/in_systm.h>
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#include <netinet/in.h>
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#include <netinet/ip.h>
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#include <netinet/udp.h>
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef _KERNEL
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#include <netinet/libalias/alias_local.h>
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#include <netinet/libalias/alias_mod.h>
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#else
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#include "alias_local.h"
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#include "alias_mod.h"
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif
4dd5020158b69719fd7942ff7b996df2d4535bb4vboxsync#else /* VBOX */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync# include <iprt/ctype.h>
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync# include <slirp.h>
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync# include "alias_local.h"
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync# include "alias_mod.h"
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync# define isprint RT_C_IS_PRINT
4dd5020158b69719fd7942ff7b996df2d4535bb4vboxsync#endif /* VBOX */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define NETBIOS_NS_PORT_NUMBER 137
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define NETBIOS_DGM_PORT_NUMBER 138
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncstatic int
53ffce10edad430eac13d39c63b4f2501452f50bvboxsyncAliasHandleUdpNbt(struct libalias *, struct ip *, struct alias_link *,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync struct in_addr *, u_short);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncstatic int
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncAliasHandleUdpNbtNS(struct libalias *, struct ip *, struct alias_link *,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync struct in_addr *, u_short *, struct in_addr *, u_short *);
53ffce10edad430eac13d39c63b4f2501452f50bvboxsyncstatic int
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncfingerprint1(struct libalias *la, struct ip *pip, struct alias_data *ah)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync{
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
f428c820be00a88cb87e3f70f666ca7b3513fd82vboxsync#ifdef VBOX
f428c820be00a88cb87e3f70f666ca7b3513fd82vboxsync NOREF(la);
f428c820be00a88cb87e3f70f666ca7b3513fd82vboxsync NOREF(pip);
f428c820be00a88cb87e3f70f666ca7b3513fd82vboxsync#endif
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync if (ah->dport == NULL || ah->sport == NULL || ah->lnk == NULL ||
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync ah->aaddr == NULL || ah->aport == NULL)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (-1);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (ntohs(*ah->dport) == NETBIOS_DGM_PORT_NUMBER
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync || ntohs(*ah->sport) == NETBIOS_DGM_PORT_NUMBER)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (0);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (-1);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync}
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
53ffce10edad430eac13d39c63b4f2501452f50bvboxsyncstatic int
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncprotohandler1(struct libalias *la, struct ip *pip, struct alias_data *ah)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync{
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync AliasHandleUdpNbt(la, pip, ah->lnk, ah->aaddr, *ah->aport);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (0);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync}
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
53ffce10edad430eac13d39c63b4f2501452f50bvboxsyncstatic int
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncfingerprint2(struct libalias *la, struct ip *pip, struct alias_data *ah)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync{
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
f428c820be00a88cb87e3f70f666ca7b3513fd82vboxsync#ifdef VBOX
f428c820be00a88cb87e3f70f666ca7b3513fd82vboxsync NOREF(la);
f428c820be00a88cb87e3f70f666ca7b3513fd82vboxsync NOREF(pip);
f428c820be00a88cb87e3f70f666ca7b3513fd82vboxsync#endif
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync if (ah->dport == NULL || ah->sport == NULL || ah->lnk == NULL ||
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync ah->aaddr == NULL || ah->aport == NULL)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (-1);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (ntohs(*ah->dport) == NETBIOS_NS_PORT_NUMBER
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync || ntohs(*ah->sport) == NETBIOS_NS_PORT_NUMBER)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (0);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (-1);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync}
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
53ffce10edad430eac13d39c63b4f2501452f50bvboxsyncstatic int
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncprotohandler2in(struct libalias *la, struct ip *pip, struct alias_data *ah)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync{
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync AliasHandleUdpNbtNS(la, pip, ah->lnk, ah->aaddr, ah->aport,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync ah->oaddr, ah->dport);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (0);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync}
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
53ffce10edad430eac13d39c63b4f2501452f50bvboxsyncstatic int
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncprotohandler2out(struct libalias *la, struct ip *pip, struct alias_data *ah)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync{
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync AliasHandleUdpNbtNS(la, pip, ah->lnk, &pip->ip_src, ah->sport,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync ah->aaddr, ah->aport);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (0);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync}
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync/* Kernel module definition. */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifndef VBOX
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncstruct proto_handler handlers[] = {
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync {
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync .pri = 130,
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync .dir = IN|OUT,
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync .proto = UDP,
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync .fingerprint = &fingerprint1,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync .protohandler = &protohandler1
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync },
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync {
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync .pri = 140,
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync .dir = IN,
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync .proto = UDP,
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync .fingerprint = &fingerprint2,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync .protohandler = &protohandler2in
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync },
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync {
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync .pri = 140,
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync .dir = OUT,
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync .proto = UDP,
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync .fingerprint = &fingerprint2,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync .protohandler = &protohandler2out
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync },
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync { EOH }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync};
4dd5020158b69719fd7942ff7b996df2d4535bb4vboxsync#else /* VBOX */
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync#define handlers pData->nbt_module
4dd5020158b69719fd7942ff7b996df2d4535bb4vboxsync#endif /* VBOX */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifndef VBOX
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncstatic int
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncmod_handler(module_t mod, int type, void *data)
4dd5020158b69719fd7942ff7b996df2d4535bb4vboxsync#else /* VBOX */
ac50f06afde48ac748508b14be3d44428d3500d1vboxsyncstatic int nbt_alias_handler(PNATState pData, int type);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncint
ac50f06afde48ac748508b14be3d44428d3500d1vboxsyncnbt_alias_load(PNATState pData)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync{
ac50f06afde48ac748508b14be3d44428d3500d1vboxsync return nbt_alias_handler(pData, MOD_LOAD);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync}
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncint
ac50f06afde48ac748508b14be3d44428d3500d1vboxsyncnbt_alias_unload(PNATState pData)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync{
ac50f06afde48ac748508b14be3d44428d3500d1vboxsync return nbt_alias_handler(pData, MOD_UNLOAD);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync}
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncstatic int
ac50f06afde48ac748508b14be3d44428d3500d1vboxsyncnbt_alias_handler(PNATState pData, int type)
4dd5020158b69719fd7942ff7b996df2d4535bb4vboxsync#endif /* VBOX */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync{
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync int error;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef VBOX
bbb8aa81a86685a168b3b7f45a9ebd6b8849e059vboxsync if (handlers == NULL)
bbb8aa81a86685a168b3b7f45a9ebd6b8849e059vboxsync handlers = RTMemAllocZ(4 * sizeof(struct proto_handler));
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync handlers[0].pri = 130;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync handlers[0].dir = IN|OUT;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync handlers[0].proto = UDP;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync handlers[0].fingerprint = &fingerprint1;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync handlers[0].protohandler = &protohandler1;
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync handlers[1].pri = 140;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync handlers[1].dir = IN;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync handlers[1].proto = UDP;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync handlers[1].fingerprint = &fingerprint2;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync handlers[1].protohandler = &protohandler2in;
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync handlers[2].pri = 140;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync handlers[2].dir = OUT;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync handlers[2].proto = UDP;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync handlers[2].fingerprint = &fingerprint2;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync handlers[2].protohandler = &protohandler2out;
53ffce10edad430eac13d39c63b4f2501452f50bvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync handlers[3].pri = EOH;
4dd5020158b69719fd7942ff7b996df2d4535bb4vboxsync#endif /* VBOX */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync switch (type) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync case MOD_LOAD:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync error = 0;
ac50f06afde48ac748508b14be3d44428d3500d1vboxsync#ifdef VBOX
ac50f06afde48ac748508b14be3d44428d3500d1vboxsync LibAliasAttachHandlers(pData, handlers);
ac50f06afde48ac748508b14be3d44428d3500d1vboxsync#else
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync LibAliasAttachHandlers(handlers);
ac50f06afde48ac748508b14be3d44428d3500d1vboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync break;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync case MOD_UNLOAD:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync error = 0;
ac50f06afde48ac748508b14be3d44428d3500d1vboxsync#ifdef VBOX
ac50f06afde48ac748508b14be3d44428d3500d1vboxsync LibAliasDetachHandlers(pData, handlers);
67ca8b37c901c98c191bb7216ef7574c83a0b0f8vboxsync RTMemFree(handlers);
67ca8b37c901c98c191bb7216ef7574c83a0b0f8vboxsync handlers = NULL;
ac50f06afde48ac748508b14be3d44428d3500d1vboxsync#else
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync LibAliasDetachHandlers(handlers);
ac50f06afde48ac748508b14be3d44428d3500d1vboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync break;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync default:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync error = EINVAL;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (error);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync}
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifndef VBOX
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef _KERNEL
53ffce10edad430eac13d39c63b4f2501452f50bvboxsyncstatic
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncmoduledata_t alias_mod = {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync "alias_nbt", mod_handler, NULL
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync};
4dd5020158b69719fd7942ff7b996df2d4535bb4vboxsync#endif /* !VBOX */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef _KERNEL
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncDECLARE_MODULE(alias_nbt, alias_mod, SI_SUB_DRIVERS, SI_ORDER_SECOND);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncMODULE_VERSION(alias_nbt, 1);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncMODULE_DEPEND(alias_nbt, libalias, 1, 1, 1);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsynctypedef struct {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync struct in_addr oldaddr;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short oldport;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync struct in_addr newaddr;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short newport;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short *uh_sum;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync} NBTArguments;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsynctypedef struct {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync unsigned char type;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync unsigned char flags;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short id;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync struct in_addr source_ip;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short source_port;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short len;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short offset;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync} NbtDataHeader;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define OpQuery 0
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define OpUnknown 4
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define OpRegist 5
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define OpRelease 6
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define OpWACK 7
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define OpRefresh 8
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsynctypedef struct {
bae3590d00fff0ea0bb2d7f81e1b24137a0c7f21vboxsync#ifndef VBOX
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short nametrid;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short dir: 1, opcode:4, nmflags:7, rcode:4;
bae3590d00fff0ea0bb2d7f81e1b24137a0c7f21vboxsync#else
bae3590d00fff0ea0bb2d7f81e1b24137a0c7f21vboxsync unsigned nametrid:16;
bae3590d00fff0ea0bb2d7f81e1b24137a0c7f21vboxsync unsigned dir: 1, opcode:4, nmflags:7, rcode:4;
bae3590d00fff0ea0bb2d7f81e1b24137a0c7f21vboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short qdcount;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short ancount;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short nscount;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short arcount;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync} NbtNSHeader;
bae3590d00fff0ea0bb2d7f81e1b24137a0c7f21vboxsyncAssertCompileSize(NbtNSHeader, 12);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define FMT_ERR 0x1
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define SRV_ERR 0x2
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define IMP_ERR 0x4
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define RFS_ERR 0x5
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define ACT_ERR 0x6
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define CFT_ERR 0x7
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef LIBALIAS_DEBUG
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncstatic void
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncPrintRcode(u_char rcode)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync{
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync switch (rcode) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync case FMT_ERR:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("\nFormat Error.");
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync case SRV_ERR:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("\nSever failure.");
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync case IMP_ERR:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("\nUnsupported request error.\n");
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync case RFS_ERR:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("\nRefused error.\n");
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync case ACT_ERR:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("\nActive error.\n");
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync case CFT_ERR:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("\nName in conflict error.\n");
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync default:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("\n?%c?=%0x\n", '?', rcode);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync}
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync/* Handling Name field */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncstatic u_char *
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncAliasHandleName(u_char * p, char *pmax)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync{
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_char *s;
9567076fe0cf2d9a740942659248633c01608d0cvboxsync#ifdef LIBALIAS_DEBUG
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_char c;
9567076fe0cf2d9a740942659248633c01608d0cvboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync int compress;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Following length field */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (p == NULL || (char *)p >= pmax)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (NULL);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (*p & 0xc0) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync p = p + 2;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if ((char *)p > pmax)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (NULL);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return ((u_char *) p);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync while ((*p & 0x3f) != 0x00) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync s = p + 1;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (*p == 0x20)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync compress = 1;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync else
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync compress = 0;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Get next length field */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync p = (u_char *) (p + (*p & 0x3f) + 1);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if ((char *)p > pmax) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync p = NULL;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync break;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef LIBALIAS_DEBUG
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf(":");
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync while (s < p) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (compress == 1) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef LIBALIAS_DEBUG
9567076fe0cf2d9a740942659248633c01608d0cvboxsync c = (u_char) (((((*s & 0x0f) << 4) | (*(s + 1) & 0x0f)) - 0x11));
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (isprint(c))
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("%c", c);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync else
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("<0x%02x>", c);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync s += 2;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync } else {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef LIBALIAS_DEBUG
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("%c", *s);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync s++;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef LIBALIAS_DEBUG
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf(":");
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync fflush(stdout);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Set up to out of Name field */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (p == NULL || (char *)p >= pmax)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync p = NULL;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync else
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync p++;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return ((u_char *) p);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync}
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync/*
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * NetBios Datagram Handler (IP/UDP)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define DGM_DIRECT_UNIQ 0x10
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define DGM_DIRECT_GROUP 0x11
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define DGM_BROADCAST 0x12
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define DGM_ERROR 0x13
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define DGM_QUERY 0x14
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define DGM_POSITIVE_RES 0x15
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define DGM_NEGATIVE_RES 0x16
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncstatic int
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncAliasHandleUdpNbt(
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync struct libalias *la,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync struct ip *pip, /* IP packet to examine/patch */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync struct alias_link *lnk,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync struct in_addr *alias_address,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short alias_port
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync{
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync struct udphdr *uh;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync NbtDataHeader *ndh;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_char *p = NULL;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync char *pmax;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync (void)la;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync (void)lnk;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Calculate data length of UDP packet */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync uh = (struct udphdr *)ip_next(pip);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync pmax = (char *)uh + ntohs(uh->uh_ulen);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync ndh = (NbtDataHeader *)udp_next(uh);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if ((char *)(ndh + 1) > pmax)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (-1);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef LIBALIAS_DEBUG
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("\nType=%02x,", ndh->type);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync switch (ndh->type) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync case DGM_DIRECT_UNIQ:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync case DGM_DIRECT_GROUP:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync case DGM_BROADCAST:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync p = (u_char *) ndh + 14;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync p = AliasHandleName(p, pmax); /* Source Name */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync p = AliasHandleName(p, pmax); /* Destination Name */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync break;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync case DGM_ERROR:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync p = (u_char *) ndh + 11;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync break;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync case DGM_QUERY:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync case DGM_POSITIVE_RES:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync case DGM_NEGATIVE_RES:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync p = (u_char *) ndh + 10;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync p = AliasHandleName(p, pmax); /* Destination Name */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync break;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (p == NULL || (char *)p > pmax)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync p = NULL;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef LIBALIAS_DEBUG
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("%s:%d-->", inet_ntoa(ndh->source_ip), ntohs(ndh->source_port));
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Doing an IP address and Port number Translation */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (uh->uh_sum != 0) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync int acc;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short *sptr;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync acc = ndh->source_port;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync acc -= alias_port;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync sptr = (u_short *) & (ndh->source_ip);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync acc += *sptr++;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync acc += *sptr;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync sptr = (u_short *) alias_address;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync acc -= *sptr++;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync acc -= *sptr;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync ADJUST_CHECKSUM(acc, uh->uh_sum);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync ndh->source_ip = *alias_address;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync ndh->source_port = alias_port;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef LIBALIAS_DEBUG
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("%s:%d\n", inet_ntoa(ndh->source_ip), ntohs(ndh->source_port));
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync fflush(stdout);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return ((p == NULL) ? -1 : 0);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync}
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync/* Question Section */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define QS_TYPE_NB 0x0020
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define QS_TYPE_NBSTAT 0x0021
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define QS_CLAS_IN 0x0001
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsynctypedef struct {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short type; /* The type of Request */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short class; /* The class of Request */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync} NBTNsQuestion;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncstatic u_char *
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncAliasHandleQuestion(
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short count,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync NBTNsQuestion * q,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync char *pmax,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync NBTArguments * nbtarg)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync{
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync (void)nbtarg;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync while (count != 0) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Name Filed */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync q = (NBTNsQuestion *) AliasHandleName((u_char *) q, pmax);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (q == NULL || (char *)(q + 1) > pmax) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync q = NULL;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync break;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Type and Class filed */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync switch (ntohs(q->type)) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync case QS_TYPE_NB:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync case QS_TYPE_NBSTAT:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync q = q + 1;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync break;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync default:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef LIBALIAS_DEBUG
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("\nUnknown Type on Question %0x\n", ntohs(q->type));
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync break;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync count--;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Set up to out of Question Section */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return ((u_char *) q);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync}
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync/* Resource Record */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define RR_TYPE_A 0x0001
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define RR_TYPE_NS 0x0002
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define RR_TYPE_NULL 0x000a
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define RR_TYPE_NB 0x0020
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define RR_TYPE_NBSTAT 0x0021
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define RR_CLAS_IN 0x0001
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define SizeOfNsResource 8
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsynctypedef struct {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short type;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short class;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync unsigned int ttl;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short rdlen;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync} NBTNsResource;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define SizeOfNsRNB 6
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsynctypedef struct {
bae3590d00fff0ea0bb2d7f81e1b24137a0c7f21vboxsync#ifndef VBOX
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short g: 1 , ont:2, resv:13;
bae3590d00fff0ea0bb2d7f81e1b24137a0c7f21vboxsync#else
bae3590d00fff0ea0bb2d7f81e1b24137a0c7f21vboxsync unsigned g: 1 , ont:2, resv:13;
bae3590d00fff0ea0bb2d7f81e1b24137a0c7f21vboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync struct in_addr addr;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync} NBTNsRNB;
bae3590d00fff0ea0bb2d7f81e1b24137a0c7f21vboxsyncAssertCompileSize(NBTNsRNB, 8);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncstatic u_char *
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncAliasHandleResourceNB(
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync NBTNsResource * q,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync char *pmax,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync NBTArguments * nbtarg)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync{
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync NBTNsRNB *nb;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short bcount;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (q == NULL || (char *)(q + 1) > pmax)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (NULL);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Check out a length */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync bcount = ntohs(q->rdlen);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Forward to Resource NB position */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync nb = (NBTNsRNB *) ((u_char *) q + SizeOfNsResource);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Processing all in_addr array */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef LIBALIAS_DEBUG
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("NB rec[%s", inet_ntoa(nbtarg->oldaddr));
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("->%s, %dbytes] ", inet_ntoa(nbtarg->newaddr), bcount);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync while (nb != NULL && bcount != 0) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if ((char *)(nb + 1) > pmax) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync nb = NULL;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync break;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef LIBALIAS_DEBUG
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("<%s>", inet_ntoa(nb->addr));
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (!bcmp(&nbtarg->oldaddr, &nb->addr, sizeof(struct in_addr))) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (*nbtarg->uh_sum != 0) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync int acc;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short *sptr;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync sptr = (u_short *) & (nb->addr);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync acc = *sptr++;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync acc += *sptr;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync sptr = (u_short *) & (nbtarg->newaddr);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync acc -= *sptr++;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync acc -= *sptr;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync ADJUST_CHECKSUM(acc, *nbtarg->uh_sum);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync nb->addr = nbtarg->newaddr;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef LIBALIAS_DEBUG
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("O");
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef LIBALIAS_DEBUG
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync else {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf(".");
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync nb = (NBTNsRNB *) ((u_char *) nb + SizeOfNsRNB);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync bcount -= SizeOfNsRNB;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (nb == NULL || (char *)(nb + 1) > pmax) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync nb = NULL;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return ((u_char *) nb);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync}
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#define SizeOfResourceA 6
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsynctypedef struct {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync struct in_addr addr;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync} NBTNsResourceA;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncstatic u_char *
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncAliasHandleResourceA(
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync NBTNsResource * q,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync char *pmax,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync NBTArguments * nbtarg)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync{
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync NBTNsResourceA *a;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short bcount;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (q == NULL || (char *)(q + 1) > pmax)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (NULL);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Forward to Resource A position */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync a = (NBTNsResourceA *) ((u_char *) q + sizeof(NBTNsResource));
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Check out of length */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync bcount = ntohs(q->rdlen);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Processing all in_addr array */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef LIBALIAS_DEBUG
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("Arec [%s", inet_ntoa(nbtarg->oldaddr));
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("->%s]", inet_ntoa(nbtarg->newaddr));
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync while (bcount != 0) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (a == NULL || (char *)(a + 1) > pmax)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (NULL);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef LIBALIAS_DEBUG
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("..%s", inet_ntoa(a->addr));
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (!bcmp(&nbtarg->oldaddr, &a->addr, sizeof(struct in_addr))) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (*nbtarg->uh_sum != 0) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync int acc;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short *sptr;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync sptr = (u_short *) & (a->addr); /* Old */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync acc = *sptr++;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync acc += *sptr;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync sptr = (u_short *) & nbtarg->newaddr; /* New */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync acc -= *sptr++;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync acc -= *sptr;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync ADJUST_CHECKSUM(acc, *nbtarg->uh_sum);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync a->addr = nbtarg->newaddr;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync a++; /* XXXX */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync bcount -= SizeOfResourceA;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (a == NULL || (char *)(a + 1) > pmax)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync a = NULL;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return ((u_char *) a);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync}
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsynctypedef struct {
bae3590d00fff0ea0bb2d7f81e1b24137a0c7f21vboxsync#ifndef VBOX
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short opcode:4, flags:8, resv:4;
bae3590d00fff0ea0bb2d7f81e1b24137a0c7f21vboxsync#else
bae3590d00fff0ea0bb2d7f81e1b24137a0c7f21vboxsync u_short hidden; /* obviously not needed */
bae3590d00fff0ea0bb2d7f81e1b24137a0c7f21vboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync} NBTNsResourceNULL;
bae3590d00fff0ea0bb2d7f81e1b24137a0c7f21vboxsyncAssertCompileSize(NBTNsResourceNULL, 2);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncstatic u_char *
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncAliasHandleResourceNULL(
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync NBTNsResource * q,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync char *pmax,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync NBTArguments * nbtarg)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync{
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync NBTNsResourceNULL *n;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short bcount;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync (void)nbtarg;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (q == NULL || (char *)(q + 1) > pmax)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (NULL);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Forward to Resource NULL position */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync n = (NBTNsResourceNULL *) ((u_char *) q + sizeof(NBTNsResource));
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Check out of length */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync bcount = ntohs(q->rdlen);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Processing all in_addr array */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync while (bcount != 0) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if ((char *)(n + 1) > pmax) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync n = NULL;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync break;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync n++;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync bcount -= sizeof(NBTNsResourceNULL);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if ((char *)(n + 1) > pmax)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync n = NULL;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return ((u_char *) n);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync}
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncstatic u_char *
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncAliasHandleResourceNS(
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync NBTNsResource * q,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync char *pmax,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync NBTArguments * nbtarg)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync{
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync NBTNsResourceNULL *n;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short bcount;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync (void)nbtarg;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (q == NULL || (char *)(q + 1) > pmax)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (NULL);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Forward to Resource NULL position */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync n = (NBTNsResourceNULL *) ((u_char *) q + sizeof(NBTNsResource));
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Check out of length */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync bcount = ntohs(q->rdlen);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Resource Record Name Filed */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync q = (NBTNsResource *) AliasHandleName((u_char *) n, pmax); /* XXX */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (q == NULL || (char *)((u_char *) n + bcount) > pmax)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (NULL);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync else
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return ((u_char *) n + bcount);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync}
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsynctypedef struct {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short numnames;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync} NBTNsResourceNBSTAT;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncstatic u_char *
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncAliasHandleResourceNBSTAT(
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync NBTNsResource * q,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync char *pmax,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync NBTArguments * nbtarg)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync{
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync NBTNsResourceNBSTAT *n;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short bcount;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync (void)nbtarg;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (q == NULL || (char *)(q + 1) > pmax)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (NULL);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Forward to Resource NBSTAT position */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync n = (NBTNsResourceNBSTAT *) ((u_char *) q + sizeof(NBTNsResource));
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Check out of length */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync bcount = ntohs(q->rdlen);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (q == NULL || (char *)((u_char *) n + bcount) > pmax)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (NULL);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync else
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return ((u_char *) n + bcount);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync}
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncstatic u_char *
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncAliasHandleResource(
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short count,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync NBTNsResource * q,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync char *pmax,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync NBTArguments
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync * nbtarg)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync{
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync while (count != 0) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Resource Record Name Filed */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync q = (NBTNsResource *) AliasHandleName((u_char *) q, pmax);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (q == NULL || (char *)(q + 1) > pmax)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync break;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef LIBALIAS_DEBUG
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf("type=%02x, count=%d\n", ntohs(q->type), count);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Type and Class filed */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync switch (ntohs(q->type)) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync case RR_TYPE_NB:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync q = (NBTNsResource *) AliasHandleResourceNB(
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync q,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync pmax,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync nbtarg
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync );
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync break;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync case RR_TYPE_A:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync q = (NBTNsResource *) AliasHandleResourceA(
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync q,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync pmax,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync nbtarg
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync );
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync break;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync case RR_TYPE_NS:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync q = (NBTNsResource *) AliasHandleResourceNS(
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync q,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync pmax,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync nbtarg
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync );
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync break;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync case RR_TYPE_NULL:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync q = (NBTNsResource *) AliasHandleResourceNULL(
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync q,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync pmax,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync nbtarg
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync );
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync break;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync case RR_TYPE_NBSTAT:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync q = (NBTNsResource *) AliasHandleResourceNBSTAT(
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync q,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync pmax,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync nbtarg
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync );
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync break;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync default:
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef LIBALIAS_DEBUG
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf(
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync "\nUnknown Type of Resource %0x\n",
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync ntohs(q->type)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync );
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync fflush(stdout);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync break;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync count--;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return ((u_char *) q);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync}
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncstatic int
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsyncAliasHandleUdpNbtNS(
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync struct libalias *la,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync struct ip *pip, /* IP packet to examine/patch */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync struct alias_link *lnk,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync struct in_addr *alias_address,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short * alias_port,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync struct in_addr *original_address,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_short * original_port)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync{
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync struct udphdr *uh;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync NbtNSHeader *nsh;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync u_char *p;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync char *pmax;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync NBTArguments nbtarg;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync (void)la;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync (void)lnk;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Set up Common Parameter */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync nbtarg.oldaddr = *alias_address;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync nbtarg.oldport = *alias_port;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync nbtarg.newaddr = *original_address;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync nbtarg.newport = *original_port;
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Calculate data length of UDP packet */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync uh = (struct udphdr *)ip_next(pip);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync nbtarg.uh_sum = &(uh->uh_sum);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync nsh = (NbtNSHeader *)udp_next(uh);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync p = (u_char *) (nsh + 1);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync pmax = (char *)uh + ntohs(uh->uh_ulen);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if ((char *)(nsh + 1) > pmax)
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return (-1);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef LIBALIAS_DEBUG
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync printf(" [%s] ID=%02x, op=%01x, flag=%02x, rcode=%01x, qd=%04x"
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync ", an=%04x, ns=%04x, ar=%04x, [%d]-->",
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync nsh->dir ? "Response" : "Request",
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync nsh->nametrid,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync nsh->opcode,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync nsh->nmflags,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync nsh->rcode,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync ntohs(nsh->qdcount),
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync ntohs(nsh->ancount),
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync ntohs(nsh->nscount),
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync ntohs(nsh->arcount),
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync (u_char *) p - (u_char *) nsh
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync );
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Question Entries */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (ntohs(nsh->qdcount) != 0) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync p = AliasHandleQuestion(
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync ntohs(nsh->qdcount),
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync (NBTNsQuestion *) p,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync pmax,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync &nbtarg
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync );
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Answer Resource Records */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (ntohs(nsh->ancount) != 0) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync p = AliasHandleResource(
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync ntohs(nsh->ancount),
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync (NBTNsResource *) p,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync pmax,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync &nbtarg
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync );
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Authority Resource Recodrs */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (ntohs(nsh->nscount) != 0) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync p = AliasHandleResource(
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync ntohs(nsh->nscount),
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync (NBTNsResource *) p,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync pmax,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync &nbtarg
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync );
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync /* Additional Resource Recodrs */
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync if (ntohs(nsh->arcount) != 0) {
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync p = AliasHandleResource(
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync ntohs(nsh->arcount),
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync (NBTNsResource *) p,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync pmax,
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync &nbtarg
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync );
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync }
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#ifdef LIBALIAS_DEBUG
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync PrintRcode(nsh->rcode);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync#endif
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync return ((p == NULL) ? -1 : 0);
ae9ed83297460a052aeae98394d473e83aeafd1fvboxsync}