summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2005-02-15 02:27:45 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:10:42 -0500
commitb1db7877e28d0e792cf3e271d7f1eaf0228352bf (patch)
treeb983cd51078f1da083571c47e0c62acf86c86fed
parent4d980e56c48e07468496809169aa289f60672562 (diff)
downloadsamba-b1db7877e28d0e792cf3e271d7f1eaf0228352bf.tar.gz
samba-b1db7877e28d0e792cf3e271d7f1eaf0228352bf.tar.bz2
samba-b1db7877e28d0e792cf3e271d7f1eaf0228352bf.zip
r5402: a initial attempt at a IDL definition of the WINS replication protocol
on tcp port 42. This is enough to reasonably decode (with ndrdump) all the packets I have seen on the wire. It will need some fine tuning once I understand the protocol a bit more. (This used to be commit 3f90bc132139815c23c7322d3d47268d92ba00ac)
-rw-r--r--source4/librpc/config.mk8
-rw-r--r--source4/librpc/idl/nbt.idl2
-rw-r--r--source4/librpc/idl/winsrepl.idl139
3 files changed, 147 insertions, 2 deletions
diff --git a/source4/librpc/config.mk b/source4/librpc/config.mk
index 3f0dea9ce1..82b3189805 100644
--- a/source4/librpc/config.mk
+++ b/source4/librpc/config.mk
@@ -293,6 +293,12 @@ INIT_FUNCTION = dcerpc_nbt_init
NOPROTO = YES
REQUIRED_SUBSYSTEMS = LIBNDR NDR_MISC
+[SUBSYSTEM::NDR_WINSREPL]
+INIT_OBJ_FILES = librpc/gen_ndr/ndr_winsrepl.o
+INIT_FUNCTION = dcerpc_winsrepl_init
+NOPROTO = YES
+REQUIRED_SUBSYSTEMS = LIBNDR NDR_MISC
+
[SUBSYSTEM::NDR_ALL]
REQUIRED_SUBSYSTEMS = NDR_AUDIOSRV NDR_ECHO NDR_DCERPC NDR_EXCHANGE \
@@ -302,7 +308,7 @@ REQUIRED_SUBSYSTEMS = NDR_AUDIOSRV NDR_ECHO NDR_DCERPC NDR_EXCHANGE \
NDR_WINREG NDR_MGMT NDR_PROTECTED_STORAGE NDR_DCOM NDR_OXIDRESOLVER \
NDR_REMACT NDR_WZCSVC NDR_BROWSER NDR_W32TIME NDR_SCERPC NDR_NTSVCS \
NDR_NETLOGON NDR_TRKWKS NDR_KEYSVC NDR_KRB5PAC NDR_XATTR NDR_SCHANNEL \
- NDR_ROT NDR_DRSBLOBS NDR_SVCCTL NDR_NBT LIB_SECURITY_NDR
+ NDR_ROT NDR_DRSBLOBS NDR_SVCCTL NDR_NBT NDR_WINSREPL LIB_SECURITY_NDR
[SUBSYSTEM::RPC_NDR_ROT]
ADD_OBJ_FILES = librpc/gen_ndr/ndr_rot_c.o
diff --git a/source4/librpc/idl/nbt.idl b/source4/librpc/idl/nbt.idl
index 04fe0c4f90..a5c5f46962 100644
--- a/source4/librpc/idl/nbt.idl
+++ b/source4/librpc/idl/nbt.idl
@@ -50,7 +50,7 @@ interface nbt
/* we support any 8bit name type, but by defining the common
ones here we get better debug displays */
- typedef [enum8bit] enum {
+ typedef [enum8bit,public] enum {
NBT_NAME_CLIENT = 0x00,
NBT_NAME_MS = 0x01,
NBT_NAME_USER = 0x03,
diff --git a/source4/librpc/idl/winsrepl.idl b/source4/librpc/idl/winsrepl.idl
new file mode 100644
index 0000000000..919d3a94bb
--- /dev/null
+++ b/source4/librpc/idl/winsrepl.idl
@@ -0,0 +1,139 @@
+#include "idl_types.h"
+
+/*
+ IDL structures for WINS replication protocol (port 42)
+
+ Note that WINS replication is not traditionally encoded using
+ IDL/NDR
+
+ Written by Andrew Tridgell <tridge@osdl.org>
+*/
+
+[
+ uuid("0-1-2-3-4"),
+ version(0.0),
+ pointer_default(unique),
+ depends(nbt)
+]
+interface wrepl
+{
+ const int WINS_REPLICATION_PORT = 42;
+
+ declare enum nbt_name_type;
+
+ typedef [flag(NDR_BIG_ENDIAN)] struct {
+ ipv4address owner;
+ ipv4address ip;
+ } wrepl_ip;
+
+ typedef [flag(NDR_LITTLE_ENDIAN)] struct {
+ uint32 num_ips;
+ wrepl_ip ips[num_ips];
+ ipv4address unknown;
+ } wrepl_address_list;
+
+ typedef [nodiscriminant] union {
+ [case(0)] wrepl_ip address;
+ [case(2)] wrepl_address_list addresses;
+ } wrepl_addresses;
+
+ typedef struct {
+ uint32 id_high;
+ uint32 id_low;
+ } wrepl_id;
+
+ typedef struct {
+ uint32 name_len;
+ astring15 name;
+ nbt_name_type type;
+ uint32 unknown;
+ uint32 flags;
+ [flag(NDR_LITTLE_ENDIAN)] uint32 group_flag;
+ wrepl_id id;
+ [switch_is(flags & 2)] wrepl_addresses addresses;
+ } wrepl_wins_name;
+
+ typedef struct {
+ uint32 num_names;
+ wrepl_wins_name names[num_names];
+ } wrepl_send_reply;
+
+ typedef struct {
+ ipv4address address;
+ wrepl_id max_version;
+ wrepl_id min_version;
+ uint32 type;
+ } wrepl_wins_owner;
+
+ typedef struct {
+ uint32 partner_count;
+ wrepl_wins_owner partners[partner_count];
+ ipv4address initiator;
+ } wrepl_table;
+
+ typedef [v1_enum] enum {
+ WREPL_REPL_TABLE_QUERY = 0,
+ WREPL_REPL_TABLE_REPLY = 1,
+ WREPL_REPL_SEND_REQUEST = 2,
+ WREPL_REPL_SEND_REPLY = 3,
+ WREPL_REPL_UPDATE = 4,
+ WREPL_REPL_INFORM = 8
+ } wrepl_replication_cmd;
+
+ typedef [nodiscriminant] union {
+ [case(WREPL_REPL_TABLE_QUERY)] ;
+ [case(WREPL_REPL_TABLE_REPLY)] wrepl_table table;
+ [case(WREPL_REPL_SEND_REQUEST)] wrepl_wins_owner owner;
+ [case(WREPL_REPL_SEND_REPLY)] wrepl_send_reply reply;
+ [case(WREPL_REPL_UPDATE)] ;
+ [case(WREPL_REPL_INFORM)] wrepl_table table;
+ } wrepl_replication_info;
+
+ typedef struct {
+ wrepl_replication_cmd command;
+ [switch_is(command)] wrepl_replication_info info;
+ } wrepl_replication;
+
+ typedef struct {
+ uint32 assoc_ctx;
+ uint16 minor_version;
+ uint16 major_version;
+ } wrepl_start;
+
+ typedef struct {
+ uint32 reason;
+ } wrepl_stop;
+
+ typedef [v1_enum] enum {
+ WREPL_START_ASSOCIATION = 0,
+ WREPL_START_ASSOCIATION_REPLY = 1,
+ WREPL_STOP_ASSOCIATION = 2,
+ WREPL_REPLICATION = 3
+ } wrepl_mess_type;
+
+ typedef [nodiscriminant] union {
+ [case(WREPL_START_ASSOCIATION)] wrepl_start start;
+ [case(WREPL_START_ASSOCIATION_REPLY)] wrepl_start start_reply;
+ [case(WREPL_STOP_ASSOCIATION)] wrepl_stop stop;
+ [case(WREPL_REPLICATION)] wrepl_replication replication;
+ } wrepl_message;
+
+
+ typedef [gensize,flag(NDR_NOALIGN|NDR_BIG_ENDIAN|NDR_PAHEX),public] struct {
+ uint32 opcode;
+ uint32 assoc_ctx;
+ wrepl_mess_type mess_type;
+ [switch_is(mess_type)] wrepl_message message;
+ [flag(NDR_REMAINING)] DATA_BLOB padding;
+ } wrepl_packet;
+
+ typedef [flag(NDR_NOALIGN|NDR_BIG_ENDIAN|NDR_PAHEX),public] struct {
+ [value(ndr_size_wrepl_packet(&r->packet, ndr->flags))] uint32 size;
+ wrepl_packet packet;
+ } wrepl_wrap;
+
+ void decode_winsrepl(
+ [in] wrepl_wrap p
+ );
+
+}