343 lines
8.1 KiB
C
343 lines
8.1 KiB
C
|
#ifndef _NMSMSGF_
|
||
|
#define _NMSMSGF_
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Copyright (c) 1989 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
nmsmsgf.h
|
||
|
|
||
|
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
|
||
|
This is the header file to be used for calling nmsmsgf.c functions
|
||
|
|
||
|
|
||
|
Functions:
|
||
|
|
||
|
|
||
|
|
||
|
Portability:
|
||
|
|
||
|
|
||
|
This header is portable.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Pradeep Bahl (PradeepB) Jan-1993
|
||
|
|
||
|
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
Modification Date Person Description of Modification
|
||
|
------------------ ------- ---------------------------
|
||
|
|
||
|
--*/
|
||
|
|
||
|
/*
|
||
|
includes
|
||
|
*/
|
||
|
#include "wins.h"
|
||
|
#include "comm.h"
|
||
|
#include "assoc.h"
|
||
|
#include "nmsdb.h"
|
||
|
|
||
|
/*
|
||
|
defines
|
||
|
*/
|
||
|
|
||
|
//
|
||
|
// Max. length of name in an RFC packet
|
||
|
//
|
||
|
#define NMSMSGF_RFC_MAX_NAM_LEN NMSDB_MAX_NAM_LEN
|
||
|
|
||
|
/*
|
||
|
macros
|
||
|
*/
|
||
|
|
||
|
//
|
||
|
// Inserts an IP address in an RFC pkt
|
||
|
//
|
||
|
#define NMSMSGF_INSERT_IPADD_M(pTmpB, IPAdd) \
|
||
|
{ \
|
||
|
*(pTmpB)++ = (BYTE)((IPAdd) >> 24); \
|
||
|
*(pTmpB)++ = (BYTE)(((IPAdd) >> 16) % 256);\
|
||
|
*(pTmpB)++ = (BYTE)(((IPAdd) >> 8) % 256); \
|
||
|
*(pTmpB)++ = (BYTE)((IPAdd) % 256); \
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Currently IP addresses are same length as ULONG. When that changes
|
||
|
// change this macro
|
||
|
//
|
||
|
FUTURES("Change when sizeof(COMM_IP_ADD_T) != sizeof(ULONG)")
|
||
|
#define NMSMSGF_INSERT_ULONG_M(pTmpB, x) NMSMSGF_INSERT_IPADD_M(pTmpB, x)
|
||
|
//
|
||
|
// Retrieves an IP address from an RFC pkt
|
||
|
//
|
||
|
#define NMSMSGF_RETRIEVE_IPADD_M(pTmpB, IPAdd) \
|
||
|
{ \
|
||
|
(IPAdd) = *(pTmpB)++ << 24; \
|
||
|
(IPAdd) |= *(pTmpB)++ << 16; \
|
||
|
(IPAdd) |= *(pTmpB)++ << 8; \
|
||
|
(IPAdd) |= *(pTmpB)++; \
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Currently IP addresses are same length as ULONG. When that changes
|
||
|
// change this macro
|
||
|
//
|
||
|
FUTURES("Change when sizeof(COMM_IP_ADD_T) != sizeof(ULONG)")
|
||
|
#define NMSMSGF_RETRIEVE_ULONG_M(pTmpB, x) NMSMSGF_RETRIEVE_IPADD_M(pTmpB, x)
|
||
|
|
||
|
//
|
||
|
// Max number of multihomed addresses
|
||
|
//
|
||
|
#define NMSMSGF_MAX_NO_MULTIH_ADDS NMSDB_MAX_MEMS_IN_GRP
|
||
|
|
||
|
//
|
||
|
// Used for swapping bytes (to support the browser)
|
||
|
//
|
||
|
#define NMSMSGF_MODIFY_NAME_IF_REQD_M(pName) \
|
||
|
{ \
|
||
|
if (*((pName) + 15) == 0x1B) \
|
||
|
{ \
|
||
|
WINS_SWAP_BYTES_M((pName), (pName) + 15);\
|
||
|
} \
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
externs
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
typedef definitions
|
||
|
*/
|
||
|
/*
|
||
|
NMSMSGF_ERR_CODE_E - The various Rcode values returned in responses to
|
||
|
the various name requests received.
|
||
|
|
||
|
Note: CFT_ERR is never returned in a negative name release response.
|
||
|
ACT_ERR code in a negative name release response means that the
|
||
|
WINS server will not allow a node to release the name owned by another
|
||
|
node.o
|
||
|
*/
|
||
|
|
||
|
typedef enum _NMSMSGF_ERR_CODE_E {
|
||
|
NMSMSGF_E_SUCCESS = 0, //Success
|
||
|
NMSMSGF_E_FMT_ERR = 1, //Format error. Req. was invalidly formatted
|
||
|
NMSMSGF_E_SRV_ERR = 2, //Server failure. Problem with WINS. Can not
|
||
|
//service name
|
||
|
CHECK("Check this one out. Would WINS ever return this ?")
|
||
|
NMSMSGF_E_NAM_ERR = 3, //Name does not exist in the directory
|
||
|
NMSMSGF_E_IMP_ERR = 4, //Unsupported req. error. Allowable only for
|
||
|
//challenging NBNS when gets an Update type
|
||
|
//registration request
|
||
|
NMSMSGF_E_RFS_ERR = 5, //Refused error. For policy reasons WINS
|
||
|
//will not register this namei from this host
|
||
|
NMSMSGF_E_ACT_ERR = 6, //Active error. Name is owned by another node
|
||
|
NMSMSGF_E_CFT_ERR = 7 //Name in conflict error. A unique name is
|
||
|
//owned by more than one node
|
||
|
} NMSMSGF_ERR_CODE_E, *PNMSMSGF_ERR_CODE_E;
|
||
|
/*
|
||
|
NMSMSGF_NODE_TYP_E -- Node type of node that sent the name registration
|
||
|
message
|
||
|
Values assigned to the enumrators are those specified in RFC 1002
|
||
|
|
||
|
Bnode value will be set by Proxy
|
||
|
|
||
|
NOTE NOTE NOTE
|
||
|
WINS will never get a registration from a B node since we decided
|
||
|
that B node registrations will not be passed to WINS by the
|
||
|
proxy.
|
||
|
*/
|
||
|
|
||
|
typedef enum _NMSMSGF_NODE_TYP_E {
|
||
|
NMSMSGF_E_BNODE = 0, //RFC 1002 specified value
|
||
|
NMSMSGF_E_PNODE = 1, // RFC 1002 specified value
|
||
|
NMSMSGF_E_MODE = 2 //RFC 1002 specified value
|
||
|
} NMSMSGF_NODE_TYP_E, *PNMSMSGF_NODE_TYP_E;
|
||
|
|
||
|
//
|
||
|
// Information required to send a response to an NBT node
|
||
|
//
|
||
|
typedef struct _NMSMSGF_RSP_INFO_T {
|
||
|
NMSMSGF_ERR_CODE_E Rcode_e;
|
||
|
MSG_T pMsg;
|
||
|
MSG_LEN_T MsgLen;
|
||
|
PNMSDB_NODE_ADDS_T pNodeAdds;
|
||
|
DWORD QuesNamSecLen;
|
||
|
NMSMSGF_NODE_TYP_E NodeTyp_e;
|
||
|
BYTE EntTyp;
|
||
|
DWORD RefreshInterval;
|
||
|
} NMSMSGF_RSP_INFO_T, *PNMSMSGF_RSP_INFO_T;
|
||
|
/*
|
||
|
NMSMSGF_NAM_REQ_TYP_E
|
||
|
Type of name request that the WINS deals with
|
||
|
Values assigned to the enumrators are those specified in RFC 1002
|
||
|
|
||
|
Used by NmsProcNbtReq and NmsNmhNamRegRsp.
|
||
|
*/
|
||
|
|
||
|
CHECK("RFC 1002 is inconsistent in its specification of the opcode for ")
|
||
|
CHECK("Name Refresh. AT one place it specifies 8 and at another 9")
|
||
|
CHECK("8 seems more likely since it follows in sequeence to the value")
|
||
|
CHECK("for WACK")
|
||
|
|
||
|
typedef enum _NMSMSGF_NAM_REQ_TYP_E {
|
||
|
NMSMSGF_E_NAM_QUERY = 0,
|
||
|
NMSMSGF_E_NAM_REG = 5,
|
||
|
NMSMSGF_E_NAM_REL = 6,
|
||
|
NMSMSGF_E_NAM_WACK = 7,
|
||
|
NMSMSGF_E_NAM_REF = 8, /*RFC 1002 specifies 8 and 9.Which one is
|
||
|
*correct (page 9 and page 15)?
|
||
|
*/
|
||
|
NMSMSGF_E_NAM_REF_UB = 9, //Netbt in Daytona release will use 9 for
|
||
|
//compatibility with UB NBNS. So, I
|
||
|
//need to support this too
|
||
|
NMSMSGF_E_MULTIH_REG = 0xF, //not in RFC. For supporting multi-homed
|
||
|
//hosts
|
||
|
NMSMSGF_E_INV_REQ = 10 // invalid name request
|
||
|
} NMSMSGF_NAM_REQ_TYP_E, *PNMSMSGF_NAM_REQ_TYP_E;
|
||
|
|
||
|
//
|
||
|
// Counted array of addresses. The array size is big enough to hold the
|
||
|
// max. number of addresses that can be sent in a UDP packet.
|
||
|
//
|
||
|
// We need to get all the addresses when a query response is received
|
||
|
// by WINS (to a challenge). This is so that it can handle mh nodes
|
||
|
// with > 25 addresses.
|
||
|
//
|
||
|
// Since a UDP packet can not be > 512, assuming a name size of 16 (32 bytes
|
||
|
// encoded), the packet size apart from Ip address is around 60. So the
|
||
|
// max. number of addresses there can be is (512-60 - 2)/4 = around 112.
|
||
|
//
|
||
|
//#define NMSMSGF_MAX_ADDRESSES_IN_UDP_PKT 100
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// We will never take more than 25 addresses from a packet. Netbt will also
|
||
|
// never send more than 25. Even if it does, we will stop at the 26th address
|
||
|
// The count is being kept at 25 so as to avoid a buffer overflow problem
|
||
|
// in NmsMsgfUfmNamRsp.
|
||
|
//
|
||
|
// If the max name size is used - 255 and using 60 bytes for the other contents\// of the packet, we have (512-315 -2 = 195 bytes for the ip address). This
|
||
|
// will accept 195/4 = around 48 addresses. No chance for overflow when we
|
||
|
// use a limit of 25.
|
||
|
//
|
||
|
#define NMSMSGF_MAX_ADDRESSES_IN_UDP_PKT 25
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
FUTURES("when we start supportng tcp connections. this array size may not")
|
||
|
FUTURES("be sufficient")
|
||
|
typedef struct _NMSMSGF_CNT_ADD_T {
|
||
|
DWORD NoOfAdds;
|
||
|
COMM_ADD_T Add[NMSMSGF_MAX_ADDRESSES_IN_UDP_PKT];
|
||
|
} NMSMSGF_CNT_ADD_T, *PNMSMSGF_CNT_ADD_T;
|
||
|
/*
|
||
|
function definitions
|
||
|
*/
|
||
|
|
||
|
extern
|
||
|
STATUS
|
||
|
NmsMsgfProcNbtReq(
|
||
|
PCOMM_HDL_T pDlgHdl,
|
||
|
MSG_T pMsg,
|
||
|
MSG_LEN_T MsgLen
|
||
|
);
|
||
|
extern
|
||
|
STATUS
|
||
|
NmsMsgfFrmNamRspMsg(
|
||
|
PCOMM_HDL_T pDlgHdl,
|
||
|
NMSMSGF_NAM_REQ_TYP_E NamRspTyp_e,
|
||
|
PNMSMSGF_RSP_INFO_T pRspInfo
|
||
|
);
|
||
|
|
||
|
|
||
|
|
||
|
extern
|
||
|
VOID
|
||
|
NmsMsgfFrmNamQueryReq(
|
||
|
IN DWORD TransId,
|
||
|
IN MSG_T pMsg,
|
||
|
OUT PMSG_LEN_T pMsgLen,
|
||
|
IN LPBYTE pNameToFormat,
|
||
|
IN DWORD NameLen
|
||
|
);
|
||
|
|
||
|
extern
|
||
|
VOID
|
||
|
NmsMsgfFrmNamRelReq(
|
||
|
IN DWORD TransId,
|
||
|
IN MSG_T pMsg,
|
||
|
OUT PMSG_LEN_T pMsgLen,
|
||
|
IN LPBYTE pNameToFormat,
|
||
|
IN DWORD NameLen,
|
||
|
IN NMSMSGF_NODE_TYP_E NodeTyp_e,
|
||
|
IN PCOMM_ADD_T pNodeAdd
|
||
|
);
|
||
|
|
||
|
extern
|
||
|
STATUS
|
||
|
NmsMsgfFrmNamRegReq(
|
||
|
IN DWORD TransId,
|
||
|
IN MSG_T pMsg,
|
||
|
OUT PMSG_LEN_T pMsgLen,
|
||
|
IN LPBYTE pNameToFormat,
|
||
|
IN DWORD NameLen,
|
||
|
IN NMSMSGF_NODE_TYP_E NodeTyp_e,
|
||
|
IN PCOMM_ADD_T pNodeAdd
|
||
|
);
|
||
|
extern
|
||
|
VOID
|
||
|
NmsMsgfFrmWACK(
|
||
|
IN LPBYTE Buff,
|
||
|
OUT LPDWORD pBuffLen,
|
||
|
IN MSG_T pMsg,
|
||
|
IN DWORD QuesSecNamLen,
|
||
|
IN DWORD TTL
|
||
|
);
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
extern
|
||
|
STATUS
|
||
|
NmsMsgfUfmNamRsp(
|
||
|
IN LPBYTE pMsg,
|
||
|
OUT PNMSMSGF_NAM_REQ_TYP_E pOpcode_e,
|
||
|
OUT LPDWORD pTransId,
|
||
|
OUT LPBYTE pName,
|
||
|
OUT LPDWORD pNameLen,
|
||
|
OUT PNMSMSGF_CNT_ADD_T pCntAdd,
|
||
|
OUT PNMSMSGF_ERR_CODE_E pRcode_e,
|
||
|
OUT PBOOL fGroup
|
||
|
);
|
||
|
|
||
|
extern
|
||
|
VOID
|
||
|
NmsMsgfSndNamRsp(
|
||
|
PCOMM_HDL_T pDlgHdl,
|
||
|
LPBYTE pMsg,
|
||
|
DWORD MsgLen,
|
||
|
DWORD BlockOfReq
|
||
|
);
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
#endif //_NMSMSGF_
|