diff options
Diffstat (limited to 'source4/librpc/idl/winsrepl.idl')
-rw-r--r-- | source4/librpc/idl/winsrepl.idl | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/source4/librpc/idl/winsrepl.idl b/source4/librpc/idl/winsrepl.idl new file mode 100644 index 0000000..4ef2e8e --- /dev/null +++ b/source4/librpc/idl/winsrepl.idl @@ -0,0 +1,174 @@ +#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> +*/ + +import "nbt.idl"; + +[ + uuid("915f5653-bac1-431c-97ee-9ffb34526921"), + helpstring("WINS Replication PDUs"), + helper("../libcli/nbt/libnbt.h") +] interface winsrepl +{ + const int WINS_REPLICATION_PORT = 42; + + 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]; + } wrepl_address_list; + + typedef [nodiscriminant] union { + [case(0)] ipv4address ip; + [case(2)] wrepl_address_list addresses; + } wrepl_addresses; + + typedef [enum8bit] enum { + WREPL_TYPE_UNIQUE = 0x0, + WREPL_TYPE_GROUP = 0x1, + WREPL_TYPE_SGROUP = 0x2, + WREPL_TYPE_MHOMED = 0x3 + } wrepl_name_type; + + typedef [enum8bit] enum { + WREPL_STATE_ACTIVE = 0x0, + WREPL_STATE_RELEASED = 0x1, + WREPL_STATE_TOMBSTONE = 0x2, + WREPL_STATE_RESERVED = 0x3 + } wrepl_name_state; + + typedef [enum8bit] enum { + WREPL_NODE_B = 0x0, + WREPL_NODE_P = 0x1, + WREPL_NODE_M = 0x2, + WREPL_NODE_H = 0x3 + } wrepl_name_node; + + typedef [bitmap32bit] bitmap { + WREPL_FLAGS_RECORD_TYPE = 0x00000003, + WREPL_FLAGS_RECORD_STATE = 0x0000000C, + WREPL_FLAGS_REGISTERED_LOCAL = 0x00000010, + WREPL_FLAGS_NODE_TYPE = 0x00000060, + WREPL_FLAGS_IS_STATIC = 0x00000080 + } wrepl_flags; + + typedef [v1_enum] enum { + WREPL_GROUP_FLAG_NO_GROUP = 0x00000000, + WREPL_GROUP_FLAG_IS_GROUP = 0x00000001 + } wrepl_group_flag; + +#define WREPL_IS_GROUP(flags) (\ + ((((flags) & WREPL_FLAGS_RECORD_TYPE) == WREPL_TYPE_GROUP)|| \ + (((flags) & WREPL_FLAGS_RECORD_TYPE) == WREPL_TYPE_SGROUP))\ + ? WREPL_GROUP_FLAG_IS_GROUP : WREPL_GROUP_FLAG_NO_GROUP) + + typedef struct { + wrepl_nbt_name name; + wrepl_flags flags; + [flag(NDR_LITTLE_ENDIAN),value(WREPL_IS_GROUP(flags))] wrepl_group_flag is_group; + udlongr id; + [switch_is(flags & 2)] wrepl_addresses addresses; + ipv4address unknown; + } wrepl_wins_name; + + typedef struct { + uint32 num_names; + wrepl_wins_name names[num_names]; + } wrepl_send_reply; + + typedef struct { + ipv4address address; + udlongr max_version; + udlongr 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_UPDATE2 = 5, + WREPL_REPL_INFORM = 8, + WREPL_REPL_INFORM2 = 9 + } 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)] wrepl_table table; + [case(WREPL_REPL_UPDATE2)] wrepl_table table; + [case(WREPL_REPL_INFORM)] wrepl_table table; + [case(WREPL_REPL_INFORM2)] 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; + + /* + 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_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_BIG_ENDIAN|NDR_PAHEX),public] struct { + [value(ndr_size_wrepl_packet(&packet, ndr->flags))] uint32 size; + wrepl_packet packet; + } wrepl_wrap; +} |