frsrpc.idl: almost complete the idl for the frsrpc_FrsSendCommPkt() function
authorStefan Metzmacher <metze@samba.org>
Tue, 21 Jul 2009 14:05:44 +0000 (16:05 +0200)
committerStefan Metzmacher <metze@samba.org>
Tue, 21 Jul 2009 17:11:22 +0000 (19:11 +0200)
TODO: The amount of chunks is dynamic, we need to fix that

metze

librpc/idl/frsrpc.idl

index 1019a25b28a9c2bc649b5b7f7e18234d2d16b062..54f143c1f1a96b211b4fcc506a776a89e11af2c7 100644 (file)
@@ -14,112 +14,337 @@ interface frsrpc
        /*****************/
        /* Function 0x00 */
 
-       /* TAG:3 this TLV contains a GUID and the name of the server sending
-        * the call
-        */
        typedef struct {
-               [subcontext(4)] GUID unknown1;
-               [subcontext(4)] nstring source_server;
-       } frsrpc_FrsSendCommPktChunkDataSSRV;
+               [subcontext(4)] GUID guid;
+               [subcontext(4)] nstring name;
+       } frsrpc_CommPktChunkGuidName;
 
-       /* TAG:4 this TLV contains a GUID and the name of the destination
-        * server the PDU is sent to
-        */
        typedef struct {
-               [subcontext(4)] GUID unknown1;
-               [subcontext(4)] nstring dest_server;
-       } frsrpc_FrsSendCommPktChunkDataDSRV;
+               hyper vsn;
+               GUID guid;
+       } frsrpc_CommPktGSVN;
+
+       typedef [bitmap32bit,flag(NDR_PAHEX)] bitmap {
+               FRSRPC_CO_FLAG_ABORT_CO = 0x00000001,
+               FRSRPC_CO_FLAG_VV_ACTIVATED     = 0x00000002,
+               FRSRPC_CO_FLAG_CONTENT_CMD      = 0x00000004,
+               FRSRPC_CO_FLAG_LOCATION_CMD     = 0x00000008,
+               FRSRPC_CO_FLAG_ONLIST           = 0x00000010,
+               FRSRPC_CO_FLAG_LOCALCO          = 0x00000020,
+               FRSRPC_CO_FLAG_RETRY            = 0x00000040,
+               FRSRPC_CO_FLAG_OUT_OF_ORDER     = 0x00000200,
+               FRSRPC_CO_FLAG_NEW_FILE         = 0x00000400,
+               FRSRPC_CO_FLAG_CONTROL          = 0x00001000,
+               FRSRPC_CO_FLAG_DIRECTED_CO      = 0x00002000,
+               FRSRPC_CO_FLAG_VVJOIN_TO_ORIG   = 0x00040000,
+               FRSRPC_CO_FLAG_SKIP_ORIG_REC_C  = 0x00100000,
+               FRSRPC_CO_FLAG_MOVEIN_GEN       = 0x00200000,
+               FRSRPC_CO_FLAG_MORPH_GEN_HEAD   = 0x00400000,
+               FRSRPC_CO_FLAG_JUST_OID_RESET   = 0x00800000,
+               FRSRPC_CO_FLAG_COMPRESSED_STAGE = 0x01000000,
+               FRSRPC_CO_FLAG_COMPRESSED_STAGE = 0x01000000,
+               FRSRPC_CO_FLAG_SKIP_VV_UPDATE   = 0x02000000
+       } frsrpc_CommPktCoCmdFlags;
+
+       const uint32 FRSRPC_CO_IFLAG_NONE = 0x0000000;
+
+       typedef [bitmap32bit,flag(NDR_PAHEX)] bitmap {
+               FRSRPC_CO_IFLAG_VVRETIRE_EXEC   = 0x00000001,
+               FRSRPC_CO_IFLAG_CO_ABORT        = 0x00000002,
+               FRSRPC_CO_IFLAG_DIR_ENUM_PENDING= 0x00000004
+       } frsrpc_CommPktCoCmdIFlags;
+
+       typedef [v1_enum,flag(NDR_PAHEX)] enum {
+               FRSRPC_CO_STATUS_CO_ENTERED_LOG                 = 0x00000000,
+               FRSRPC_CO_STATUS_ALLOC_STAGING_LOCAL_CO         = 0x00000001,
+               FRSRPC_CO_STATUS_LOCAL_CO_STAGING_STARTED       = 0x00000002,
+               FRSRPC_CO_STATUS_LOCAL_CO_STAGING_COMPLETED     = 0x00000003,
+               FRSRPC_CO_STATUS_WAIT_RETRY_LOCAL_CO_STAGING    = 0x00000004,
+               FRSRPC_CO_STATUS_ALLOC_STAGING_REMOTE_CO        = 0x00000005,
+               FRSRPC_CO_STATUS_REMOTE_CO_STAGING_STARTED      = 0x00000006,
+               FRSRPC_CO_STATUS_REMOTE_CO_STAGING_COMPLETED    = 0x00000007,
+               FRSRPC_CO_STATUS_WAIT_RETRY_REMOTE_CO_STAGING   = 0x00000008,
+               FRSRPC_CO_STATUS_FILE_INSTALL_REQUESTED         = 0x00000009,
+               FRSRPC_CO_STATUS_FILE_INSTALL_STARTED           = 0x0000000A,
+               FRSRPC_CO_STATUS_FILE_INSTALL_COMPLETED         = 0x0000000B,
+               FRSRPC_CO_STATUS_FILE_INSTALL_WAIT_RETRY        = 0x0000000C,
+               FRSRPC_CO_STATUS_FILE_INSTALL_RETRYING          = 0x0000000D,
+               FRSRPC_CO_STATUS_FILE_INSTALL_RENAME_RETRYING   = 0x0000000E,
+               FRSRPC_CO_STATUS_FILE_INSTALL_DELETE_RETRYING   = 0x0000000F,
+               FRSRPC_CO_STATUS_CO_RECYCLED_FOR_ENUM           = 0x00000013,
+               FRSRPC_CO_STATUS_REQUEST_OUTBOUND_PROPAGATION   = 0x00000014,
+               FRSRPC_CO_STATUS_REQUEST_ACCEPTED_OUTBOUND_LOG  = 0x00000015,
+               FRSRPC_CO_STATUS_DB_STATE_UPDATE_STARTED        = 0x00000016,
+               FRSRPC_CO_STATUS_DB_STATE_UPDATE_COMPLETED      = 0x00000017,
+               FRSRPC_CO_STATUS_CO_ABORTED                     = 0x00000018
+       } frsrpc_CommPktCoCmdStatus;
+
+       typedef [bitmap32bit,flag(NDR_PAHEX)] bitmap {
+               FRSRPC_CONTENT_REASON_DATA_OVERWRITE            = 0x00000001,
+               FRSRPC_CONTENT_REASON_DATA_EXTEND               = 0x00000002,
+               FRSRPC_CONTENT_REASON_DATA_TRUNCATION           = 0x00000004,
+               FRSRPC_CONTENT_REASON_NAMED_DATA_OVERWRITE      = 0x00000010,
+               FRSRPC_CONTENT_REASON_NAMED_DATA_EXTEND         = 0x00000020,
+               FRSRPC_CONTENT_REASON_NAMED_DATA_TRUNCATION     = 0x00000040,
+               FRSRPC_CONTENT_REASON_FILE_CREATE               = 0x00000100,
+               FRSRPC_CONTENT_REASON_FILE_DELETE               = 0x00000200,
+               FRSRPC_CONTENT_REASON_EA_CHANGE                 = 0x00000400,
+               FRSRPC_CONTENT_REASON_SECURITY_CHANGE           = 0x00000800,
+               FRSRPC_CONTENT_REASON_OLD_NAME                  = 0x00001000,
+               FRSRPC_CONTENT_REASON_NEW_NAME                  = 0x00002000,
+               FRSRPC_CONTENT_REASON_BASIC_INFO_CHANGE         = 0x00004000,
+               FRSRPC_CONTENT_REASON_COMPRESSION_CHANGE        = 0x00020000
+       } frsrpc_CommPktCoCmdContentCmd;
+
+       typedef [v1_enum,flag(NDR_PAHEX)] enum {
+               FRSRPC_CO_LOCATION_FILE_CREATE  = 0x00000000,
+               FRSRPC_CO_LOCATION_DIR_CREATE   = 0x00000000 | 0x00000001,
+               FRSRPC_CO_LOCATION_FILE_DELETE  = 0x00000002,
+               FRSRPC_CO_LOCATION_DIR_DELETE   = 0x00000002 | 0x00000001,
+               FRSRPC_CO_LOCATION_FILE_MOVEIN  = 0x00000004,
+               FRSRPC_CO_LOCATION_DIR_MOVEIN   = 0x00000004 | 0x00000001,
+               FRSRPC_CO_LOCATION_FILE_MOVEIN2 = 0x00000006,
+               FRSRPC_CO_LOCATION_DIR_MOVEIN2  = 0x00000006 | 0x00000001,
+               FRSRPC_CO_LOCATION_FILE_MOVEOUT = 0x00000008,
+               FRSRPC_CO_LOCATION_DIR_MOVEOUT  = 0x00000008 | 0x00000001,
+               FRSRPC_CO_LOCATION_FILE_MOVERS  = 0x0000000a,
+               FRSRPC_CO_LOCATION_DIR_MOVERS   = 0x0000000a | 0x00000001,
+               FRSRPC_CO_LOCATION_FILE_MOVEDIR = 0x0000000c,
+               FRSRPC_CO_LOCATION_DIR_MOVEDIR  = 0x0000000c | 0x00000001,
+               FRSRPC_CO_LOCATION_FILE_NO_CMD  = 0x0000000e,
+               FRSRPC_CO_LOCATION_DIR_NO_CMD   = 0x0000000e | 0x00000001
+       } frsrpc_CommPktCoCmdLocationCmd;
 
