1da6c28aaSamw /* 2da6c28aaSamw * CDDL HEADER START 3da6c28aaSamw * 4da6c28aaSamw * The contents of this file are subject to the terms of the 5da6c28aaSamw * Common Development and Distribution License (the "License"). 6da6c28aaSamw * You may not use this file except in compliance with the License. 7da6c28aaSamw * 8da6c28aaSamw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9da6c28aaSamw * or http://www.opensolaris.org/os/licensing. 10da6c28aaSamw * See the License for the specific language governing permissions 11da6c28aaSamw * and limitations under the License. 12da6c28aaSamw * 13da6c28aaSamw * When distributing Covered Code, include this CDDL HEADER in each 14da6c28aaSamw * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15da6c28aaSamw * If applicable, add the following below this CDDL HEADER, with the 16da6c28aaSamw * fields enclosed by brackets "[]" replaced with your own identifying 17da6c28aaSamw * information: Portions Copyright [yyyy] [name of copyright owner] 18da6c28aaSamw * 19da6c28aaSamw * CDDL HEADER END 20da6c28aaSamw */ 21da6c28aaSamw /* 2229bd2886SAlan Wright * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23da6c28aaSamw * Use is subject to license terms. 24da6c28aaSamw */ 25da6c28aaSamw 26da6c28aaSamw #ifndef _SMB_NETBIOS_H_ 27da6c28aaSamw #define _SMB_NETBIOS_H_ 28da6c28aaSamw 29da6c28aaSamw #include <stdio.h> 30da6c28aaSamw #include <synch.h> 31da6c28aaSamw #include <pthread.h> 32da6c28aaSamw #include <strings.h> 33da6c28aaSamw #include <netinet/in.h> 34da6c28aaSamw 35da6c28aaSamw #include <smbsrv/libsmbns.h> 36da6c28aaSamw 37da6c28aaSamw #include <smbsrv/smbinfo.h> 38da6c28aaSamw #include <smbsrv/netbios.h> 39da6c28aaSamw 40da6c28aaSamw #define QUEUE_INSERT_TAIL(q, e) \ 41da6c28aaSamw ((e)->back) = (void *)((q)->back); \ 42da6c28aaSamw ((e)->forw) = (void *)(q); \ 43da6c28aaSamw ((q)->back->forw) = (void *)(e); \ 44da6c28aaSamw ((q)->back) = (void *)(e); 45da6c28aaSamw 46da6c28aaSamw #define QUEUE_CLIP(e) \ 47da6c28aaSamw (e)->forw->back = (e)->back; \ 48da6c28aaSamw (e)->back->forw = (e)->forw; \ 49da6c28aaSamw (e)->forw = 0; \ 50da6c28aaSamw (e)->back = 0; 51da6c28aaSamw 52*a0aa776eSAlan Wright typedef enum { 53*a0aa776eSAlan Wright NETBIOS_EVENT_START = 0, 54*a0aa776eSAlan Wright NETBIOS_EVENT_STOP, 55*a0aa776eSAlan Wright NETBIOS_EVENT_RESET, 56*a0aa776eSAlan Wright NETBIOS_EVENT_NS_START, 57*a0aa776eSAlan Wright NETBIOS_EVENT_NS_STOP, 58*a0aa776eSAlan Wright NETBIOS_EVENT_DGM_START, 59*a0aa776eSAlan Wright NETBIOS_EVENT_DGM_STOP, 60*a0aa776eSAlan Wright NETBIOS_EVENT_BROWSER_START, 61*a0aa776eSAlan Wright NETBIOS_EVENT_BROWSER_STOP, 62*a0aa776eSAlan Wright NETBIOS_EVENT_TIMER_START, 63*a0aa776eSAlan Wright NETBIOS_EVENT_TIMER_STOP, 64*a0aa776eSAlan Wright NETBIOS_EVENT_ERROR, 65*a0aa776eSAlan Wright NETBIOS_EVENT_DUMP 66*a0aa776eSAlan Wright } netbios_event_t; 67da6c28aaSamw 68*a0aa776eSAlan Wright typedef enum { 69*a0aa776eSAlan Wright NETBIOS_STATE_INIT = 0, 70*a0aa776eSAlan Wright NETBIOS_STATE_RUNNING, 71*a0aa776eSAlan Wright NETBIOS_STATE_CLOSING, 72*a0aa776eSAlan Wright NETBIOS_STATE_ERROR 73*a0aa776eSAlan Wright } netbios_state_t; 74da6c28aaSamw 75*a0aa776eSAlan Wright typedef struct { 76*a0aa776eSAlan Wright pthread_t s_tid; 77*a0aa776eSAlan Wright boolean_t s_up; 78*a0aa776eSAlan Wright } netbios_svc_t; 79da6c28aaSamw 80*a0aa776eSAlan Wright typedef struct { 81*a0aa776eSAlan Wright mutex_t nbs_mtx; 82*a0aa776eSAlan Wright cond_t nbs_cv; 83*a0aa776eSAlan Wright netbios_svc_t nbs_ns; 84*a0aa776eSAlan Wright netbios_svc_t nbs_dgm; 85*a0aa776eSAlan Wright netbios_svc_t nbs_browser; 86*a0aa776eSAlan Wright netbios_svc_t nbs_timer; 87*a0aa776eSAlan Wright netbios_state_t nbs_state; 88*a0aa776eSAlan Wright uint32_t nbs_errors; 89*a0aa776eSAlan Wright char *nbs_last_event; 90*a0aa776eSAlan Wright } netbios_service_t; 91da6c28aaSamw 92da6c28aaSamw char smb_node_type; 93da6c28aaSamw 947b59d02dSjb150015 #define SMB_NODETYPE_B 'B' 957b59d02dSjb150015 #define SMB_NODETYPE_P 'P' 967b59d02dSjb150015 #define SMB_NODETYPE_M 'M' 977b59d02dSjb150015 #define SMB_NODETYPE_H 'H' 987b59d02dSjb150015 99da6c28aaSamw /* 100da6c28aaSamw * NAME service definitions 101da6c28aaSamw */ 102da6c28aaSamw #define ADDR_FLAG_INVALID 0x0000 103da6c28aaSamw #define ADDR_FLAG_VALID 0x0001 104da6c28aaSamw 105da6c28aaSamw typedef struct addr_entry { 106da6c28aaSamw struct addr_entry *forw; 107da6c28aaSamw struct addr_entry *back; 108da6c28aaSamw uint32_t attributes; 109da6c28aaSamw uint32_t conflict_timer; 110da6c28aaSamw uint32_t refresh_ttl; 111da6c28aaSamw uint32_t ttl; 112da6c28aaSamw struct sockaddr_in sin; 113da6c28aaSamw int sinlen; 114da6c28aaSamw uint32_t flags; 115da6c28aaSamw } addr_entry_t; 116da6c28aaSamw 117da6c28aaSamw /* 118da6c28aaSamw * The NODE_NAME ARRAY is an array of zero or more NUM_NAMES entries 119da6c28aaSamw * of NODE_NAME records. Each NODE_NAME entry represents an active 120da6c28aaSamw * name in the same NetBIOS scope as the requesting name in the 121da6c28aaSamw * local name table of the responder. RR_NAME is the requesting 122da6c28aaSamw * name. 123da6c28aaSamw * 124da6c28aaSamw * NODE_NAME Entry: 125da6c28aaSamw * 126da6c28aaSamw * 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 127da6c28aaSamw * 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 128da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 129da6c28aaSamw * | | 130da6c28aaSamw * +--- ---+ 131da6c28aaSamw * | | 132da6c28aaSamw * +--- NETBIOS FORMAT NAME ---+ 133da6c28aaSamw * | | 134da6c28aaSamw * +--- ---+ 135da6c28aaSamw * | | 136da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 137da6c28aaSamw * | NAME_FLAGS | 138da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 139da6c28aaSamw * 140da6c28aaSamw * The NAME_FLAGS field: 141da6c28aaSamw * 142da6c28aaSamw * 1 1 1 1 1 1 143da6c28aaSamw * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 144da6c28aaSamw * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ 145da6c28aaSamw * | G | ONT |DRG|CNF|ACT|PRM| RESERVED | 146da6c28aaSamw * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ 147da6c28aaSamw * 148da6c28aaSamw * The NAME_FLAGS field is defined as: 149da6c28aaSamw * 150da6c28aaSamw * Symbol Bit(s) Description: 151da6c28aaSamw * 152da6c28aaSamw * RESERVED 7-15 Reserved for future use. Must be zero (0). 153da6c28aaSamw * PRM 6 Permanent Name Flag. If one (1) then entry 154da6c28aaSamw * is for the permanent node name. Flag is zero 155da6c28aaSamw * (0) for all other names. 156da6c28aaSamw * ACT 5 Active Name Flag. All entries have this flag 157da6c28aaSamw * set to one (1). 158da6c28aaSamw * CNF 4 Conflict Flag. If one (1) then name on this 159da6c28aaSamw * node is in conflict. 160da6c28aaSamw * DRG 3 Deregister Flag. If one (1) then this name 161da6c28aaSamw * is in the process of being deleted. 162da6c28aaSamw * ONT 1,2 Owner Node Type: 163da6c28aaSamw * 00 = B node 164da6c28aaSamw * 01 = P node 165da6c28aaSamw * 10 = M node 166da6c28aaSamw * 11 = Reserved for future use 167da6c28aaSamw * G 0 Group Name Flag. 168da6c28aaSamw * name. 169da6c28aaSamw * If zero (0) then it is a UNIQUE NetBIOS name. 170da6c28aaSamw */ 171da6c28aaSamw 172da6c28aaSamw typedef struct name_entry { 173da6c28aaSamw struct name_entry *forw; 174da6c28aaSamw struct name_entry *back; 175da6c28aaSamw unsigned char name[NETBIOS_NAME_SZ]; 176da6c28aaSamw unsigned char scope[NETBIOS_DOMAIN_NAME_MAX]; 177da6c28aaSamw unsigned short attributes; 178da6c28aaSamw struct addr_entry addr_list; 179da6c28aaSamw mutex_t mtx; 1807b59d02dSjb150015 } name_entry_t; 181da6c28aaSamw 182da6c28aaSamw struct name_question { 183da6c28aaSamw struct name_entry *name; 184da6c28aaSamw unsigned question_type; 185da6c28aaSamw unsigned question_class; 186da6c28aaSamw }; 187da6c28aaSamw 188da6c28aaSamw struct resource_record { 189da6c28aaSamw /* 190da6c28aaSamw * These two flags and address are contained within RDATA 191da6c28aaSamw * when rr_type==0x0020 (NB - NetBIOS general Name Service) 192da6c28aaSamw * and rr_class==0x01 (IN - Internet Class). 193da6c28aaSamw */ 194da6c28aaSamw 195da6c28aaSamw struct name_entry *name; 196da6c28aaSamw unsigned short rr_type; 197da6c28aaSamw unsigned short rr_class; 198da6c28aaSamw uint32_t ttl; 199da6c28aaSamw unsigned short rdlength; 200da6c28aaSamw unsigned char *rdata; 201da6c28aaSamw }; 202da6c28aaSamw 203da6c28aaSamw struct name_packet { 204da6c28aaSamw unsigned short name_trn_id; 205da6c28aaSamw unsigned short info; 206da6c28aaSamw 207da6c28aaSamw unsigned qdcount; /* question entries */ 208da6c28aaSamw unsigned ancount; /* answer recs */ 209da6c28aaSamw unsigned nscount; /* authority recs */ 210da6c28aaSamw unsigned arcount; /* additional recs */ 211da6c28aaSamw 212da6c28aaSamw struct name_question *question; 213da6c28aaSamw struct resource_record *answer; 214da6c28aaSamw struct resource_record *authority; 215da6c28aaSamw struct resource_record *additional; 216da6c28aaSamw 217da6c28aaSamw unsigned char block_data[4]; /* begining of space */ 218da6c28aaSamw }; 219da6c28aaSamw 220da6c28aaSamw #define NAME_OPCODE_R 0x8000 /* RESPONSE flag: 1 bit */ 221da6c28aaSamw #define NAME_OPCODE_OPCODE_MASK 0x7800 /* OPCODE Field: 4 bits */ 222da6c28aaSamw #define NAME_OPCODE_QUERY 0x0000 223da6c28aaSamw #define NAME_OPCODE_REGISTRATION 0x2800 224da6c28aaSamw #define NAME_OPCODE_RELEASE 0x3000 225da6c28aaSamw #define NAME_OPCODE_WACK 0x3800 226da6c28aaSamw #define NAME_OPCODE_REFRESH 0x4000 227da6c28aaSamw #define NAME_OPCODE_MULTIHOME 0x7800 228da6c28aaSamw #define NAME_NM_FLAGS_AA 0x0400 /* Authoritative Answer:1 bit */ 229da6c28aaSamw #define NAME_NM_FLAGS_TC 0x0200 /* Truncation: 1 bit */ 230da6c28aaSamw #define NAME_NM_FLAGS_RD 0x0100 /* Recursion desired: 1 bit */ 231da6c28aaSamw #define NAME_NM_FLAGS_RA 0x0080 /* Recursion available: 1 bit */ 232da6c28aaSamw #define NAME_NM_FLAGS_x2 0x0040 /* reserved, mbz: 1 bit */ 233da6c28aaSamw #define NAME_NM_FLAGS_x1 0x0020 /* reserved, mbz: 1 bit */ 234da6c28aaSamw #define NAME_NM_FLAGS_B 0x0010 /* Broadcast: 1 bit */ 235da6c28aaSamw #define NAME_RCODE_MASK 0x000f /* RCODE Field: 4 bits */ 236da6c28aaSamw #define RCODE_FMT_ERR 0x0001 237da6c28aaSamw #define RCODE_SRV_ERR 0x0002 238da6c28aaSamw #define RCODE_NAM_ERR 0x0003 239da6c28aaSamw #define RCODE_IMP_ERR 0x0004 240da6c28aaSamw #define RCODE_RFS_ERR 0x0005 241da6c28aaSamw #define RCODE_ACT_ERR 0x0006 242da6c28aaSamw #define RCODE_CFT_ERR 0x0007 243da6c28aaSamw 244da6c28aaSamw #define NM_FLAGS_UNICAST 0 245da6c28aaSamw #define NM_FLAGS_BROADCAST NAME_NM_FLAGS_B 246da6c28aaSamw 247da6c28aaSamw #define PACKET_TYPE(x) ((x) & (NAME_OPCODE_R | NAME_OPCODE_OPCODE_MASK | \ 248da6c28aaSamw NAME_NM_FLAGS_AA | NAME_NM_FLAGS_RD)) 249da6c28aaSamw 250da6c28aaSamw #define RCODE(x) ((x) & NAME_RCODE_MASK) 251da6c28aaSamw #define POSITIVE_RESPONSE(x) (RCODE(x) == 0) 252da6c28aaSamw #define NEGATIVE_RESPONSE(x) (RCODE(x) != 0) 253da6c28aaSamw 254da6c28aaSamw #define END_NODE_CHALLENGE_REGISTRATION_REQUEST \ 255da6c28aaSamw (NAME_OPCODE_REGISTRATION | NAME_NM_FLAGS_AA | NAME_NM_FLAGS_RD) 256da6c28aaSamw #define END_NODE_CHALLENGE_NAME_REGISTRATION_RESPONSE \ 257da6c28aaSamw (NAME_OPCODE_R | END_NODE_CHALLENGE_REGISTRATION_REQUEST) 258da6c28aaSamw 259da6c28aaSamw #define NAME_QUERY_REQUEST \ 260da6c28aaSamw (NAME_OPCODE_QUERY | NAME_NM_FLAGS_RD) 261da6c28aaSamw #define NAME_QUERY_RESPONSE \ 262da6c28aaSamw (NAME_OPCODE_R | NAME_QUERY_REQUEST | \ 263da6c28aaSamw NAME_NM_FLAGS_AA | NAME_NM_FLAGS_RD) 264da6c28aaSamw 265da6c28aaSamw #define NODE_STATUS_REQUEST \ 266da6c28aaSamw (NAME_OPCODE_QUERY) 267da6c28aaSamw #define NODE_STATUS_RESPONSE \ 268da6c28aaSamw (NAME_OPCODE_R | NODE_STATUS_REQUEST | NAME_NM_FLAGS_AA) 269da6c28aaSamw 270da6c28aaSamw #define REDIRECT_NAME_QUERY_RESPONSE \ 271da6c28aaSamw (NAME_OPCODE_R | NAME_QUERY_REQUEST | NAME_NM_FLAGS_RD) 272da6c28aaSamw 273da6c28aaSamw #define NAME_REFRESH_REQUEST \ 274da6c28aaSamw (NAME_OPCODE_REFRESH) 275da6c28aaSamw #define NAME_REGISTRATION_REQUEST \ 276da6c28aaSamw (NAME_OPCODE_REGISTRATION | NAME_NM_FLAGS_RD) 277da6c28aaSamw #define NAME_MULTIHOME_REGISTRATION_REQUEST \ 278da6c28aaSamw (NAME_OPCODE_MULTIHOME | NAME_NM_FLAGS_RD) 279da6c28aaSamw #define NAME_REGISTRATION_RESPONSE \ 280da6c28aaSamw (NAME_OPCODE_R | NAME_REGISTRATION_REQUEST | NAME_NM_FLAGS_AA) 281da6c28aaSamw 282da6c28aaSamw #define NAME_RELEASE_REQUEST \ 283da6c28aaSamw (NAME_OPCODE_RELEASE) 284da6c28aaSamw #define NAME_RELEASE_RESPONSE \ 285da6c28aaSamw (NAME_OPCODE_R | NAME_RELEASE_REQUEST | NAME_NM_FLAGS_AA) 286da6c28aaSamw 287da6c28aaSamw #define WACK_RESPONSE \ 288da6c28aaSamw (NAME_OPCODE_R | NAME_OPCODE_WACK | NAME_NM_FLAGS_AA) 289da6c28aaSamw 290da6c28aaSamw #define NAME_QUESTION_TYPE_NB 0x0020 291da6c28aaSamw #define NAME_QUESTION_TYPE_NBSTAT 0x0021 292da6c28aaSamw #define NAME_QUESTION_CLASS_IN 0x0001 293da6c28aaSamw 294da6c28aaSamw 295da6c28aaSamw #define NAME_RR_TYPE_A 0x0001 /* IP Address */ 296da6c28aaSamw #define NAME_RR_TYPE_NS 0x0002 /* Name Server */ 297da6c28aaSamw #define NAME_RR_TYPE_NULL 0x000A /* NULL */ 298da6c28aaSamw #define NAME_RR_TYPE_NB 0x0020 /* NetBIOS Name Service */ 299da6c28aaSamw #define NAME_RR_TYPE_NBSTAT 0x0021 /* NetBIOS Node Status */ 300da6c28aaSamw 301da6c28aaSamw #define NAME_RR_CLASS_IN 0x0001 /* NetBIOS Node Status */ 302da6c28aaSamw 303da6c28aaSamw #define NAME_NB_FLAGS_ONT_MASK (3<<13) 304da6c28aaSamw #define NAME_NB_FLAGS_ONT_B (0<<13) /* B-node (broadcast) */ 305da6c28aaSamw #define NAME_NB_FLAGS_ONT_P (1<<13) /* P-node (point-to-point) */ 306da6c28aaSamw #define NAME_NB_FLAGS_ONT_M (2<<13) /* M-node (multicast) */ 307da6c28aaSamw #define NAME_NB_FLAGS_ONT_resv (3<<13) 308da6c28aaSamw #define NAME_NB_FLAGS_G (1<<15) /* Group Name */ 309da6c28aaSamw 310da6c28aaSamw #define UNICAST 0 311da6c28aaSamw #define BROADCAST 1 312da6c28aaSamw #define POINTCAST 2 313da6c28aaSamw 314da6c28aaSamw #define NAME_ATTR_UNIQUE 0x0000 315da6c28aaSamw #define NAME_ATTR_GROUP 0x8000 316da6c28aaSamw #define NAME_ATTR_OWNER_NODE_TYPE 0x6000 317da6c28aaSamw #define NAME_ATTR_OWNER_TYPE_BNODE 0x0000 318da6c28aaSamw #define NAME_ATTR_OWNER_TYPE_PNODE 0x2000 319da6c28aaSamw #define NAME_ATTR_OWNER_TYPE_MNODE 0x4000 320da6c28aaSamw #define NAME_ATTR_OWNER_TYPE_HNODE 0x6000 321da6c28aaSamw #define NAME_ATTR_DEREGISTER 0x1000 322da6c28aaSamw #define NAME_ATTR_CONFLICT 0x0800 323da6c28aaSamw #define NAME_ATTR_ACTIVE_NAME 0x0400 324da6c28aaSamw #define NAME_ATTR_PERMANENT 0x0200 325da6c28aaSamw #define NAME_ATTR_RESERVED 0x01FF 326da6c28aaSamw #define NAME_ATTR_LOCAL 0x0001 327da6c28aaSamw 328da6c28aaSamw #define NODE_TYPE(x) ((x) & NAME_ATTR_OWNER_NODE_TYPE)) 329da6c28aaSamw #define IS_BNODE(x) (NODE_TYPE(x) == NAME_ATTR_OWNER_TYPE_BNODE) 330da6c28aaSamw #define IS_PNODE(x) (NODE_TYPE(x) == NAME_ATTR_OWNER_TYPE_PNODE) 331da6c28aaSamw #define IS_MNODE(x) (NODE_TYPE(x) == NAME_ATTR_OWNER_TYPE_MNODE) 332da6c28aaSamw #define IS_HNODE(x) (NODE_TYPE(x) == NAME_ATTR_OWNER_TYPE_HNODE) 333da6c28aaSamw 334da6c28aaSamw #define IS_UNIQUE(x) (((x) & NAME_ATTR_GROUP) == 0) 335da6c28aaSamw #define IS_GROUP(x) (((x) & NAME_ATTR_GROUP) != 0) 336da6c28aaSamw #define IS_PERMANENT(x) (((x) & NAME_ATTR_PERMANENT) != 0) 337da6c28aaSamw #define IS_CONFLICTING(x) (((x) & NAME_ATTR_CONFLICT) != 0) 338da6c28aaSamw #define IS_ACTIVE(x) (((x) & NAME_ATTR_ACTIVE) != 0) 339da6c28aaSamw #define IS_DEGREGISTERED(x) (((x) & NAME_ATTR_ACTIVE) != 0) 340da6c28aaSamw 341da6c28aaSamw #define IS_LOCAL(x) (((x) & NAME_ATTR_LOCAL) != 0) 342da6c28aaSamw #define IS_PUBLIC(x) (((x) & NAME_ATTR_LOCAL) == 0) 343da6c28aaSamw #define PUBLIC_BITS(x) ((x) & ~NAME_ATTR_RESERVED) 344da6c28aaSamw 345da6c28aaSamw #define SAME_SCOPE(scope, e) (strcmp((scope), ((e)->scope)) == 0) 346da6c28aaSamw 347da6c28aaSamw /* 348da6c28aaSamw * STATISTICS Field of the NODE STATUS RESPONSE: 349da6c28aaSamw * 350da6c28aaSamw * 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 351da6c28aaSamw * 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 352da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 353da6c28aaSamw * | UNIT_ID (Unique unit ID) | 354da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 355da6c28aaSamw * | UNIT_ID,continued | JUMPERS | TEST_RESULT | 356da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 357da6c28aaSamw * | VERSION_NUMBER | PERIOD_OF_STATISTICS | 358da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 359da6c28aaSamw * | NUMBER_OF_CRCs | NUMBER_ALIGNMENT_ERRORS | 360da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 361da6c28aaSamw * | NUMBER_OF_COLLISIONS | NUMBER_SEND_ABORTS | 362da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 363da6c28aaSamw * | NUMBER_GOOD_SENDS | 364da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 365da6c28aaSamw * | NUMBER_GOOD_RECEIVES | 366da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 367da6c28aaSamw * | NUMBER_RETRANSMITS | NUMBER_NO_RESOURCE_CONDITIONS | 368da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 369da6c28aaSamw * | NUMBER_FREE_COMMAND_BLOCKS | TOTAL_NUMBER_COMMAND_BLOCKS | 370da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 371da6c28aaSamw * |MAX_TOTAL_NUMBER_COMMAND_BLOCKS| NUMBER_PENDING_SESSIONS | 372da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 373da6c28aaSamw * | MAX_NUMBER_PENDING_SESSIONS | MAX_TOTAL_SESSIONS_POSSIBLE | 374da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 375da6c28aaSamw * | SESSION_DATA_PACKET_SIZE | 376da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 377da6c28aaSamw */ 378da6c28aaSamw 379da6c28aaSamw typedef struct { 380da6c28aaSamw unsigned char unit_id[6]; 381da6c28aaSamw unsigned char jumpers; 382da6c28aaSamw unsigned char test_result; 383da6c28aaSamw unsigned short version_number; 384da6c28aaSamw unsigned short statistical_period; 385da6c28aaSamw unsigned short crc_errors; 386da6c28aaSamw unsigned short alignment_errors; 387da6c28aaSamw unsigned short collisions; 388da6c28aaSamw unsigned short send_aborts; 389da6c28aaSamw unsigned int good_sends; 390da6c28aaSamw unsigned int good_receives; 391da6c28aaSamw unsigned short retransmits; 392da6c28aaSamw unsigned short no_resource_conditions; 393da6c28aaSamw unsigned short free_command_blocks; 394da6c28aaSamw unsigned short total_command_blocks; 395da6c28aaSamw unsigned short max_total_command_blocks; 396da6c28aaSamw unsigned short pending_sessions; 397da6c28aaSamw unsigned short max_pending_sessions; 398da6c28aaSamw unsigned short total_possible_sessions; 399da6c28aaSamw unsigned short session_data_packet_size; 400da6c28aaSamw } node_status_response; 401da6c28aaSamw 402da6c28aaSamw /* 403da6c28aaSamw * 4.4.1. NetBIOS DATAGRAM HEADER 404da6c28aaSamw * 405da6c28aaSamw * 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 406da6c28aaSamw * 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 407da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 408da6c28aaSamw * | MSG_TYPE | FLAGS | DGM_ID | 409da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 410da6c28aaSamw * | SOURCE_IP | 411da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 412da6c28aaSamw * | SOURCE_PORT | DGM_LENGTH | 413da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 414da6c28aaSamw * | PACKET_OFFSET | 415da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 416da6c28aaSamw */ 417da6c28aaSamw typedef struct { 418da6c28aaSamw unsigned char msg_type; 419da6c28aaSamw unsigned char flags; 420da6c28aaSamw unsigned short dgm_id; 421da6c28aaSamw uint32_t source_ip; 422da6c28aaSamw unsigned short source_port; 423da6c28aaSamw unsigned short dgm_length; 424da6c28aaSamw unsigned short packet_offset; 425da6c28aaSamw } datagram_header; 426da6c28aaSamw 427da6c28aaSamw /* 428da6c28aaSamw * MSG_TYPE values (in hexidecimal): 429da6c28aaSamw * 430da6c28aaSamw * 10 - DIRECT_UNIQUE DATAGRAM 431da6c28aaSamw * 11 - DIRECT_GROUP DATAGRAM 432da6c28aaSamw * 12 - BROADCAST DATAGRAM 433da6c28aaSamw * 13 - DATAGRAM ERROR 434da6c28aaSamw * 14 - DATAGRAM QUERY REQUEST 435da6c28aaSamw * 15 - DATAGRAM POSITIVE QUERY RESPONSE 436da6c28aaSamw * 16 - DATAGRAM NEGATIVE QUERY RESPONSE 437da6c28aaSamw */ 438da6c28aaSamw #define DATAGRAM_TYPE_DIRECT_UNIQUE 0x10 439da6c28aaSamw #define DATAGRAM_TYPE_DIRECT_GROUP 0x11 440da6c28aaSamw #define DATAGRAM_TYPE_BROADCAST 0x12 441da6c28aaSamw #define DATAGRAM_TYPE_ERROR_DATAGRAM 0x13 442da6c28aaSamw #define DATAGRAM_TYPE_QUERY_REQUEST 0x14 443da6c28aaSamw #define DATAGRAM_TYPE_POSITIVE_RESPONSE 0x15 444da6c28aaSamw #define DATAGRAM_TYPE_NEGATIVE_RESPONSE 0x16 445da6c28aaSamw 446da6c28aaSamw 447da6c28aaSamw /* 448da6c28aaSamw * Bit definitions of the FLAGS field: 449da6c28aaSamw * 450da6c28aaSamw * 0 1 2 3 4 5 6 7 451da6c28aaSamw * +---+---+---+---+---+---+---+---+ 452da6c28aaSamw * | 0 | 0 | 0 | 0 | SNT | F | M | 453da6c28aaSamw * +---+---+---+---+---+---+---+---+ 454da6c28aaSamw * 455da6c28aaSamw * Symbol Bit(s) Description 456da6c28aaSamw * 457da6c28aaSamw * M 7 MORE flag, If set then more NetBIOS datagram 458da6c28aaSamw * fragments follow. 459da6c28aaSamw * 460da6c28aaSamw * F 6 FIRST packet flag, If set then this is first 461da6c28aaSamw * (and possibly only) fragment of NetBIOS 462da6c28aaSamw * datagram 463da6c28aaSamw * 464da6c28aaSamw * SNT 4,5 Source End-Node type: 465da6c28aaSamw * 00 = B node 466da6c28aaSamw * 01 = P node 467da6c28aaSamw * 10 = M node 468da6c28aaSamw * 11 = H node 469da6c28aaSamw * RESERVED 0-3 Reserved, must be zero (0) 470da6c28aaSamw */ 471da6c28aaSamw #define DATAGRAM_FLAGS_MORE 0x01 472da6c28aaSamw #define DATAGRAM_FLAGS_FIRST 0x02 473da6c28aaSamw #define DATAGRAM_FLAGS_SRC_TYPE 0x0c 474da6c28aaSamw #define DATAGRAM_FLAGS_B_NODE 0x00 475da6c28aaSamw #define DATAGRAM_FLAGS_P_NODE 0x04 476da6c28aaSamw #define DATAGRAM_FLAGS_M_NODE 0x08 477da6c28aaSamw #define DATAGRAM_FLAGS_H_NODE 0x0C 478da6c28aaSamw #define DATAGRAM_FLAGS_NBDD 0x0c 479da6c28aaSamw #define DATAGRAM_FLAGS_RESERVED 0xf0 480da6c28aaSamw 481da6c28aaSamw /* 482da6c28aaSamw * 4.4.2. DIRECT_UNIQUE, DIRECT_GROUP, & BROADCAST DATAGRAM 483da6c28aaSamw * 484da6c28aaSamw * 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 485da6c28aaSamw * 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 486da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 487da6c28aaSamw * | MSG_TYPE | FLAGS | DGM_ID | 488da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 489da6c28aaSamw * | SOURCE_IP | 490da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 491da6c28aaSamw * | SOURCE_PORT | DGM_LENGTH | 492da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 493da6c28aaSamw * | PACKET_OFFSET | | 494da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 495da6c28aaSamw * | | 496da6c28aaSamw * / SOURCE_NAME / 497da6c28aaSamw * / / 498da6c28aaSamw * | | 499da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 500da6c28aaSamw * | | 501da6c28aaSamw * / DESTINATION_NAME / 502da6c28aaSamw * / / 503da6c28aaSamw * | | 504da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 505da6c28aaSamw * | | 506da6c28aaSamw * / USER_DATA / 507da6c28aaSamw * / / 508da6c28aaSamw * | | 509da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 510da6c28aaSamw */ 511da6c28aaSamw typedef struct { 512da6c28aaSamw datagram_header header; 513da6c28aaSamw unsigned char *source_name; 514da6c28aaSamw unsigned char *destination_name; 515da6c28aaSamw unsigned char *user_data; 516da6c28aaSamw } datagram_packet; 517da6c28aaSamw 518da6c28aaSamw 519da6c28aaSamw /* 520da6c28aaSamw * 4.4.3. DATAGRAM ERROR PACKET 521da6c28aaSamw * 522da6c28aaSamw * 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 523da6c28aaSamw * 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 524da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 525da6c28aaSamw * | MSG_TYPE | FLAGS | DGM_ID | 526da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 527da6c28aaSamw * | SOURCE_IP | 528da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 529da6c28aaSamw * | SOURCE_PORT | ERROR_CODE | 530da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 531da6c28aaSamw * 532da6c28aaSamw * ERROR_CODE values (in hexidecimal): 533da6c28aaSamw * 534da6c28aaSamw * 82 - DESTINATION NAME NOT PRESENT 535da6c28aaSamw * 83 - INVALID SOURCE NAME FORMAT 536da6c28aaSamw * 84 - INVALID DESTINATION NAME FORMAT 537da6c28aaSamw */ 538da6c28aaSamw 539da6c28aaSamw typedef struct { 540da6c28aaSamw unsigned char msg_type; 541da6c28aaSamw unsigned char flags; 542da6c28aaSamw unsigned short dgm_id; 543da6c28aaSamw uint32_t source_ip; 544da6c28aaSamw unsigned short source_port; 545da6c28aaSamw unsigned char error; 546da6c28aaSamw } datagram_error_packet; 547da6c28aaSamw 548da6c28aaSamw /* 549da6c28aaSamw * 4.4.4. DATAGRAM QUERY REQUEST 550da6c28aaSamw * 551da6c28aaSamw * 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 552da6c28aaSamw * 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 553da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 554da6c28aaSamw * | MSG_TYPE | FLAGS | DGM_ID | 555da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 556da6c28aaSamw * | SOURCE_IP | 557da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 558da6c28aaSamw * | SOURCE_PORT | | 559da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + 560da6c28aaSamw * | | 561da6c28aaSamw * / DESTINATION_NAME / 562da6c28aaSamw * / / 563da6c28aaSamw * | | 564da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 565da6c28aaSamw * 566da6c28aaSamw * 4.4.5. DATAGRAM POSITIVE AND NEGATIVE QUERY RESPONSE 567da6c28aaSamw * 568da6c28aaSamw * 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 569da6c28aaSamw * 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 570da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 571da6c28aaSamw * | MSG_TYPE | FLAGS | DGM_ID | 572da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 573da6c28aaSamw * | SOURCE_IP | 574da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 575da6c28aaSamw * | SOURCE_PORT | | 576da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + 577da6c28aaSamw * | | 578da6c28aaSamw * / DESTINATION_NAME / 579da6c28aaSamw * / / 580da6c28aaSamw * | | 581da6c28aaSamw * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 582da6c28aaSamw */ 583da6c28aaSamw 584da6c28aaSamw typedef struct datagram_query_packet { 585da6c28aaSamw unsigned char msg_type; 586da6c28aaSamw unsigned char flags; 587da6c28aaSamw unsigned short dgm_id; 588da6c28aaSamw uint32_t source_ip; 589da6c28aaSamw unsigned short source_port; 590da6c28aaSamw unsigned char destination_name[MAX_NAME_LENGTH]; 591da6c28aaSamw } datagram_query_packet; 592da6c28aaSamw 593da6c28aaSamw 594da6c28aaSamw typedef struct datagram { 595da6c28aaSamw struct datagram *forw; 596da6c28aaSamw struct datagram *back; 597da6c28aaSamw struct addr_entry inaddr; 598da6c28aaSamw int discard_timer; 599da6c28aaSamw unsigned char packet_type; 600da6c28aaSamw unsigned char flags; 601da6c28aaSamw unsigned short datagram_id; 602da6c28aaSamw struct name_entry src; 603da6c28aaSamw struct name_entry dest; 604da6c28aaSamw unsigned short offset; 605da6c28aaSamw unsigned short data_length; 606da6c28aaSamw unsigned char *data; 607da6c28aaSamw unsigned int rawbytes; 608da6c28aaSamw unsigned char rawbuf[MAX_DATAGRAM_LENGTH]; 609da6c28aaSamw } datagram; 610da6c28aaSamw 611da6c28aaSamw typedef struct datagram_queue { 612da6c28aaSamw struct datagram *forw; 613da6c28aaSamw struct datagram *back; 614da6c28aaSamw } datagram_queue; 615da6c28aaSamw 616da6c28aaSamw typedef struct name_queue { 617da6c28aaSamw struct name_entry head; 618da6c28aaSamw mutex_t mtx; 619da6c28aaSamw } name_queue_t; 620da6c28aaSamw 6217b59d02dSjb150015 typedef struct nbcache_iter { 6227b59d02dSjb150015 HT_ITERATOR nbc_hti; 6237b59d02dSjb150015 struct name_entry *nbc_entry; 6247b59d02dSjb150015 } nbcache_iter_t; 6257b59d02dSjb150015 626da6c28aaSamw #define NETBIOS_EMPTY_NAME (unsigned char *)"" 627da6c28aaSamw 628da6c28aaSamw #define NETBIOS_NAME_IS_STAR(name) \ 629da6c28aaSamw (bcmp(name, "*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", NETBIOS_NAME_SZ) == 0) 630da6c28aaSamw 631*a0aa776eSAlan Wright 632*a0aa776eSAlan Wright /* 633*a0aa776eSAlan Wright * NetBIOS service state machine interface 634*a0aa776eSAlan Wright */ 635*a0aa776eSAlan Wright void smb_netbios_event(netbios_event_t); 636*a0aa776eSAlan Wright void smb_netbios_wait(netbios_event_t); 637*a0aa776eSAlan Wright void smb_netbios_sleep(time_t); 638*a0aa776eSAlan Wright boolean_t smb_netbios_running(void); 639*a0aa776eSAlan Wright boolean_t smb_netbios_error(void); 640da6c28aaSamw 641da6c28aaSamw /* 642da6c28aaSamw * Name Cache Functions 643da6c28aaSamw */ 644da6c28aaSamw int smb_netbios_cache_init(void); 645da6c28aaSamw void smb_netbios_cache_fini(void); 646*a0aa776eSAlan Wright void smb_netbios_cache_dump(FILE *fp); 647da6c28aaSamw int smb_netbios_cache_count(void); 648da6c28aaSamw void smb_netbios_cache_clean(void); 649da6c28aaSamw void smb_netbios_cache_reset_ttl(void); 6507b59d02dSjb150015 void smb_netbios_cache_delete_locals(name_queue_t *); 6517b59d02dSjb150015 void smb_netbios_cache_refresh(name_queue_t *); 652da6c28aaSamw 653da6c28aaSamw int smb_netbios_cache_insert(struct name_entry *name); 654da6c28aaSamw int smb_netbios_cache_insert_list(struct name_entry *name); 655da6c28aaSamw void smb_netbios_cache_delete(struct name_entry *name); 656da6c28aaSamw int smb_netbios_cache_delete_addr(struct name_entry *name); 657da6c28aaSamw struct name_entry *smb_netbios_cache_lookup(struct name_entry *name); 658da6c28aaSamw struct name_entry *smb_netbios_cache_lookup_addr(struct name_entry *name); 6597b59d02dSjb150015 void smb_netbios_cache_update_entry(struct name_entry *, struct name_entry *); 6607b59d02dSjb150015 void smb_netbios_cache_unlock_entry(struct name_entry *); 6617b59d02dSjb150015 unsigned char *smb_netbios_cache_status(unsigned char *, int, unsigned char *); 6627b59d02dSjb150015 int smb_netbios_cache_getfirst(nbcache_iter_t *); 6637b59d02dSjb150015 int smb_netbios_cache_getnext(nbcache_iter_t *); 664da6c28aaSamw 665*a0aa776eSAlan Wright void smb_netbios_name_dump(FILE *fp, struct name_entry *entry); 666da6c28aaSamw void smb_netbios_name_logf(struct name_entry *entry); 667da6c28aaSamw void smb_netbios_name_freeaddrs(struct name_entry *entry); 6687b59d02dSjb150015 struct name_entry *smb_netbios_name_dup(struct name_entry *, int); 669da6c28aaSamw 670da6c28aaSamw /* Name service functions */ 671*a0aa776eSAlan Wright void *smb_netbios_name_service(void *); 6727b59d02dSjb150015 void smb_init_name_struct(unsigned char *, char, unsigned char *, uint32_t, 6737b59d02dSjb150015 unsigned short, uint32_t, uint32_t, struct name_entry *); 674da6c28aaSamw 675da6c28aaSamw struct name_entry *smb_name_find_name(struct name_entry *name); 676da6c28aaSamw int smb_name_add_name(struct name_entry *name); 677da6c28aaSamw int smb_name_delete_name(struct name_entry *name); 678da6c28aaSamw void smb_name_unlock_name(struct name_entry *name); 679da6c28aaSamw 680da6c28aaSamw void smb_netbios_name_config(void); 681da6c28aaSamw void smb_netbios_name_unconfig(void); 682da6c28aaSamw void smb_netbios_name_tick(void); 683da6c28aaSamw 6847b59d02dSjb150015 int smb_first_level_name_encode(struct name_entry *, unsigned char *, int); 6857b59d02dSjb150015 int smb_first_level_name_decode(unsigned char *, struct name_entry *); 6867b59d02dSjb150015 void smb_encode_netbios_name(unsigned char *, char, unsigned char *, 6877b59d02dSjb150015 struct name_entry *); 688da6c28aaSamw 689da6c28aaSamw /* Datagram service functions */ 690*a0aa776eSAlan Wright void *smb_netbios_datagram_service(void *); 691da6c28aaSamw int smb_netbios_datagram_send(struct name_entry *, 692da6c28aaSamw struct name_entry *, unsigned char *, int); 693da6c28aaSamw void smb_netbios_datagram_tick(void); 694da6c28aaSamw 695da6c28aaSamw /* browser functions */ 696da6c28aaSamw void *smb_browser_dispatch(void *arg); 697*a0aa776eSAlan Wright void *smb_browser_service(void *); 6987b59d02dSjb150015 int smb_browser_load_transact_header(unsigned char *, int, int, int, char *); 699da6c28aaSamw 700da6c28aaSamw /* Netlogon function */ 7017b59d02dSjb150015 void smb_netlogon_receive(struct datagram *, char *, unsigned char *, int); 70229bd2886SAlan Wright void smb_netlogon_request(struct name_entry *, char *); 703da6c28aaSamw 704da6c28aaSamw #endif /* _SMB_NETBIOS_H_ */ 705