summaryrefslogtreecommitdiff
path: root/source4/librpc/idl/winsrepl.idl
blob: 13da5a9c26609e995fe6d3770419720742916e27 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#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),
  pointer_default_top(unique)
]
interface wrepl
{
	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];
		ipv4address unknown;
	} wrepl_address_list;

	typedef [nodiscriminant] union {
		[case(0)] wrepl_ip           address;
		[case(2)] wrepl_address_list addresses;
	} wrepl_addresses;

	typedef struct {
		uint32    name_len;
		uint8     name[name_len];
		uint32    flags;
		[flag(NDR_LITTLE_ENDIAN)] uint32 group_flag;
		udlongr   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;
		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_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;

	/*
	  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;

	void decode_winsrepl(
		[in] wrepl_wrap p
		);

}