Date: Sun, 5 Aug 2007 18:21:32 GMT From: Fredrik Lindberg <fli@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 124740 for review Message-ID: <200708051821.l75ILW5M039958@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=124740 Change 124740 by fli@fli_nexus on 2007/08/05 18:20:44 - Add definitions needed to support record database operations, add/remove/list. - Add definitions needed to support cache operations, list/flush. - Add definitions needed to support interface operations, list. - Give structures and defintions a better prefix than "client packet", they are now called mipc. - Clean up comments and style. - Add several new error codes. Affected files ... .. //depot/projects/soc2007/fli-mdns_sd/shared/mdnsd_clipkg.h#3 edit Differences ... ==== //depot/projects/soc2007/fli-mdns_sd/shared/mdnsd_clipkg.h#3 (text+ko) ==== @@ -24,8 +24,8 @@ * */ -#ifndef _MDNSD_CLIPKG_H_ -#define _MDNSD_CLIPKG_H_ +#ifndef _MDNSD_IPC_H_ +#define _MDNSD_IPC_H_ /* * This contains definitions of the protocol used between mdnsd and @@ -39,7 +39,7 @@ * Protocol version, this is embedded in the first octet of the * initial header. */ -#define CP_VERSION 1 +#define MIPC_VERSION 1 /* * Maximum message length @@ -48,61 +48,97 @@ * limits the maximum resource length to 8978 bytes and thus should * 16384 bytes be well enough for any resources + message headers. */ -#define CP_MAXPLEN 16384 +#define MIPC_MAXPLEN 16384 /* - * Initial header + * Initial header - All message are prepended with this header * * 0 8 31 47 63 * +----+------------+--------+--------+ * |ver | message id | mtype | msglen | * +----+------------+--------+--------+ * - * `ver' - Set to CP_VERSION + * `ver' - Set to MIPC_VERSION * `message id' - Arbitrary integer specified by the client, it should * uniquely identify the message. A response from the server * will contain the same message id. * `mtype' - Defines the message type. * `msglen' - Hold the total message length, including initial header. */ -struct cp_head { - unsigned int cph_ver:8; /* protocol version */ - unsigned int cph_id:24; /* arbitrary message id */ - uint16_t cph_msgtype; /* message type */ - uint16_t cph_msglen; /* total message length */ +struct mipc_head { + unsigned int mih_ver:8; /* protocol version */ + unsigned int mih_id:24; /* arbitrary message id */ + uint16_t mih_msgtype; /* message type */ + uint16_t mih_msglen; /* total message length */ } __packed; /* * List of recognized message types */ -#define CPM_ACK 0 /* command successful, no payload */ -#define CPM_ERROR 1 /* struct cp_error {} */ -#define CPM_QUERY 2 /* struct cp_query {} */ -#define CPM_QRESP 3 /* struct cp_qresp {} */ +#define MIM_ACK 0 /* Command successful, no payload */ +#define MIM_ERROR 1 /* Error message, mipc_error {} */ +#define MIM_QUERY 2 /* Register a query, mipc_query {} */ +#define MIM_QRESP 3 /* Query response, mipc_qresp {} */ +#define MIM_IF_LIST 4 /* Req. Active interfaces, no payload */ +#define MIM_IF 5 /* Interface information, mipc_if {} */ +#define MIM_IDENT_ADD 6 /* Add identifier, mipc_dbident {} */ +#define MIM_IDENT_DEL 7 /* Rem. identifier, mipc_dbident {} */ +#define MIM_IDENT_LIST 8 /* List identifers, mipc_dbi_list {} */ +#define MIM_IDENT 10 /* Identifer info, mipc_dbident {} */ +#define MIM_IDENT_NAME_ADD 11 /* Add name to ident mipc_dbi_name {} */ +#define MIM_IDENT_NAME_DEL 12 /* Rem. name mipc_dbi_name {} */ +#define MIM_IDENT_NAME_LIST 13 /* List ident. mipc_dbi_name_list {} */ +#define MIM_IDENT_NAME 14 /* Name information, mipc_dbi_name {} */ +#define MIM_IDENT_RES_ADD 15 /* Add res., mipc_dbi_res_set {} */ +#define MIM_IDENT_RES_DEL 16 /* Rem. res., mipc_dbi_res_set {} */ +#define MIM_IDENT_RES_LIST 17 /* List res, mipc_dbi_res_list {} */ +#define MIM_IDENT_RES 18 /* Res. info., mipc_dbi_res_get {} */ +#define MIM_CACHE_LIST 19 /* Cache list, mipc_dbi_cache_list {} */ +#define MIM_CACHE 20 /* Cache record, mipc_cache {} */ +#define MIM_CACHE_FLUSH 21 /* Cache flush, mipc_cache_flush {} */ /* * Error message, in case an error occurs an error code * is returned that identifies the type of error. + * + * Usage context + * Might be return as a response to any message if an error was found + * during message processing. + * + * Message structure + * +----------------+ + * | error code | + * +----------------+ + * */ -struct cp_error { - uint32_t cpe_code; +struct mipc_error { + uint32_t mie_code; } __packed; /* * List of recognized error codes */ -#define CPE_PERM 1 /* Permission denied */ -#define CPE_IVAL 2 /* Invalid message */ -#define CPE_UMSG 3 /* Unknown message type */ -#define CPE_TOUT 4 /* Query timeout */ -#define CPE_REGQ 5 /* Failed to register query */ -#define CPE_DEREGQ 6 /* Failed to register query */ +#define MIE_PERM 1 /* Permission denied */ +#define MIE_IVAL 2 /* Invalid message */ +#define MIE_UMSG 3 /* Unknown message type */ +#define MIE_TOUT 4 /* Query timeout */ +#define MIE_REGQ 5 /* Failed to register query */ +#define MIE_DEREGQ 6 /* Failed to register query */ +#define MIE_EXISTS 7 /* Entry does already exists */ +#define MIE_NOENT 8 /* Entry does not exists */ +#define MIE_INTE 9 /* Internal software error */ +#define MIE_NOIF 10 /* No such interface */ /* - * Query message, has a 12 byte header followed by a - * wide character encoded domain name. + * Query message, has a 12 byte header followed by a wide character + * encoded domain name. * Direction: Client -> Server * + * Usage context + * MIM_QUERY - Register a query, client must be prepared to receive + * zero or many MIM_QRESP messages. + * + * Message structure * 0 7 15 31 39 63 79 95 * +----+----+--------+----+------------+--------+--------+---//---+ * |cmd |len |timeout |fam | ifidx | class | type | name | @@ -120,39 +156,39 @@ * `type' - Should contain the desired type or mdns_t_any * `name' - Wide character encoded (wchar_t) domain name * - * Responses to CPQ_CMD_ONESHOT + * Responses to MIQ_CMD_ONESHOT * - One or more struct cp_qresp {}, the more bit might be set to indicate * that more responses are to follow, this is only a hint. A client * must be able to accept responses for as long as the timeout value * specicied in the query message. * - If the timeout value expires without ANY responses an error - * message with the code CPE_TOUT is returned. + * message with the code MIE_TOUT is returned. * - * Responses to CPQ_CMD_CREG - * - If the query was successful registed a CPM_ACK message is returned, - * responses might come in at any point after this until a CPQ_CMD_CDEREG + * Responses to MIQ_CMD_CREG + * - If the query was successful registed a MIM_ACK message is returned, + * responses might come in at any point after this until a MIQ_CMD_CDEREG * command is issued. * - If the registration failed for some reason, an error message with - * the code CPE_REGQ is returned. + * the code MIE_REGQ is returned. * - * Responses to CPQ_CMD_CDEREG - * - If the de-registration was successful a CPM_ACK message is returned, - * otherwise an error message with the code CPE_DEREGQ is returned. + * Responses to MIQ_CMD_CDEREG + * - If the de-registration was successful a MIM_ACK message is returned, + * otherwise an error message with the code MIE_DEREGQ is returned. */ -struct cp_query { - uint8_t cpq_cmd; /* query command */ - uint8_t cpq_len; /* query name length in characters */ - uint16_t cpq_timeout; /* timeout in seconds (oneshot only) */ - unsigned int cpq_fam:8; /* address family to query */ - unsigned int cpq_ifidx:24; /* interface index, 0 = all ifs */ - uint16_t cpq_class; /* query class */ - uint16_t cpq_type; /* query type */ +struct mipc_query { + uint8_t miq_cmd; /* query command */ + uint8_t miq_len; /* query name length in characters */ + uint16_t miq_timeout; /* timeout in seconds (oneshot only) */ + unsigned int miq_fam:8; /* address family to query */ + unsigned int miq_ifidx:24; /* interface index, 0 = all ifs */ + uint16_t miq_class; /* query class */ + uint16_t miq_type; /* query type */ /* Query name follows */ } __packed; -#define CPQ_CMD_ONESHOT 0 -#define CPQ_CMD_CREG 1 -#define CPQ_CMD_CDEREG 2 +#define MIQ_CMD_ONESHOT 0 +#define MIQ_CMD_CREG 1 +#define MIQ_CMD_CDEREG 2 /* * Query response message, 16 byte header followed by a variable length @@ -160,6 +196,11 @@ * resource data field. * Direction: Server -> Client * + * Usage context + * MIM_QRESP - Response to a previous MIM_QUERY + * + * Message structure + * * 0 7 15 31 39 63 95 111 * +----+----+--------+----+------------+----------------+--------+--------+ * |m/z |nlen| reslen |fam | ifidx | ttl | class | type | @@ -180,22 +221,289 @@ * `type' - Resource type. * `resource' - Resource data is not decoded in any way (except for name * decompression) and contains the raw data from mDNS packets. - * - * The header message if will always be set to the id the original - * query message had. */ -struct cp_qresp { - unsigned int cpr_more:1; /* more resources are coming */ - unsigned int cpr_zero:7; /* reserved/zero */ - uint8_t cpr_namlen; /* resource name length in characters */ - uint16_t cpr_reslen; /* resource data length (bytes) */ - unsigned int cpr_fam:8; /* address family */ - unsigned int cpr_ifidx:24; /* interface index */ - uint32_t cpr_ttl; /* ttl (in seconds) */ - uint16_t cpr_class; /* resource class */ - uint16_t cpr_type; /* resource type */ +struct mipc_qresp { + unsigned int mir_more:1; /* more resources are coming */ + unsigned int mir_zero:7; /* reserved/zero */ + uint8_t mir_namlen; /* resource name length in characters */ + uint16_t mir_reslen; /* resource data length (bytes) */ + unsigned int mir_fam:8; /* address family */ + unsigned int mir_ifidx:24; /* interface index */ + uint32_t mir_ttl; /* ttl (in seconds) */ + uint16_t mir_class; /* resource class */ + uint16_t mir_type; /* resource type */ /* Wide character encoded name */ /* Resource data follows */ -}; +} __packed; + + +/* + * Interface information + * + * Usage context + * MIM_IF - Response to MIM_IF_LIST + * + * Message structure + * 0 31 39 63 + * +----------------+----+------------+ + * | interface idx |len | flags | + * +----------------+----+------------+ + */ +struct mipc_if { + uint32_t miif_ifidx; /* Interface index */ + unsigned int miif_len:8; /* Interface name length */ + unsigned int miif_flags:24; /* Flags */ + /* Interface name (ascii) */ +} __packed; + +/* + * List indentifiers from the record database + * Direction: Client -> Server + * + * Usage context + * MIM_IDENT_LIST - Request a list of identifiers on a specific interface. + * Response is zero or many MIM_IDENT followed by one MIM_OK + * + * Message structure + * +----------------+ + * | ident length | + * +----------------+ + * + */ +struct mipc_dbi_list { + uint32_t miil_ifidx; /* Interface index */ +} __packed; + +/* + * Database record ident message. + * A database record is uniquely identified by an identifier, which + * is a normal ascii string. + * Direction: Client <-> Server + * + * Usage context + * MIM_IDENT_ADD - cp_dbident {} as payload, will add the identifier + * specified in the message. MIM_ACK on success, MIM_ERROR + * on failure. + * MIM_IDENT_DEL - cp_dbident {} as payload, will remove the specified + * identifier (and all names + resources) from the + * record database. MIM_ACK on success, MIM_ERROR on failure. + * MIM_IDENT_LIST - No payload. Returns one MIM_IDENT message with + * cp_dbident {} as payload for each existing record. When + * no more records exists an CMP_ACK is returned. + * + * Message structure + * +----------------+-------//-------+ + * | ident length | ident string | + * +----------------+-------//-------+ + * + */ + +struct mipc_dbident { + uint32_t mii_ifidx; /* Interface index */ + uint32_t mii_len; /* ident length */ + /* Ident follows (ascii) */ +} __packed; + +/* + * Add/remove a name from an identifier in the record database + * Direction: Client <-> Server + * + * Usage context + * MIM_IDENT_NAME_ADD - Add a name to an identifier + * MIM_IDENT_NAME_DEL - Remove a name from an identifier + * MIM_IDENT_NAME - Details on a specific name + * + * Message structure + * 0 31 63 79 87 95 + * +----------------+----------------+--------+----+-+---+ + * | interface idx | ident length | len |elen|a|zer| + * +----------------+----------------+--------+----+-+---+ + * +---//---+-----//-----+-----//-----+ + * | ident | unexp name | exp name | + * +---//---+-----//-----+-----//-----+ + * + * The fields `miin_elen' and the flags miin_{active} are only used + * when retriving data from the server. These fields should be zeroed when + * this structure are used in the context client -> server. + */ +struct mipc_dbi_name { + uint32_t miin_ifidx; /* Interface index, 0 = all ifs */ + uint32_t miin_ilen; /* Identifier length */ + uint16_t miin_len; /* Name length (in characters) */ + uint8_t miin_elen; /* Expanded name length (characters) */ + unsigned int miin_active:1; /* Currently selected name */ + unsigned int miin_zero:7; + /* Identifier (ascii) */ + /* Unexpanded name, wide character encoded */ + /* Expanded name, wide character encoded */ +} __packed; + +/* + * List names assigned to an identifier + * Direction: Client -> Server + * + * Usage context + * MIM_IDENT_NAME_LIST - List names assigned to an identifier, the response + * is zero or many MIM_IDENT_NAME (mipc_dbi_name {}) followed by an MIM_ACK + * + * Message structure + * 0 31 63 + * +----------------+----------------+---//---+ + * | interface idx | ident length | ident | + * +----------------+----------------+---//---+ + */ +struct mipc_dbi_name_list { + uint32_t miinl_ifidx; /* Interface index */ + uint32_t miinl_ilen; /* Identifer length */ + /* Identifier (ascii) */ +} __packed; + +/* + * Resource set assigned to an identifier + * Direction: Client -> Server + * + * Usage context + * MIM_IDENT_RES_ADD - Add resource to an identifier + * MIM_IDENT_RES_DEL - Remove an resource to an identifier + * + * Message structure + * 0 31 47 63 95 127 + * +----------------+--------+--------+----------------+----------------+ + * | interface idx | class | type | ttl | ident length | + * +----------------+--------+--------+----------------+----------------+ + * + * 127 143 151 + * +--------+-+-------+----//----+-------------//-------------+ + * | reslen |p| zero | ident | wide name OR pointer ident | + * +--------+-+-------+----//----+------------//--------------+ + */ +struct mipc_dbi_res_set { + uint32_t mirs_ifidx; /* Interface index */ + uint16_t mirs_class; + uint16_t mirs_type; + uint32_t mirs_ttl; + uint32_t mirs_ilen; /* ident length */ + uint16_t mirs_rlen; /* Resource length (in characters) */ + unsigned int mirs_pointer:1; /* Resource data is a pointer */ + unsigned int mirs_zero:15; + /* Record identifier (ascii) */ + /* Wide character encoded name OR ascii encoded pointer name */ +} __packed; + +/* + * Retrive information on a resource assigned to an identifier + * Direction: Server -> Client + * + * Usage context + * MIM_IDENT_RES - Information on a resource, response to MIM_IDENT_RES_LIST + * + * Message structure + * 0 23 31 47 63 79 95 127 + * +------------+----+--------+--------+--------+--------+----------------+ + * | zero |rlen| len | elen | class | type | ttl | + * +------------+----+--------+--------+--------+--------+----------------+ + * 127 159 + * +----------------+----//----+----//----+----//----+----//----+ + * | ident length | rec name | unexp res| exp res |ident ptr | + * +----------------+----//----+----//----+----//----+----//----+ + */ +struct mipc_dbi_res_get { + unsigned int mirg_zero:24; + unsigned int mirg_rlen:8; /* Name length (in characters) */ + uint16_t mirg_len; /* Unencoded resource (in characters) */ + uint16_t mirg_elen; /* Encoded resource length */ + uint16_t mirg_class; /* Resource class */ + uint16_t mirg_type; /* Resource type */ + uint32_t mirg_ttl; /* TTL (in seconds)) */ + uint32_t mirg_ilen; /* Pointer identifer length */ + /* Record name, wide character encoded */ + /* Unencoded (unexpanded) resource data */ + /* Expanded, encoded resource data (binary) */ + /* Pointer identifier (if applicable) */ +} __packed; + +/* + * List resources assigned to an identifier + * Direction: Client -> Server + * + * Usage context + * MIM_IDENT_RES_LIST - Request a list of resources assigned to an identifier + * + * Message structure + * 0 31 63 + * +----------------+----------------+----//----+ + * | identifer len | interface idx | ident | + * +----------------+----------------+----//----+ + */ +struct mipc_dbi_res_list { + uint32_t mirl_ilen; /* Identifer length */ + uint32_t mirl_ifidx; /* Interface index */ + /* Record identifier (ascii) */ +} __packed; + + +/* + * Request to flush cache on given interface index, an index of 0 is equal + * to all active interfaces. + * Direction: Client -> Server + * + * Usage context + * MIM_CACHE_FLUSH - Request cache flush + * + * Message structure + * 0 31 + * +----------------+ + * | interface idx | + * +----------------+ + */ +struct mipc_cache_flush { + uint32_t mcf_ifidx; /* Interface index */ +} __packed; + +/* + * Request to view cache contents + * Direction: Client -> Server + * + * Usage context + * MIM_CACHE_LIST - Rquest to list cache contents + * + * Message structure + * 0 31 + * +----------------+ + * | interface idx | + * +----------------+ + */ +struct mipc_cache_list { + uint32_t mcl_ifidx; /* Interface index */ +} __packed; + +/* + * Information on a cache entry + * Direction: Server -> Client + * + * Usage context + * MIM_CACHE - Response to MIM_CACHE_LIST + * + * Message structure + * 0 15 31 63 95 103 111 127 + * +--------+--------+----------------+----------------+----+----+--------+ + * | class | type | ttl | ttl left |zero|rlen| reslen | + * +--------+--------+----------------+----------------+----+----+--------+ + * 127 + * +---------//---------+---------//---------+ + * | record name | resource (binary) | + * +---------//---------+---------//---------+ + */ +struct mipc_cache { + uint16_t mc_class; /* Resource class */ + uint16_t mc_type; /* Resource type */ + uint32_t mc_ttl; /* Resource TTL */ + uint32_t mc_ttl_left; /* Time left of TTL */ + uint8_t mc_zero; + uint8_t mc_reclen; /* Record length (in characters) */ + uint16_t mc_reslen; /* Resouce length */ + /* Wide character encoded record name */ + /* Binary resource */ +} __packed; -#endif /* _MDNSD_CLIPKG_H_ */ +#endif /* _MDNSD_IPC_H_ */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200708051821.l75ILW5M039958>