From a6878f6c6e17ea99baf57e5724d524548a44ada8 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 16 Feb 2005 10:03:18 +0000 Subject: r5414: - added libcli/wins/, a basic client library for WINS replication - added a new IDL type "udlongr", which is like udlong, but with the two uint32 halves reversed - modified the winsrepl.idl to cope with a wider range of packets (This used to be commit bc8d60c918f2e268d591aac464fc6a78c38a4cf9) --- source4/librpc/idl/winsrepl.idl | 69 ++++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 36 deletions(-) (limited to 'source4/librpc/idl/winsrepl.idl') diff --git a/source4/librpc/idl/winsrepl.idl b/source4/librpc/idl/winsrepl.idl index 919d3a94bb..cec82a5106 100644 --- a/source4/librpc/idl/winsrepl.idl +++ b/source4/librpc/idl/winsrepl.idl @@ -12,63 +12,53 @@ [ uuid("0-1-2-3-4"), version(0.0), - pointer_default(unique), - depends(nbt) + pointer_default(unique) ] 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]; + uint32 num_ips; + wrepl_ip ips[num_ips]; ipv4address unknown; } wrepl_address_list; typedef [nodiscriminant] union { - [case(0)] wrepl_ip address; + [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; + uint32 name_len; + uint8 name[name_len]; + uint32 flags; [flag(NDR_LITTLE_ENDIAN)] uint32 group_flag; - wrepl_id id; + udlongr id; [switch_is(flags & 2)] wrepl_addresses addresses; } wrepl_wins_name; typedef struct { - uint32 num_names; + 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; + udlongr max_version; + udlongr min_version; + uint32 type; } wrepl_wins_owner; typedef struct { - uint32 partner_count; + uint32 partner_count; wrepl_wins_owner partners[partner_count]; - ipv4address initiator; + ipv4address initiator; } wrepl_table; typedef [v1_enum] enum { @@ -82,11 +72,11 @@ interface wrepl typedef [nodiscriminant] union { [case(WREPL_REPL_TABLE_QUERY)] ; - [case(WREPL_REPL_TABLE_REPLY)] wrepl_table table; + [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_SEND_REPLY)] wrepl_send_reply reply; [case(WREPL_REPL_UPDATE)] ; - [case(WREPL_REPL_INFORM)] wrepl_table table; + [case(WREPL_REPL_INFORM)] wrepl_table table; } wrepl_replication_info; typedef struct { @@ -112,23 +102,30 @@ interface wrepl } wrepl_mess_type; typedef [nodiscriminant] union { - [case(WREPL_START_ASSOCIATION)] wrepl_start start; + [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; + [case(WREPL_STOP_ASSOCIATION)] wrepl_stop stop; + [case(WREPL_REPLICATION)] wrepl_replication replication; } wrepl_message; + /* + the opcode appears to be a bitfield, but as far as I can tell + you must always set the following bits. Additional bits don't + seem to matter. Very strange. + */ + const int WREPL_OPCODE_BITS = 0x7800; + - typedef [gensize,flag(NDR_NOALIGN|NDR_BIG_ENDIAN|NDR_PAHEX),public] struct { - uint32 opcode; - uint32 assoc_ctx; - wrepl_mess_type mess_type; + typedef [gensize,flag(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; + typedef [flag(NDR_BIG_ENDIAN|NDR_PAHEX),public] struct { + [value(ndr_size_wrepl_packet(&r->packet, ndr->flags))] uint32 size; wrepl_packet packet; } wrepl_wrap; -- cgit