1#include "idl_types.h"
2
3/*
4   IDL structures for WINS replication protocol (port 42)
5
6   Note that WINS replication is not traditionally encoded using
7   IDL/NDR
8
9   Written by Andrew Tridgell <tridge@osdl.org>
10*/
11
12import "nbt.idl";
13
14interface wrepl
15{
16	const int WINS_REPLICATION_PORT = 42;
17
18	typedef [flag(NDR_BIG_ENDIAN)] struct {
19		ipv4address owner;
20		ipv4address ip;
21	} wrepl_ip;
22
23	typedef [flag(NDR_LITTLE_ENDIAN)] struct {
24		uint32      num_ips;
25		wrepl_ip    ips[num_ips];
26	} wrepl_address_list;
27
28	typedef [nodiscriminant] union {
29		[case(0)] ipv4address ip;
30		[case(2)] wrepl_address_list addresses;
31	} wrepl_addresses;
32
33	typedef [enum8bit] enum {
34		WREPL_TYPE_UNIQUE	= 0x0,
35		WREPL_TYPE_GROUP	= 0x1,
36		WREPL_TYPE_SGROUP	= 0x2,
37		WREPL_TYPE_MHOMED	= 0x3
38	} wrepl_name_type;
39
40	typedef [enum8bit] enum {
41		WREPL_STATE_ACTIVE	= 0x0,
42		WREPL_STATE_RELEASED	= 0x1,
43		WREPL_STATE_TOMBSTONE	= 0x2,
44		WREPL_STATE_RESERVED	= 0x3
45	} wrepl_name_state;
46
47	typedef [enum8bit] enum {
48		WREPL_NODE_B	= 0x0,
49		WREPL_NODE_P	= 0x1,
50		WREPL_NODE_M	= 0x2,
51		WREPL_NODE_H	= 0x3
52	} wrepl_name_node;
53
54	typedef [bitmap32bit] bitmap {
55		WREPL_FLAGS_RECORD_TYPE		= 0x00000003,
56		WREPL_FLAGS_RECORD_STATE	= 0x0000000C,
57		WREPL_FLAGS_REGISTERED_LOCAL	= 0x00000010,
58		WREPL_FLAGS_NODE_TYPE		= 0x00000060,
59		WREPL_FLAGS_IS_STATIC		= 0x00000080
60	} wrepl_flags;
61
62	typedef [v1_enum] enum {
63		WREPL_GROUP_FLAG_NO_GROUP	= 0x00000000,
64		WREPL_GROUP_FLAG_IS_GROUP	= 0x00000001
65	} wrepl_group_flag;
66
67#define WREPL_IS_GROUP(flags) (\
68	((((flags) & WREPL_FLAGS_RECORD_TYPE) == WREPL_TYPE_GROUP)|| \
69	(((flags) & WREPL_FLAGS_RECORD_TYPE) == WREPL_TYPE_SGROUP))\
70	? WREPL_GROUP_FLAG_IS_GROUP : WREPL_GROUP_FLAG_NO_GROUP)
71
72	typedef struct {
73		wrepl_nbt_name name;
74		wrepl_flags flags;
75		[flag(NDR_LITTLE_ENDIAN),value(WREPL_IS_GROUP(flags))] wrepl_group_flag is_group;
76		udlongr   id;
77		[switch_is(flags & 2)] wrepl_addresses addresses;
78		ipv4address unknown;
79	} wrepl_wins_name;
80
81	typedef struct {
82		uint32          num_names;
83		wrepl_wins_name names[num_names];
84	} wrepl_send_reply;
85
86	typedef struct {
87		ipv4address address;
88		udlongr     max_version;
89		udlongr     min_version;
90		uint32      type;
91	} wrepl_wins_owner;
92
93	typedef struct {
94		uint32           partner_count;
95		wrepl_wins_owner partners[partner_count];
96		ipv4address      initiator;
97	} wrepl_table;
98
99	typedef [v1_enum] enum {
100		WREPL_REPL_TABLE_QUERY  = 0,
101		WREPL_REPL_TABLE_REPLY  = 1,
102		WREPL_REPL_SEND_REQUEST = 2,
103		WREPL_REPL_SEND_REPLY   = 3,
104		WREPL_REPL_UPDATE       = 4,
105		WREPL_REPL_UPDATE2      = 5,
106		WREPL_REPL_INFORM       = 8,
107		WREPL_REPL_INFORM2      = 9
108	} wrepl_replication_cmd;
109
110	typedef [nodiscriminant] union {
111		[case(WREPL_REPL_TABLE_QUERY)] ;
112		[case(WREPL_REPL_TABLE_REPLY)]  wrepl_table      table;
113		[case(WREPL_REPL_SEND_REQUEST)] wrepl_wins_owner owner;
114		[case(WREPL_REPL_SEND_REPLY)]   wrepl_send_reply reply;
115		[case(WREPL_REPL_UPDATE)]       wrepl_table      table;
116		[case(WREPL_REPL_UPDATE2)]      wrepl_table      table;
117		[case(WREPL_REPL_INFORM)]       wrepl_table      table;
118		[case(WREPL_REPL_INFORM2)]      wrepl_table      table;
119	} wrepl_replication_info;
120
121	typedef struct {
122		wrepl_replication_cmd command;
123		[switch_is(command)] wrepl_replication_info info;
124	} wrepl_replication;
125
126	typedef struct {
127		uint32 assoc_ctx;
128		uint16 minor_version;
129		uint16 major_version;
130	} wrepl_start;
131
132	typedef struct {
133		uint32 reason;
134	} wrepl_stop;
135
136	typedef [v1_enum] enum {
137		WREPL_START_ASSOCIATION       = 0,
138		WREPL_START_ASSOCIATION_REPLY = 1,
139		WREPL_STOP_ASSOCIATION        = 2,
140		WREPL_REPLICATION             = 3
141	} wrepl_mess_type;
142
143	typedef [nodiscriminant] union {
144		[case(WREPL_START_ASSOCIATION)]       wrepl_start start;
145		[case(WREPL_START_ASSOCIATION_REPLY)] wrepl_start start_reply;
146		[case(WREPL_STOP_ASSOCIATION)]        wrepl_stop stop;
147		[case(WREPL_REPLICATION)]             wrepl_replication replication;
148	} wrepl_message;
149
150	/*
151	  the opcode appears to be a bitfield, but as far as I can tell
152	  you must always set the following bits. Additional bits don't
153	  seem to matter. Very strange.
154	*/
155	const int WREPL_OPCODE_BITS = 0x7800;
156
157
158	typedef [gensize,flag(NDR_BIG_ENDIAN|NDR_PAHEX),public] struct {
159		uint32                 opcode;
160		uint32                 assoc_ctx;
161		wrepl_mess_type        mess_type;
162		[switch_is(mess_type)] wrepl_message message;
163		[flag(NDR_REMAINING)] DATA_BLOB padding;
164	} wrepl_packet;
165
166	typedef [flag(NDR_BIG_ENDIAN|NDR_PAHEX),public] struct {
167		[value(ndr_size_wrepl_packet(&packet, ndr->flags))] uint32 size;
168		wrepl_packet    packet;
169	} wrepl_wrap;
170
171	void decode_winsrepl(
172		[in] wrepl_wrap p
173		);
174
175}
176