4 IDL structures for WINS replication protocol (port 42)
6 Note that WINS replication is not traditionally encoded using
9 Written by Andrew Tridgell <tridge@osdl.org>
15 pointer_default(unique),
16 pointer_default_top(unique),
21 const int WINS_REPLICATION_PORT = 42;
23 typedef [flag(NDR_BIG_ENDIAN)] struct {
28 typedef [flag(NDR_LITTLE_ENDIAN)] struct {
30 wrepl_ip ips[num_ips];
33 typedef [nodiscriminant] union {
34 [case(0)] ipv4address ip;
35 [case(2)] wrepl_address_list addresses;
38 typedef [enum8bit] enum {
39 WREPL_TYPE_UNIQUE = 0x0,
40 WREPL_TYPE_GROUP = 0x1,
41 WREPL_TYPE_SGROUP = 0x2,
42 WREPL_TYPE_MHOMED = 0x3
45 typedef [enum8bit] enum {
46 WREPL_STATE_ACTIVE = 0x0,
47 WREPL_STATE_RELEASED = 0x1,
48 WREPL_STATE_TOMBSTONE = 0x2,
49 WREPL_STATE_RESERVED = 0x3
52 typedef [enum8bit] enum {
59 typedef [bitmap32bit] bitmap {
60 WREPL_FLAGS_RECORD_TYPE = 0x00000003,
61 WREPL_FLAGS_RECORD_STATE = 0x0000000C,
62 WREPL_FLAGS_REGISTERED_LOCAL = 0x00000010,
63 WREPL_FLAGS_NODE_TYPE = 0x00000060,
64 WREPL_FLAGS_IS_STATIC = 0x00000080
67 typedef [v1_enum] enum {
68 WREPL_GROUP_FLAG_NO_GROUP = 0x00000000,
69 WREPL_GROUP_FLAG_IS_GROUP = 0x00000001
72 #define WREPL_IS_GROUP(flags) (\
73 ((((flags) & WREPL_FLAGS_RECORD_TYPE) == WREPL_TYPE_GROUP)|| \
74 (((flags) & WREPL_FLAGS_RECORD_TYPE) == WREPL_TYPE_SGROUP))\
75 ? WREPL_GROUP_FLAG_IS_GROUP : WREPL_GROUP_FLAG_NO_GROUP)
80 [flag(NDR_LITTLE_ENDIAN),value(WREPL_IS_GROUP(flags))] wrepl_group_flag is_group;
82 [switch_is(flags & 2)] wrepl_addresses addresses;
88 wrepl_wins_name names[num_names];
100 wrepl_wins_owner partners[partner_count];
101 ipv4address initiator;
104 typedef [v1_enum] enum {
105 WREPL_REPL_TABLE_QUERY = 0,
106 WREPL_REPL_TABLE_REPLY = 1,
107 WREPL_REPL_SEND_REQUEST = 2,
108 WREPL_REPL_SEND_REPLY = 3,
109 WREPL_REPL_UPDATE = 4,
111 WREPL_REPL_INFORM = 8,
113 } wrepl_replication_cmd;
115 typedef [nodiscriminant] union {
116 [case(WREPL_REPL_TABLE_QUERY)] ;
117 [case(WREPL_REPL_TABLE_REPLY)] wrepl_table table;
118 [case(WREPL_REPL_SEND_REQUEST)] wrepl_wins_owner owner;
119 [case(WREPL_REPL_SEND_REPLY)] wrepl_send_reply reply;
120 [case(WREPL_REPL_UPDATE)] wrepl_table table;
121 [case(WREPL_REPL_5)] wrepl_table table;
122 [case(WREPL_REPL_INFORM)] wrepl_table table;
123 [case(WREPL_REPL_9)] wrepl_table table;
124 } wrepl_replication_info;
127 wrepl_replication_cmd command;
128 [switch_is(command)] wrepl_replication_info info;
133 uint16 minor_version;
134 uint16 major_version;
141 typedef [v1_enum] enum {
142 WREPL_START_ASSOCIATION = 0,
143 WREPL_START_ASSOCIATION_REPLY = 1,
144 WREPL_STOP_ASSOCIATION = 2,
145 WREPL_REPLICATION = 3
148 typedef [nodiscriminant] union {
149 [case(WREPL_START_ASSOCIATION)] wrepl_start start;
150 [case(WREPL_START_ASSOCIATION_REPLY)] wrepl_start start_reply;
151 [case(WREPL_STOP_ASSOCIATION)] wrepl_stop stop;
152 [case(WREPL_REPLICATION)] wrepl_replication replication;
156 the opcode appears to be a bitfield, but as far as I can tell
157 you must always set the following bits. Additional bits don't
158 seem to matter. Very strange.
160 const int WREPL_OPCODE_BITS = 0x7800;
163 typedef [gensize,flag(NDR_BIG_ENDIAN|NDR_PAHEX),public] struct {
166 wrepl_mess_type mess_type;
167 [switch_is(mess_type)] wrepl_message message;
168 [flag(NDR_REMAINING)] DATA_BLOB padding;
171 typedef [flag(NDR_BIG_ENDIAN|NDR_PAHEX),public] struct {
172 [value(ndr_size_wrepl_packet(&packet, ndr->flags))] uint32 size;
176 void decode_winsrepl(