You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
514 lines
21 KiB
514 lines
21 KiB
/***************************************************************************/
|
|
/* */
|
|
/* Project: OpenSLP - OpenSource implementation of Service Location */
|
|
/* Protocol */
|
|
/* */
|
|
/* File: slp_message.h */
|
|
/* */
|
|
/* Abstract: Header file that defines structures and constants that are */
|
|
/* specific to the SLP wire protocol messages. */
|
|
/* */
|
|
/*-------------------------------------------------------------------------*/
|
|
/* */
|
|
/* Please submit patches to http://www.openslp.org */
|
|
/* */
|
|
/*-------------------------------------------------------------------------*/
|
|
/* */
|
|
/* Copyright (C) 2000 Caldera Systems, Inc */
|
|
/* All rights reserved. */
|
|
/* */
|
|
/* Redistribution and use in source and binary forms, with or without */
|
|
/* modification, are permitted provided that the following conditions are */
|
|
/* met: */
|
|
/* */
|
|
/* Redistributions of source code must retain the above copyright */
|
|
/* notice, this list of conditions and the following disclaimer. */
|
|
/* */
|
|
/* Redistributions in binary form must reproduce the above copyright */
|
|
/* notice, this list of conditions and the following disclaimer in */
|
|
/* the documentation and/or other materials provided with the */
|
|
/* distribution. */
|
|
/* */
|
|
/* Neither the name of Caldera Systems nor the names of its */
|
|
/* contributors may be used to endorse or promote products derived */
|
|
/* from this software without specific prior written permission. */
|
|
/* */
|
|
/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */
|
|
/* `AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */
|
|
/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR */
|
|
/* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE CALDERA */
|
|
/* SYSTEMS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */
|
|
/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT */
|
|
/* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, */
|
|
/* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON */
|
|
/* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */
|
|
/* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE */
|
|
/* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
|
/* */
|
|
/***************************************************************************/
|
|
|
|
#if(!defined SLP_MESSAGE_H_INCLUDED)
|
|
#define SLP_MESSAGE_H_INCLUDED
|
|
|
|
#include "slp_buffer.h"
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
# include "config.h"
|
|
#endif
|
|
#ifdef _WIN32
|
|
# define WIN32_LEAN_AND_MEAN
|
|
# include <windows.h>
|
|
# include <winsock.h>
|
|
# ifndef UINT32_T_DEFINED
|
|
# define UINT32_T_DEFINED
|
|
typedef unsigned int uint32_t;
|
|
# endif
|
|
#else
|
|
# include <sys/types.h>
|
|
# ifdef __FreeBSD__
|
|
# include <sys/param.h> /* for limits.h - INT_MAX slpd*/
|
|
# endif
|
|
# include <netinet/in.h> /* for htonl() routines */
|
|
# ifdef HAVE_STDINT_H
|
|
# include <stdint.h>
|
|
# else
|
|
# include <inttypes.h>
|
|
# endif
|
|
#endif
|
|
|
|
typedef char CHAR;
|
|
typedef unsigned char UINT8;
|
|
typedef unsigned short UINT16;
|
|
|
|
#ifndef _WIN32
|
|
typedef unsigned long UINT32;
|
|
#endif
|
|
|
|
typedef CHAR* PCHAR;
|
|
typedef UINT8* PUINT8;
|
|
typedef UINT16* PUINT16;
|
|
typedef UINT32* PUINT32;
|
|
|
|
|
|
/*=========================================================================*/
|
|
/* SLP Important constants */
|
|
/*=========================================================================*/
|
|
#define SLP_RESERVED_PORT 427
|
|
#define SLP_MCAST_ADDRESS 0xeffffffd /* 239.255.255.253 */
|
|
#define SLP_BCAST_ADDRESS 0xffffffff /* 255.255.255.255 */
|
|
#define SLPv1_DA_MCAST_ADDRESS 0xe0000123 /* 224.0.1.35 */
|
|
#define LOOPBACK_ADDRESS 0x7f000001 /* 127.0.0.1 */
|
|
#define SLP_MAX_DATAGRAM_SIZE 1400
|
|
#if(!defined SLP_LIFETIME_MAXIMUM)
|
|
#define SLP_LIFETIME_MAXIMUM 0xffff
|
|
#endif
|
|
|
|
|
|
/*=========================================================================*/
|
|
/* SLP Function ID constants */
|
|
/*=========================================================================*/
|
|
#define SLP_FUNCT_SRVRQST 1
|
|
#define SLP_FUNCT_SRVRPLY 2
|
|
#define SLP_FUNCT_SRVREG 3
|
|
#define SLP_FUNCT_SRVDEREG 4
|
|
#define SLP_FUNCT_SRVACK 5
|
|
#define SLP_FUNCT_ATTRRQST 6
|
|
#define SLP_FUNCT_ATTRRPLY 7
|
|
#define SLP_FUNCT_DAADVERT 8
|
|
#define SLP_FUNCT_SRVTYPERQST 9
|
|
#define SLP_FUNCT_SRVTYPERPLY 10
|
|
#define SLP_FUNCT_SAADVERT 11
|
|
|
|
|
|
/*=========================================================================*/
|
|
/* SLP Protocol Error codes */
|
|
/*=========================================================================*/
|
|
#define SLP_ERROR_OK 0
|
|
#define SLP_ERROR_LANGUAGE_NOT_SUPPORTED 1
|
|
#define SLP_ERROR_PARSE_ERROR 2
|
|
#define SLP_ERROR_INVALID_REGISTRATION 3
|
|
#define SLP_ERROR_SCOPE_NOT_SUPPORTED 4
|
|
#define SLP_ERROR_CHARSET_NOT_UNDERSTOOD 5 /* valid only for SLPv1 */
|
|
#define SLP_ERROR_AUTHENTICATION_UNKNOWN 5
|
|
#define SLP_ERROR_AUTHENTICATION_ABSENT 6
|
|
#define SLP_ERROR_AUTHENTICATION_FAILED 7
|
|
#define SLP_ERROR_VER_NOT_SUPPORTED 9
|
|
#define SLP_ERROR_INTERNAL_ERROR 10
|
|
#define SLP_ERROR_DA_BUSY_NOW 11
|
|
#define SLP_ERROR_INVALID_UPDATE 13
|
|
#define SLP_ERROR_MESSAGE_NOT_SUPPORTED 14
|
|
#define SLP_ERROR_REFRESH_REJECTED 15
|
|
|
|
/*=========================================================================*/
|
|
/* SLP Flags */
|
|
/*=========================================================================*/
|
|
#define SLP_FLAG_OVERFLOW 0x8000
|
|
#define SLP_FLAG_FRESH 0x4000
|
|
#define SLP_FLAG_MCAST 0x2000
|
|
#ifndef UNICAST_NOT_SUPPORTED
|
|
#define SLP_FLAG_UCAST 0x0000
|
|
#endif
|
|
|
|
/*=========================================================================*/
|
|
/* SLP Constants */
|
|
/*=========================================================================*/
|
|
/* Max time to wait for a complete multicast query response */
|
|
#define CONFIG_MC_MAX 15
|
|
|
|
/* Wait interval to give up on a unicast request retransmission */
|
|
#define CONFIG_RETRY_MAX 15
|
|
|
|
/* Default wait between retransmits*/
|
|
#define CONFIG_RETRY_INTERVAL 3
|
|
|
|
#define SLP_DA_SERVICE_TYPE "service:directory-agent"
|
|
#define SLP_SA_SERVICE_TYPE "service:service-agent"
|
|
|
|
|
|
/*=========================================================================*/
|
|
/* SLP Registration Sources */
|
|
/*=========================================================================*/
|
|
#define SLP_REG_SOURCE_UNKNOWN 0
|
|
#define SLP_REG_SOURCE_REMOTE 1 /* from a remote host */
|
|
#define SLP_REG_SOURCE_LOCAL 2 /* from localhost or IPC */
|
|
#define SLP_REG_SOURCE_STATIC 3 /* from the slp.reg file */
|
|
|
|
|
|
/*=========================================================================*/
|
|
/* SLP Extension IDs */
|
|
/*=========================================================================*/
|
|
#define SLP_EXTENSION_ID_REG_PID 0x9799
|
|
|
|
|
|
/*=========================================================================*/
|
|
/* SLPHeader structure and associated functions */
|
|
/*=========================================================================*/
|
|
typedef struct _SLPHeader
|
|
{
|
|
int version;
|
|
int functionid;
|
|
int length;
|
|
int flags;
|
|
int encoding; /* language encoding, valid only for SLPv1 */
|
|
int extoffset;
|
|
int xid;
|
|
int langtaglen;
|
|
const char* langtag; /* points into the translated message */
|
|
}SLPHeader;
|
|
|
|
|
|
/*=========================================================================*/
|
|
/* SLPAuthBlock structure and associated functions */
|
|
/*=========================================================================*/
|
|
typedef struct _SLPAuthBlock
|
|
{
|
|
unsigned int bsd;
|
|
int length;
|
|
unsigned int timestamp;
|
|
int spistrlen;
|
|
const char* spistr;
|
|
const unsigned char* authstruct;
|
|
/* The following are not part of the RFC protocol. They are used by */
|
|
/* the OpenSLP implementation for convenience */
|
|
int opaquelen;
|
|
char* opaque;
|
|
}SLPAuthBlock;
|
|
|
|
|
|
/*=========================================================================*/
|
|
/* SLPUrlEntry structure and associated functions */
|
|
/*=========================================================================*/
|
|
typedef struct _SLPUrlEntry
|
|
{
|
|
char reserved; /* This will always be 0 */
|
|
int lifetime;
|
|
int urllen;
|
|
const char* url;
|
|
int authcount;
|
|
SLPAuthBlock* autharray;
|
|
/* The following are not part of the RFC protocol. They are used by */
|
|
/* the OpenSLP implementation for convenience */
|
|
int opaquelen;
|
|
char* opaque;
|
|
}SLPUrlEntry;
|
|
|
|
|
|
/*=========================================================================*/
|
|
/* SLPSrvRqst structure and associated functions */
|
|
/*=========================================================================*/
|
|
typedef struct _SLPSrvRqst
|
|
{
|
|
int prlistlen;
|
|
const char* prlist;
|
|
int srvtypelen;
|
|
const char* srvtype;
|
|
int scopelistlen;
|
|
const char* scopelist;
|
|
int predicatever;
|
|
int predicatelen;
|
|
const char* predicate;
|
|
int spistrlen;
|
|
const char* spistr;
|
|
}SLPSrvRqst;
|
|
|
|
|
|
/*=========================================================================*/
|
|
typedef struct _SLPSrvRply
|
|
/*=========================================================================*/
|
|
{
|
|
int errorcode;
|
|
int urlcount;
|
|
SLPUrlEntry* urlarray;
|
|
}SLPSrvRply;
|
|
|
|
|
|
/*=========================================================================*/
|
|
typedef struct _SLPSrvReg
|
|
/*=========================================================================*/
|
|
{
|
|
SLPUrlEntry urlentry;
|
|
int srvtypelen;
|
|
const char* srvtype;
|
|
int scopelistlen;
|
|
const char* scopelist;
|
|
int attrlistlen;
|
|
const char* attrlist;
|
|
int authcount;
|
|
SLPAuthBlock* autharray;
|
|
/* The following are used for OpenSLP specific extensions */
|
|
uint32_t pid;
|
|
/* The following are not part of the RFC protocol. They are used by */
|
|
/* the OpenSLP implementation for convenience */
|
|
int source;
|
|
}SLPSrvReg;
|
|
|
|
|
|
/*=========================================================================*/
|
|
typedef struct _SLPSrvDeReg
|
|
/*=========================================================================*/
|
|
{
|
|
int scopelistlen;
|
|
const char* scopelist;
|
|
SLPUrlEntry urlentry;
|
|
int taglistlen;
|
|
const char* taglist;
|
|
}SLPSrvDeReg;
|
|
|
|
|
|
/*=========================================================================*/
|
|
typedef struct _SLPSrvAck
|
|
/*=========================================================================*/
|
|
{
|
|
int errorcode;
|
|
}SLPSrvAck;
|
|
|
|
|
|
/*=========================================================================*/
|
|
typedef struct _SLPDAAdvert
|
|
/*=========================================================================*/
|
|
{
|
|
int errorcode;
|
|
unsigned int bootstamp;
|
|
int urllen;
|
|
const char* url;
|
|
int scopelistlen;
|
|
const char* scopelist;
|
|
int attrlistlen;
|
|
const char* attrlist;
|
|
int spilistlen;
|
|
const char* spilist;
|
|
int authcount;
|
|
SLPAuthBlock* autharray;
|
|
}SLPDAAdvert;
|
|
|
|
|
|
/*=========================================================================*/
|
|
typedef struct _SLPAttrRqst
|
|
/*=========================================================================*/
|
|
{
|
|
int prlistlen;
|
|
const char* prlist;
|
|
int urllen;
|
|
const char* url;
|
|
int scopelistlen;
|
|
const char* scopelist;
|
|
int taglistlen;
|
|
const char* taglist;
|
|
int spistrlen;
|
|
const char* spistr;
|
|
}SLPAttrRqst;
|
|
|
|
|
|
/*=========================================================================*/
|
|
typedef struct _SLPAttrRply
|
|
/*=========================================================================*/
|
|
{
|
|
int errorcode;
|
|
int attrlistlen;
|
|
const char* attrlist;
|
|
int authcount;
|
|
SLPAuthBlock* autharray;
|
|
}SLPAttrRply;
|
|
|
|
|
|
/*=========================================================================*/
|
|
typedef struct _SLPSrvTypeRqst
|
|
/*=========================================================================*/
|
|
{
|
|
int prlistlen;
|
|
const char* prlist;
|
|
int namingauthlen;
|
|
const char* namingauth;
|
|
int scopelistlen;
|
|
const char* scopelist;
|
|
}SLPSrvTypeRqst;
|
|
|
|
|
|
|
|
/*=========================================================================*/
|
|
typedef struct _SLPSrvTypeRply
|
|
/*=========================================================================*/
|
|
{
|
|
int errorcode;
|
|
int srvtypelistlen;
|
|
const char* srvtypelist;
|
|
}SLPSrvTypeRply;
|
|
|
|
|
|
|
|
/*=========================================================================*/
|
|
typedef struct _SLPSAAdvert
|
|
/*=========================================================================*/
|
|
{
|
|
int urllen;
|
|
const char* url;
|
|
int scopelistlen;
|
|
const char* scopelist;
|
|
int attrlistlen;
|
|
const char* attrlist;
|
|
int authcount;
|
|
SLPAuthBlock* autharray;
|
|
}SLPSAAdvert;
|
|
|
|
|
|
|
|
/*=========================================================================*/
|
|
typedef struct _SLPMessage
|
|
/*=========================================================================*/
|
|
{
|
|
struct sockaddr_in peer;
|
|
SLPHeader header;
|
|
union _body
|
|
{
|
|
SLPSrvRqst srvrqst;
|
|
SLPSrvRply srvrply;
|
|
SLPSrvReg srvreg;
|
|
SLPSrvDeReg srvdereg;
|
|
SLPSrvAck srvack;
|
|
SLPDAAdvert daadvert;
|
|
SLPAttrRqst attrrqst;
|
|
SLPAttrRply attrrply;
|
|
SLPSrvTypeRqst srvtyperqst;
|
|
SLPSrvTypeRply srvtyperply;
|
|
SLPSAAdvert saadvert;
|
|
}body;
|
|
|
|
}*SLPMessage;
|
|
|
|
|
|
/*=========================================================================*/
|
|
void SLPMessageFreeInternals(SLPMessage message);
|
|
/*=========================================================================*/
|
|
|
|
/*=========================================================================*/
|
|
SLPMessage SLPMessageAlloc();
|
|
/* Allocates memory for a SLP message descriptor */
|
|
/* */
|
|
/* Returns - A newly allocated SLPMessage pointer of NULL on ENOMEM */
|
|
/*=========================================================================*/
|
|
|
|
|
|
/*=========================================================================*/
|
|
SLPMessage SLPMessageRealloc(SLPMessage msg);
|
|
/* Reallocates memory for a SLP message descriptor */
|
|
/* */
|
|
/* Returns - A newly allocated SLPMessage pointer of NULL on ENOMEM */
|
|
/*=========================================================================*/
|
|
|
|
|
|
/*=========================================================================*/
|
|
void SLPMessageFree(SLPMessage message);
|
|
/* Frees memory that might have been allocated by the SLPMessage for */
|
|
/* UrlEntryLists or AuthBlockLists. */
|
|
/* */
|
|
/* message - (IN) the SLPMessage to free */
|
|
/*=========================================================================*/
|
|
|
|
|
|
/*=========================================================================*/
|
|
int SLPMessageParseHeader(SLPBuffer buffer, SLPHeader* header);
|
|
/* Fill out a header structure with what ever is in the buffer */
|
|
/* */
|
|
/* buffer (IN) the buffer to be parsed */
|
|
/* */
|
|
/* header (IN/OUT) pointer to the header structure to fill out */
|
|
/*=========================================================================*/
|
|
|
|
|
|
/*=========================================================================*/
|
|
int SLPMessageParseBuffer(struct sockaddr_in* peerinfo,
|
|
SLPBuffer buffer,
|
|
SLPMessage message);
|
|
/* Initializes a message descriptor by parsing the specified buffer. */
|
|
/* */
|
|
/* peerinfo - (IN) pointer to the network address information that sent */
|
|
/* buffer */
|
|
/* */
|
|
/* buffer - (IN) pointer the SLPBuffer to parse */
|
|
/* */
|
|
/* message - (OUT) set to describe the message from the buffer */
|
|
/* */
|
|
/* Returns - Zero on success, SLP_ERROR_PARSE_ERROR, or */
|
|
/* SLP_ERROR_INTERNAL_ERROR if out of memory. SLPMessage is */
|
|
/* invalid return is not successful. */
|
|
/* */
|
|
/* WARNING - If successful, pointers in the SLPMessage reference memory in*/
|
|
/* the parsed SLPBuffer. If SLPBufferFree() is called then the */
|
|
/* pointers in SLPMessage will be invalidated. */
|
|
/*=========================================================================*/
|
|
|
|
/*=========================================================================*/
|
|
/* Functions used to parse buffers */
|
|
unsigned short AsUINT16(const char *charptr);
|
|
unsigned int AsUINT24(const char *charptr);
|
|
unsigned int AsUINT32(const char *charptr);
|
|
/*=========================================================================*/
|
|
|
|
/*=========================================================================*/
|
|
/* Functions used to set buffers */
|
|
void ToUINT16(char *charptr, unsigned int val);
|
|
void ToUINT24(char *charptr, unsigned int val);
|
|
void ToUINT32(char *charptr, unsigned int val);
|
|
/*=========================================================================*/
|
|
|
|
|
|
#ifdef i386
|
|
|
|
/*=========================================================================*/
|
|
/* Macros to check in_addr */
|
|
#define ISLOCAL(addr) ((ntohl((addr).s_addr) & 0xff000000) == 0x7f000000)
|
|
#define ISMCAST(addr) ((ntohl((addr).s_addr) & 0xff000000) >= 0xef000000)
|
|
/*=========================================================================*/
|
|
|
|
#else
|
|
|
|
/*=========================================================================*/
|
|
/* Macros to check in_addr */
|
|
#define ISLOCAL(addr) (((addr).s_addr & 0xff000000) == 0x7f000000)
|
|
#define ISMCAST(addr) (((addr).s_addr & 0xff000000) >= 0xef000000)
|
|
/*=========================================================================*/
|
|
#endif
|
|
|
|
|
|
#endif
|