da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER START
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The contents of this file are subject to the terms of the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Common Development and Distribution License (the "License").
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You may not use this file except in compliance with the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * or http://www.opensolaris.org/os/licensing.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * See the License for the specific language governing permissions
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * and limitations under the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * When distributing Covered Code, include this CDDL HEADER in each
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If applicable, add the following below this CDDL HEADER, with the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * fields enclosed by brackets "[]" replaced with your own identifying
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * information: Portions Copyright [yyyy] [name of copyright owner]
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER END
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Use is subject to license terms.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#ifndef _SMB_NETBIOS_H_
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define _SMB_NETBIOS_H_
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <stdio.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <synch.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <pthread.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <strings.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <netinet/in.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <smbsrv/libsmbns.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <smbsrv/smbinfo.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <smbsrv/netbios.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define QUEUE_INSERT_TAIL(q, e) \
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ((e)->back) = (void *)((q)->back); \
7b59d02d2a384be9a08087b14defadd214b3c1ddjb ((e)->forw) = (void *)(q); \
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ((q)->back->forw) = (void *)(e); \
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ((q)->back) = (void *)(e);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define QUEUE_CLIP(e) \
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (e)->forw->back = (e)->back; \
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (e)->back->forw = (e)->forw; \
7b59d02d2a384be9a08087b14defadd214b3c1ddjb (e)->forw = 0; \
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (e)->back = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wrighttypedef enum {
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright NETBIOS_EVENT_START = 0,
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright NETBIOS_EVENT_STOP,
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright NETBIOS_EVENT_RESET,
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright NETBIOS_EVENT_NS_START,
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright NETBIOS_EVENT_NS_STOP,
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright NETBIOS_EVENT_DGM_START,
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright NETBIOS_EVENT_DGM_STOP,
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright NETBIOS_EVENT_BROWSER_START,
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright NETBIOS_EVENT_BROWSER_STOP,
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright NETBIOS_EVENT_TIMER_START,
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright NETBIOS_EVENT_TIMER_STOP,
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright NETBIOS_EVENT_ERROR,
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright NETBIOS_EVENT_DUMP
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright} netbios_event_t;
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wrighttypedef enum {
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright NETBIOS_STATE_INIT = 0,
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright NETBIOS_STATE_RUNNING,
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright NETBIOS_STATE_CLOSING,
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright NETBIOS_STATE_ERROR
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright} netbios_state_t;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wrighttypedef struct {
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright pthread_t s_tid;
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright boolean_t s_up;
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright} netbios_svc_t;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wrighttypedef struct {
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright mutex_t nbs_mtx;
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright cond_t nbs_cv;
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright netbios_svc_t nbs_ns;
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright netbios_svc_t nbs_dgm;
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright netbios_svc_t nbs_browser;
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright netbios_svc_t nbs_timer;
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright netbios_state_t nbs_state;
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright uint32_t nbs_errors;
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright char *nbs_last_event;
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright} netbios_service_t;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwchar smb_node_type;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#define SMB_NODETYPE_B 'B'
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#define SMB_NODETYPE_P 'P'
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#define SMB_NODETYPE_M 'M'
7b59d02d2a384be9a08087b14defadd214b3c1ddjb#define SMB_NODETYPE_H 'H'
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * NAME service definitions
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define ADDR_FLAG_INVALID 0x0000
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define ADDR_FLAG_VALID 0x0001
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwtypedef struct addr_entry {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct addr_entry *forw;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct addr_entry *back;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint32_t attributes;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint32_t conflict_timer;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint32_t refresh_ttl;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint32_t ttl;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct sockaddr_in sin;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int sinlen;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint32_t flags;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw} addr_entry_t;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The NODE_NAME ARRAY is an array of zero or more NUM_NAMES entries
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * of NODE_NAME records. Each NODE_NAME entry represents an active
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * name in the same NetBIOS scope as the requesting name in the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * local name table of the responder. RR_NAME is the requesting
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * name.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * NODE_NAME Entry:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +--- ---+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +--- NETBIOS FORMAT NAME ---+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +--- ---+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | NAME_FLAGS |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The NAME_FLAGS field:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 1 1 1 1 1 1
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | G | ONT |DRG|CNF|ACT|PRM| RESERVED |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The NAME_FLAGS field is defined as:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Symbol Bit(s) Description:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * RESERVED 7-15 Reserved for future use. Must be zero (0).
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * PRM 6 Permanent Name Flag. If one (1) then entry
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * is for the permanent node name. Flag is zero
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * (0) for all other names.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * ACT 5 Active Name Flag. All entries have this flag
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * set to one (1).
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CNF 4 Conflict Flag. If one (1) then name on this
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * node is in conflict.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * DRG 3 Deregister Flag. If one (1) then this name
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * is in the process of being deleted.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * ONT 1,2 Owner Node Type:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 00 = B node
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 01 = P node
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 10 = M node
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 11 = Reserved for future use
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * G 0 Group Name Flag.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * name.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If zero (0) then it is a UNIQUE NetBIOS name.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwtypedef struct name_entry {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct name_entry *forw;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct name_entry *back;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned char name[NETBIOS_NAME_SZ];
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned char scope[NETBIOS_DOMAIN_NAME_MAX];
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short attributes;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct addr_entry addr_list;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mutex_t mtx;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb} name_entry_t;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstruct name_question {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct name_entry *name;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned question_type;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned question_class;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw};
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstruct resource_record {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * These two flags and address are contained within RDATA
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * when rr_type==0x0020 (NB - NetBIOS general Name Service)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * and rr_class==0x01 (IN - Internet Class).
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct name_entry *name;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short rr_type;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short rr_class;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint32_t ttl;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short rdlength;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned char *rdata;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw};
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstruct name_packet {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short name_trn_id;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short info;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned qdcount; /* question entries */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned ancount; /* answer recs */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned nscount; /* authority recs */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned arcount; /* additional recs */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct name_question *question;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct resource_record *answer;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct resource_record *authority;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct resource_record *additional;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned char block_data[4]; /* begining of space */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw};
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_OPCODE_R 0x8000 /* RESPONSE flag: 1 bit */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_OPCODE_OPCODE_MASK 0x7800 /* OPCODE Field: 4 bits */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_OPCODE_QUERY 0x0000
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_OPCODE_REGISTRATION 0x2800
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_OPCODE_RELEASE 0x3000
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_OPCODE_WACK 0x3800
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_OPCODE_REFRESH 0x4000
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_OPCODE_MULTIHOME 0x7800
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_NM_FLAGS_AA 0x0400 /* Authoritative Answer:1 bit */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_NM_FLAGS_TC 0x0200 /* Truncation: 1 bit */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_NM_FLAGS_RD 0x0100 /* Recursion desired: 1 bit */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_NM_FLAGS_RA 0x0080 /* Recursion available: 1 bit */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_NM_FLAGS_x2 0x0040 /* reserved, mbz: 1 bit */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_NM_FLAGS_x1 0x0020 /* reserved, mbz: 1 bit */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_NM_FLAGS_B 0x0010 /* Broadcast: 1 bit */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_RCODE_MASK 0x000f /* RCODE Field: 4 bits */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define RCODE_FMT_ERR 0x0001
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define RCODE_SRV_ERR 0x0002
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define RCODE_NAM_ERR 0x0003
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define RCODE_IMP_ERR 0x0004
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define RCODE_RFS_ERR 0x0005
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define RCODE_ACT_ERR 0x0006
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define RCODE_CFT_ERR 0x0007
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NM_FLAGS_UNICAST 0
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NM_FLAGS_BROADCAST NAME_NM_FLAGS_B
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define PACKET_TYPE(x) ((x) & (NAME_OPCODE_R | NAME_OPCODE_OPCODE_MASK | \
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw NAME_NM_FLAGS_AA | NAME_NM_FLAGS_RD))
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define RCODE(x) ((x) & NAME_RCODE_MASK)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define POSITIVE_RESPONSE(x) (RCODE(x) == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NEGATIVE_RESPONSE(x) (RCODE(x) != 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define END_NODE_CHALLENGE_REGISTRATION_REQUEST \
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (NAME_OPCODE_REGISTRATION | NAME_NM_FLAGS_AA | NAME_NM_FLAGS_RD)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define END_NODE_CHALLENGE_NAME_REGISTRATION_RESPONSE \
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (NAME_OPCODE_R | END_NODE_CHALLENGE_REGISTRATION_REQUEST)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_QUERY_REQUEST \
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (NAME_OPCODE_QUERY | NAME_NM_FLAGS_RD)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_QUERY_RESPONSE \
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (NAME_OPCODE_R | NAME_QUERY_REQUEST | \
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw NAME_NM_FLAGS_AA | NAME_NM_FLAGS_RD)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NODE_STATUS_REQUEST \
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (NAME_OPCODE_QUERY)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NODE_STATUS_RESPONSE \
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (NAME_OPCODE_R | NODE_STATUS_REQUEST | NAME_NM_FLAGS_AA)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define REDIRECT_NAME_QUERY_RESPONSE \
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (NAME_OPCODE_R | NAME_QUERY_REQUEST | NAME_NM_FLAGS_RD)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_REFRESH_REQUEST \
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (NAME_OPCODE_REFRESH)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_REGISTRATION_REQUEST \
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (NAME_OPCODE_REGISTRATION | NAME_NM_FLAGS_RD)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_MULTIHOME_REGISTRATION_REQUEST \
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (NAME_OPCODE_MULTIHOME | NAME_NM_FLAGS_RD)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_REGISTRATION_RESPONSE \
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (NAME_OPCODE_R | NAME_REGISTRATION_REQUEST | NAME_NM_FLAGS_AA)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_RELEASE_REQUEST \
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (NAME_OPCODE_RELEASE)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_RELEASE_RESPONSE \
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (NAME_OPCODE_R | NAME_RELEASE_REQUEST | NAME_NM_FLAGS_AA)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define WACK_RESPONSE \
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (NAME_OPCODE_R | NAME_OPCODE_WACK | NAME_NM_FLAGS_AA)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_QUESTION_TYPE_NB 0x0020
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_QUESTION_TYPE_NBSTAT 0x0021
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_QUESTION_CLASS_IN 0x0001
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_RR_TYPE_A 0x0001 /* IP Address */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_RR_TYPE_NS 0x0002 /* Name Server */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_RR_TYPE_NULL 0x000A /* NULL */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_RR_TYPE_NB 0x0020 /* NetBIOS Name Service */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_RR_TYPE_NBSTAT 0x0021 /* NetBIOS Node Status */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_RR_CLASS_IN 0x0001 /* NetBIOS Node Status */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_NB_FLAGS_ONT_MASK (3<<13)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_NB_FLAGS_ONT_B (0<<13) /* B-node (broadcast) */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_NB_FLAGS_ONT_P (1<<13) /* P-node (point-to-point) */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_NB_FLAGS_ONT_M (2<<13) /* M-node (multicast) */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_NB_FLAGS_ONT_resv (3<<13)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_NB_FLAGS_G (1<<15) /* Group Name */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define UNICAST 0
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define BROADCAST 1
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define POINTCAST 2
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_ATTR_UNIQUE 0x0000
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_ATTR_GROUP 0x8000
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_ATTR_OWNER_NODE_TYPE 0x6000
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_ATTR_OWNER_TYPE_BNODE 0x0000
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_ATTR_OWNER_TYPE_PNODE 0x2000
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_ATTR_OWNER_TYPE_MNODE 0x4000
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_ATTR_OWNER_TYPE_HNODE 0x6000
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_ATTR_DEREGISTER 0x1000
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_ATTR_CONFLICT 0x0800
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_ATTR_ACTIVE_NAME 0x0400
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_ATTR_PERMANENT 0x0200
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_ATTR_RESERVED 0x01FF
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NAME_ATTR_LOCAL 0x0001
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NODE_TYPE(x) ((x) & NAME_ATTR_OWNER_NODE_TYPE))
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define IS_BNODE(x) (NODE_TYPE(x) == NAME_ATTR_OWNER_TYPE_BNODE)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define IS_PNODE(x) (NODE_TYPE(x) == NAME_ATTR_OWNER_TYPE_PNODE)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define IS_MNODE(x) (NODE_TYPE(x) == NAME_ATTR_OWNER_TYPE_MNODE)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define IS_HNODE(x) (NODE_TYPE(x) == NAME_ATTR_OWNER_TYPE_HNODE)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define IS_UNIQUE(x) (((x) & NAME_ATTR_GROUP) == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define IS_GROUP(x) (((x) & NAME_ATTR_GROUP) != 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define IS_PERMANENT(x) (((x) & NAME_ATTR_PERMANENT) != 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define IS_CONFLICTING(x) (((x) & NAME_ATTR_CONFLICT) != 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define IS_ACTIVE(x) (((x) & NAME_ATTR_ACTIVE) != 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define IS_DEGREGISTERED(x) (((x) & NAME_ATTR_ACTIVE) != 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define IS_LOCAL(x) (((x) & NAME_ATTR_LOCAL) != 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define IS_PUBLIC(x) (((x) & NAME_ATTR_LOCAL) == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define PUBLIC_BITS(x) ((x) & ~NAME_ATTR_RESERVED)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define SAME_SCOPE(scope, e) (strcmp((scope), ((e)->scope)) == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * STATISTICS Field of the NODE STATUS RESPONSE:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | UNIT_ID (Unique unit ID) |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | UNIT_ID,continued | JUMPERS | TEST_RESULT |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | VERSION_NUMBER | PERIOD_OF_STATISTICS |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | NUMBER_OF_CRCs | NUMBER_ALIGNMENT_ERRORS |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | NUMBER_OF_COLLISIONS | NUMBER_SEND_ABORTS |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | NUMBER_GOOD_SENDS |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | NUMBER_GOOD_RECEIVES |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | NUMBER_RETRANSMITS | NUMBER_NO_RESOURCE_CONDITIONS |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | NUMBER_FREE_COMMAND_BLOCKS | TOTAL_NUMBER_COMMAND_BLOCKS |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * |MAX_TOTAL_NUMBER_COMMAND_BLOCKS| NUMBER_PENDING_SESSIONS |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | MAX_NUMBER_PENDING_SESSIONS | MAX_TOTAL_SESSIONS_POSSIBLE |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SESSION_DATA_PACKET_SIZE |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwtypedef struct {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned char unit_id[6];
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned char jumpers;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned char test_result;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short version_number;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short statistical_period;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short crc_errors;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short alignment_errors;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short collisions;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short send_aborts;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned int good_sends;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned int good_receives;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short retransmits;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short no_resource_conditions;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short free_command_blocks;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short total_command_blocks;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short max_total_command_blocks;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short pending_sessions;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short max_pending_sessions;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short total_possible_sessions;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short session_data_packet_size;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw} node_status_response;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 4.4.1. NetBIOS DATAGRAM HEADER
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | MSG_TYPE | FLAGS | DGM_ID |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SOURCE_IP |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SOURCE_PORT | DGM_LENGTH |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | PACKET_OFFSET |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwtypedef struct {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned char msg_type;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned char flags;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short dgm_id;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint32_t source_ip;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short source_port;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short dgm_length;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short packet_offset;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw} datagram_header;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * MSG_TYPE values (in hexidecimal):
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 10 - DIRECT_UNIQUE DATAGRAM
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 11 - DIRECT_GROUP DATAGRAM
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 12 - BROADCAST DATAGRAM
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 13 - DATAGRAM ERROR
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 14 - DATAGRAM QUERY REQUEST
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 15 - DATAGRAM POSITIVE QUERY RESPONSE
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 16 - DATAGRAM NEGATIVE QUERY RESPONSE
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define DATAGRAM_TYPE_DIRECT_UNIQUE 0x10
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define DATAGRAM_TYPE_DIRECT_GROUP 0x11
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define DATAGRAM_TYPE_BROADCAST 0x12
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define DATAGRAM_TYPE_ERROR_DATAGRAM 0x13
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define DATAGRAM_TYPE_QUERY_REQUEST 0x14
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define DATAGRAM_TYPE_POSITIVE_RESPONSE 0x15
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define DATAGRAM_TYPE_NEGATIVE_RESPONSE 0x16
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Bit definitions of the FLAGS field:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 0 1 2 3 4 5 6 7
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +---+---+---+---+---+---+---+---+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | 0 | 0 | 0 | 0 | SNT | F | M |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +---+---+---+---+---+---+---+---+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Symbol Bit(s) Description
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * M 7 MORE flag, If set then more NetBIOS datagram
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * fragments follow.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * F 6 FIRST packet flag, If set then this is first
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * (and possibly only) fragment of NetBIOS
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * datagram
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * SNT 4,5 Source End-Node type:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 00 = B node
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 01 = P node
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 10 = M node
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 11 = H node
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * RESERVED 0-3 Reserved, must be zero (0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define DATAGRAM_FLAGS_MORE 0x01
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define DATAGRAM_FLAGS_FIRST 0x02
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define DATAGRAM_FLAGS_SRC_TYPE 0x0c
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define DATAGRAM_FLAGS_B_NODE 0x00
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define DATAGRAM_FLAGS_P_NODE 0x04
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define DATAGRAM_FLAGS_M_NODE 0x08
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define DATAGRAM_FLAGS_H_NODE 0x0C
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define DATAGRAM_FLAGS_NBDD 0x0c
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define DATAGRAM_FLAGS_RESERVED 0xf0
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 4.4.2. DIRECT_UNIQUE, DIRECT_GROUP, & BROADCAST DATAGRAM
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | MSG_TYPE | FLAGS | DGM_ID |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SOURCE_IP |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SOURCE_PORT | DGM_LENGTH |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | PACKET_OFFSET | |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * / SOURCE_NAME /
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * / /
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * / DESTINATION_NAME /
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * / /
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * / USER_DATA /
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * / /
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwtypedef struct {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw datagram_header header;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned char *source_name;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned char *destination_name;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned char *user_data;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw} datagram_packet;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 4.4.3. DATAGRAM ERROR PACKET
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | MSG_TYPE | FLAGS | DGM_ID |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SOURCE_IP |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SOURCE_PORT | ERROR_CODE |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * ERROR_CODE values (in hexidecimal):
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 82 - DESTINATION NAME NOT PRESENT
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 83 - INVALID SOURCE NAME FORMAT
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 84 - INVALID DESTINATION NAME FORMAT
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwtypedef struct {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned char msg_type;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned char flags;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short dgm_id;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint32_t source_ip;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short source_port;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned char error;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw} datagram_error_packet;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 4.4.4. DATAGRAM QUERY REQUEST
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | MSG_TYPE | FLAGS | DGM_ID |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SOURCE_IP |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SOURCE_PORT | |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * / DESTINATION_NAME /
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * / /
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 4.4.5. DATAGRAM POSITIVE AND NEGATIVE QUERY RESPONSE
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | MSG_TYPE | FLAGS | DGM_ID |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SOURCE_IP |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SOURCE_PORT | |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * / DESTINATION_NAME /
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * / /
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwtypedef struct datagram_query_packet {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned char msg_type;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned char flags;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short dgm_id;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint32_t source_ip;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short source_port;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned char destination_name[MAX_NAME_LENGTH];
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw} datagram_query_packet;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwtypedef struct datagram {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct datagram *forw;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct datagram *back;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct addr_entry inaddr;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int discard_timer;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned char packet_type;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned char flags;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short datagram_id;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct name_entry src;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct name_entry dest;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short offset;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned short data_length;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned char *data;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned int rawbytes;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsigned char rawbuf[MAX_DATAGRAM_LENGTH];
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw} datagram;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwtypedef struct datagram_queue {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct datagram *forw;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct datagram *back;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw} datagram_queue;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwtypedef struct name_queue {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct name_entry head;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mutex_t mtx;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw} name_queue_t;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
7b59d02d2a384be9a08087b14defadd214b3c1ddjbtypedef struct nbcache_iter {
7b59d02d2a384be9a08087b14defadd214b3c1ddjb HT_ITERATOR nbc_hti;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb struct name_entry *nbc_entry;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb} nbcache_iter_t;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NETBIOS_EMPTY_NAME (unsigned char *)""
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define NETBIOS_NAME_IS_STAR(name) \
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (bcmp(name, "*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", NETBIOS_NAME_SZ) == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright/*
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * NetBIOS service state machine interface
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright */
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wrightvoid smb_netbios_event(netbios_event_t);
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wrightvoid smb_netbios_wait(netbios_event_t);
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wrightvoid smb_netbios_sleep(time_t);
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wrightboolean_t smb_netbios_running(void);
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wrightboolean_t smb_netbios_error(void);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Name Cache Functions
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint smb_netbios_cache_init(void);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid smb_netbios_cache_fini(void);
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wrightvoid smb_netbios_cache_dump(FILE *fp);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint smb_netbios_cache_count(void);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid smb_netbios_cache_clean(void);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid smb_netbios_cache_reset_ttl(void);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbvoid smb_netbios_cache_delete_locals(name_queue_t *);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbvoid smb_netbios_cache_refresh(name_queue_t *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint smb_netbios_cache_insert(struct name_entry *name);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint smb_netbios_cache_insert_list(struct name_entry *name);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid smb_netbios_cache_delete(struct name_entry *name);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint smb_netbios_cache_delete_addr(struct name_entry *name);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstruct name_entry *smb_netbios_cache_lookup(struct name_entry *name);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstruct name_entry *smb_netbios_cache_lookup_addr(struct name_entry *name);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbvoid smb_netbios_cache_update_entry(struct name_entry *, struct name_entry *);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbvoid smb_netbios_cache_unlock_entry(struct name_entry *);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbunsigned char *smb_netbios_cache_status(unsigned char *, int, unsigned char *);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbint smb_netbios_cache_getfirst(nbcache_iter_t *);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbint smb_netbios_cache_getnext(nbcache_iter_t *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wrightvoid smb_netbios_name_dump(FILE *fp, struct name_entry *entry);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid smb_netbios_name_logf(struct name_entry *entry);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid smb_netbios_name_freeaddrs(struct name_entry *entry);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbstruct name_entry *smb_netbios_name_dup(struct name_entry *, int);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/* Name service functions */
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wrightvoid *smb_netbios_name_service(void *);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbvoid smb_init_name_struct(unsigned char *, char, unsigned char *, uint32_t,
7b59d02d2a384be9a08087b14defadd214b3c1ddjb unsigned short, uint32_t, uint32_t, struct name_entry *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstruct name_entry *smb_name_find_name(struct name_entry *name);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint smb_name_add_name(struct name_entry *name);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint smb_name_delete_name(struct name_entry *name);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid smb_name_unlock_name(struct name_entry *name);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid smb_netbios_name_config(void);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid smb_netbios_name_unconfig(void);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid smb_netbios_name_tick(void);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
7b59d02d2a384be9a08087b14defadd214b3c1ddjbint smb_first_level_name_encode(struct name_entry *, unsigned char *, int);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbint smb_first_level_name_decode(unsigned char *, struct name_entry *);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbvoid smb_encode_netbios_name(unsigned char *, char, unsigned char *,
7b59d02d2a384be9a08087b14defadd214b3c1ddjb struct name_entry *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/* Datagram service functions */
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wrightvoid *smb_netbios_datagram_service(void *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint smb_netbios_datagram_send(struct name_entry *,
7b59d02d2a384be9a08087b14defadd214b3c1ddjb struct name_entry *, unsigned char *, int);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid smb_netbios_datagram_tick(void);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/* browser functions */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid *smb_browser_dispatch(void *arg);
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wrightvoid *smb_browser_service(void *);
7b59d02d2a384be9a08087b14defadd214b3c1ddjbint smb_browser_load_transact_header(unsigned char *, int, int, int, char *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/* Netlogon function */
7b59d02d2a384be9a08087b14defadd214b3c1ddjbvoid smb_netlogon_receive(struct datagram *, char *, unsigned char *, int);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightvoid smb_netlogon_request(struct name_entry *, char *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#endif /* _SMB_NETBIOS_H_ */