-       /* TAG:18 this TLV contains a  timestamp 
-       */
        typedef struct {
-               [subcontext(4)] NTTIME time;
-       } frsrpc_FrsSendCommPktChunkDataTS;
+               uint32 sequence_number;
+               frsrpc_CommPktCoCmdFlags flags;
+               frsrpc_CommPktCoCmdIFlags iflags;
+               frsrpc_CommPktCoCmdStatus status;
+               frsrpc_CommPktCoCmdContentCmd content_cmd;
+               frsrpc_CommPktCoCmdLocationCmd location_cmd;
+               uint32 file_attributes;
+               uint32 file_version_number;
+               uint32 partern_ack_sequence_number;
+               [value(0)] uint32 not_used;
+               hyper file_size;
+               hyper file_offset;
+               hyper frs_vsn;
+               hyper file_usn;
+               hyper jrnl_usn;
+               hyper jrnl_first_usn;
+               uint32 original_replica_num;
+               uint32 new_replica_num;
+               GUID change_order_guid;
+               GUID originator_guid;
+               GUID file_guid;
+               GUID old_parent_guid;
+               GUID new_parent_guid;
+               GUID connection_guid;
+               hyper ack_version;
+               [value(0)] hyper spare2ul1;
+               [value(0)] hyper spare1guid_p1;
+               [value(0)] hyper spare1guid_p2;
+               [value(0)] hyper spare2guid_p1;
+               [value(0)] hyper spare3guid_p2;
+               [value(0)] uint32 spare1wcs;
+               [value(0)] uint32 spare2wcs;
+               [value(0)] uint32 extension;
+               [value(0)] uint32 spare2bin;
+               NTTIME event_time;
+               [value(2*strlen_m(file_name))] uint16 file_name_length;
+#define FRSRPC_MAX_PATH 260
+               [charset(UTF16)] uint16 file_name[FRSRPC_MAX_PATH+1];
+               [value(0)] uint8 padding1;
+               [value(0)] uint8 padding2;
+               [value(0)] uint8 padding3;
+               [value(0)] uint8 padding4;
+       } frsrpc_CommPktChangeOrderCommand;
+
+       typedef [v1_enum,flag(NDR_PAHEX)] enum {
+               FRSRPC_DATA_EXTENSION_TERMINATOR        = 0x00000000,
+               FRSRPC_DATA_EXTENSION_MD5_CHECKSUM      = 0x00000001,
+               FRSRPC_DATA_EXTENSION_RETRY_TIMEOUT     = 0x00000002
+       } frsrpc_CommPktDataExtensionType;
 
+       typedef [flag(NDR_PAHEX)] struct {
+               [value(0x00000018)] uint32 prefix_size;
+               [value(FRSRPC_DATA_EXTENSION_MD5_CHECKSUM)]
+                       frsrpc_CommPktDataExtensionType prefix_type;
+               uint8 data[16];
+       } frsrpc_CommPktDataExtensionChecksum;
 
        typedef struct {
-               uint32 unknown1;
-       } frsrpc_FrsSendCommPktChunkDataA;
+               [value(0x00000018)] uint32 prefix_size;
+               [value(FRSRPC_DATA_EXTENSION_RETRY_TIMEOUT)]
+                       frsrpc_CommPktDataExtensionType prefix_type;
+               uint32 count;
+               [value(0)] uint32 not_used;
+               NTTIME first_try_time;
+       } frsrpc_CommPktDataExtensionRetryTimeout;
+
+       typedef [flag(NDR_PAHEX)] enum {
+               FRSRPC_CO_RECORD_EXTENSION_VERSION_WIN2K        = 0x0000,
+               FRSRPC_CO_RECORD_EXTENSION_VERSION_1            = 0x0001
+       } frsrpc_CommPktCoRecordExtensionMajor;
 
        typedef struct {
-               uint32 unknown1;
-               GUID unknown2;
-               [subcontext(4)] nstring unknown3;
-       } frsrpc_FrsSendCommPktChunkDataB;
+               [value(0x00000028)] uint32 field_size;
+               [value(FRSRPC_CO_RECORD_EXTENSION_VERSION_WIN2K)]
+                       frsrpc_CommPktCoRecordExtensionMajor major;
+               [value(0x0001)] uint16 offset_count;
+               [value(0x00000010)] uint32 offset;
+               [value(0)] uint32 offset_last;
+               frsrpc_CommPktDataExtensionChecksum data_checksum;
+       } frsrpc_CommPktCoRecordExtensionWin2k;
 
        typedef struct {
-               uint32 unknown1;
-               GUID unknown2;
-       } frsrpc_FrsSendCommPktChunkDataC;
+               [value(0x00000048)] uint32 field_size;
+               frsrpc_CommPktCoRecordExtensionMajor major;
+               [value(0x0002)] uint16 offset_count;
+               [value(0x00000018)] uint32 offset0;
+               [value(0x00000030)] uint32 offset1;/*TODO: is this correct??? */
+               [value(0)] uint32 offset_last;
+               [value(0)] uint32 not_used;
+               frsrpc_CommPktDataExtensionChecksum data_checksum;
+               frsrpc_CommPktDataExtensionRetryTimeout data_retry_timeout;
+       } frsrpc_CommPktChangeOrderRecordExtension;
+
+       typedef [v1_enum,flag(NDR_PAHEX)] enum {
+               FRSRPC_COMMAND_REMOTE_CO                = 0x00000218,
+               FRSRPC_COMMAND_RECEIVING_STATE          = 0x00000238,
+               FRSRPC_COMMAND_REMOTE_CO_DONE           = 0x00000250,
+               FRSRPC_COMMAND_ABORT_FETCH              = 0x00000246,
+               FRSRPC_COMMAND_RETRY_FETCH              = 0x00000244,
+               FRSRPC_COMMAND_NEED_JOIN                = 0x00000121,
+               FRSRPC_COMMAND_START_JOIN               = 0x00000122,
+               FRSRPC_COMMAND_JOINING                  = 0x00000130,
+               FRSRPC_COMMAND_JOINED                   = 0x00000128,
+               FRSRPC_COMMAND_UNJOIN_REMOTE            = 0x00000148,
+               FRSRPC_COMMAND_WJOIN_DONE               = 0x00000136,
+               FRSRPC_COMMAND_SEND_STAGE               = 0x00000228
+       } frsrpc_CommPktCommand;
+
+       typedef [flag(NDR_PAHEX)] enum {
+               FRSRPC_COMM_PKT_CHUNK_BOP                       = 0x0001,
+               FRSRPC_COMM_PKT_CHUNK_COMMAND                   = 0x0002,
+               FRSRPC_COMM_PKT_CHUNK_TO                        = 0x0003,
+               FRSRPC_COMM_PKT_CHUNK_FROM                      = 0x0004,
+               FRSRPC_COMM_PKT_CHUNK_REPLICA                   = 0x0005,
+               FRSRPC_COMM_PKT_CHUNK_CONNECTION                = 0x0008,
+               FRSRPC_COMM_PKT_CHUNK_JOIN_GUID                 = 0x0006,
+               FRSRPC_COMM_PKT_CHUNK_LAST_JOIN_TIME            = 0x0012,
+
+               FRSRPC_COMM_PKT_CHUNK_VVECTOR                   = 0x0007,
+               FRSRPC_COMM_PKT_CHUNK_JOIN_TIME                 = 0x0011,
+               FRSRPC_COMM_PKT_CHUNK_REPLICA_VERSION_GUID      = 0x0014,
+               FRSRPC_COMM_PKT_CHUNK_COMPRESSION_GUID          = 0x0018,
+
+               FRSRPC_COMM_PKT_CHUNK_BLOCK                     = 0x0009,
+               FRSRPC_COMM_PKT_CHUNK_BLOCK_SIZE                = 0x000A,
+               FRSRPC_COMM_PKT_CHUNK_FILE_SIZE                 = 0x000B,
+               FRSRPC_COMM_PKT_CHUNK_FILE_OFFSET               = 0x000C,
+               FRSRPC_COMM_PKT_CHUNK_GVSN                      = 0x000E,
+               FRSRPC_COMM_PKT_CHUNK_CO_GUID                   = 0x000F,
+               FRSRPC_COMM_PKT_CHUNK_CO_SEQUENCE_NUMBER        = 0x0010,
+
+               FRSRPC_COMM_PKT_CHUNK_REMOTE_CO                 = 0x000D,
+               FRSRPC_COMM_PKT_CHUNK_CO_EXT_WIN2K              = 0x0016,
+               FRSRPC_COMM_PKT_CHUNK_CO_EXTENTION_2            = 0x0017,
+
+               FRSRPC_COMM_PKT_CHUNK_EOP                       = 0x0013
+       } frsrpc_CommPktChunkType;
 
        typedef [nodiscriminant] union {
                [default,flag(NDR_REMAINING)] DATA_BLOB blob;
-               [case(1)] frsrpc_FrsSendCommPktChunkDataA A;
-               [case(2)] frsrpc_FrsSendCommPktChunkDataA A;
-               [case(3)] frsrpc_FrsSendCommPktChunkDataSSRV SSRV;
-               [case(4)] frsrpc_FrsSendCommPktChunkDataDSRV DSRV;
-               [case(5)] frsrpc_FrsSendCommPktChunkDataB B;
-               [case(8)] frsrpc_FrsSendCommPktChunkDataB B;
-               [case(6)] frsrpc_FrsSendCommPktChunkDataC C;
-               [case(18)] frsrpc_FrsSendCommPktChunkDataTS TS;
-               [case(19)] frsrpc_FrsSendCommPktChunkDataA A;
-       } frsrpc_FrsSendCommPktChunkData;
-
-       typedef struct {
-               uint16 type;
-               [subcontext(4),switch_is(type)] frsrpc_FrsSendCommPktChunkData data;
-       } frsrpc_FrsSendCommPktChunk;
+               [case(FRSRPC_COMM_PKT_CHUNK_BOP)]
+                       [value(0)] uint32 bop;
+               [case(FRSRPC_COMM_PKT_CHUNK_COMMAND)]
+                       frsrpc_CommPktCommand command;
+               [case(FRSRPC_COMM_PKT_CHUNK_TO)]
+                       frsrpc_CommPktChunkGuidName to;
+               [case(FRSRPC_COMM_PKT_CHUNK_FROM)]
+                       frsrpc_CommPktChunkGuidName from;
+               [case(FRSRPC_COMM_PKT_CHUNK_REPLICA)]
+                       frsrpc_CommPktChunkGuidName replica;
+               [case(FRSRPC_COMM_PKT_CHUNK_CONNECTION)]
+                       frsrpc_CommPktChunkGuidName connection;
+               [case(FRSRPC_COMM_PKT_CHUNK_JOIN_GUID)][subcontext(4)]
+                       GUID join_guid;
+               [case(FRSRPC_COMM_PKT_CHUNK_LAST_JOIN_TIME)]
+                       NTTIME last_join_time;
+               [case(FRSRPC_COMM_PKT_CHUNK_VVECTOR)][subcontext(4)]
+                       frsrpc_CommPktGSVN vvector;
+               [case(FRSRPC_COMM_PKT_CHUNK_JOIN_TIME)][subcontext(4)]
+                       NTTIME join_time;
+               [case(FRSRPC_COMM_PKT_CHUNK_REPLICA_VERSION_GUID)][subcontext(4)]
+                       GUID replica_version_guid;
+               [case(FRSRPC_COMM_PKT_CHUNK_COMPRESSION_GUID)]
+                       GUID compression_guid;
+               [case(FRSRPC_COMM_PKT_CHUNK_BLOCK)]
+                       [flag(NDR_REMAINING)] DATA_BLOB block;
+               [case(FRSRPC_COMM_PKT_CHUNK_BLOCK_SIZE)]
+                       hyper block_size;
+               [case(FRSRPC_COMM_PKT_CHUNK_FILE_SIZE)]
+                       hyper file_size;
+               [case(FRSRPC_COMM_PKT_CHUNK_FILE_OFFSET)]
+                       hyper file_offset;
+               [case(FRSRPC_COMM_PKT_CHUNK_GVSN)][subcontext(4)]
+                       frsrpc_CommPktGSVN gvsn;
+               [case(FRSRPC_COMM_PKT_CHUNK_CO_GUID)][subcontext(4)]
+                       GUID co_guid;
+               [case(FRSRPC_COMM_PKT_CHUNK_CO_SEQUENCE_NUMBER)]
+                       uint32 co_sequnence_number;
+               [case(FRSRPC_COMM_PKT_CHUNK_REMOTE_CO)][subcontext(4)]
+                       frsrpc_CommPktChangeOrderCommand remote_co;
+               [case(FRSRPC_COMM_PKT_CHUNK_CO_EXT_WIN2K)][subcontext(4)]
+                       frsrpc_CommPktCoRecordExtensionWin2k co_ext_win2k;
+               [case(FRSRPC_COMM_PKT_CHUNK_CO_EXTENTION_2)][subcontext(4)]
+                       frsrpc_CommPktChangeOrderRecordExtension co_extension2;
+               [case(FRSRPC_COMM_PKT_CHUNK_EOP)]
+                       [value(0xFFFFFFFF)] uint32 bop;
+       } frsrpc_CommPktChunkData;
 
        typedef [flag(NDR_NOALIGN)] struct {
-               frsrpc_FrsSendCommPktChunk chunk1;
-               frsrpc_FrsSendCommPktChunk chunk2;
-               frsrpc_FrsSendCommPktChunk chunk3;
-               frsrpc_FrsSendCommPktChunk chunk4;
-               frsrpc_FrsSendCommPktChunk chunk5;
-               frsrpc_FrsSendCommPktChunk chunk6;
-               frsrpc_FrsSendCommPktChunk chunk7;
-               frsrpc_FrsSendCommPktChunk chunk8;
-               frsrpc_FrsSendCommPktChunk chunk9;
-       } frsrpc_FrsSendCommPktChunkCtr;
+               frsrpc_CommPktChunkType type;
+               [subcontext(4),switch_is(type)] frsrpc_CommPktChunkData data;
+       } frsrpc_CommPktChunk;
+
+       typedef [gensize,flag(NDR_NOALIGN)] struct {
+               /* TODO: make this dynamic */
+               frsrpc_CommPktChunk chunks[9];
+       } frsrpc_CommPktChunkCtr;
+
+       typedef [v1_enum] enum {
+               FRSRPC_COMM_PKT_MAJOR_0 = 0x00000000
+       } frsrpc_CommPktMajor;
+
+       typedef [v1_enum] enum {
+               FRSRPC_COMM_PKT_MINOR_0 = 0x00000000,
+               FRSRPC_COMM_PKT_MINOR_1 = 0x00000001,
+               FRSRPC_COMM_PKT_MINOR_2 = 0x00000002,
+               FRSRPC_COMM_PKT_MINOR_3 = 0x00000003,
+               FRSRPC_COMM_PKT_MINOR_4 = 0x00000004,
+               FRSRPC_COMM_PKT_MINOR_5 = 0x00000005,
+               FRSRPC_COMM_PKT_MINOR_6 = 0x00000006,
+               FRSRPC_COMM_PKT_MINOR_7 = 0x00000007,
+               FRSRPC_COMM_PKT_MINOR_8 = 0x00000008,
+               FRSRPC_COMM_PKT_MINOR_9 = 0x00000009
+       } frsrpc_CommPktMinor;
 
        typedef struct {
-               uint32 unknown1;
-               uint32 unknown2;
-               uint32 unknown3;
-               uint32 unknown4;
-               uint32 tlv_size;
-               uint32 unknown6;
-               uint32 unknown7; /* This may be a UNIQUE pointer? */
-               uint32 unknown8;
-               uint32 unknown9;
-               /*
-                * The format of this blob is this a concatenation
-                * of TLVs which are not really NDR encoded.
-                *
-                * The individual TLVs are encoded as :
-                * struct {
-                *      uint16 type;
-                *      [subcontext(4),switch_is(type)] chunk_data data;
-                * } chunk;
-                * 
-                * some of the chunk are like this:
-                *
-                * struct {
-                *      uint32 unknown; // 0x00000010
-                *      struct GUID guid;
-                *      lstring string;
-                * } ...;
-                *
-                *
-                * The tags are (might be) :
-                *  3: Source server sending the PDU
-                *  4: Destination server the PDU is sent to
-                * 18: Timestamp
-                *
-                */
-               [subcontext(4)/*,size_is(tlv_size)*/] frsrpc_FrsSendCommPktChunkCtr *chunks;
-               uint32 unknown10;
-               uint32 unknown11;
+               frsrpc_CommPktMajor major;
+               frsrpc_CommPktMinor minor;
+               [value(1)] uint32 cs_id;
+               [value(pkt_len+12)] uint32 memory_len;
+               [value(ndr_size_frsrpc_CommPktChunkCtr(r->ctr,
+                       ndr->iconv_convenience, ndr->flags))]
+               [range(0, 262144)]
+                       uint32 pkt_len;
+               [value(0)] uint32 upk_len;
+               [subcontext(4),subcontext_size(pkt_len)]
+                       frsrpc_CommPktChunkCtr *ctr;
+               [value(0)] uint32 data_name;
+               [value(0)] uint32 data_handle;
        } frsrpc_FrsSendCommPktReq;
 
        WERROR frsrpc_FrsSendCommPkt(