diff options
Diffstat (limited to 'net/tipc/msg.h')
| -rw-r--r-- | net/tipc/msg.h | 312 | 
1 files changed, 73 insertions, 239 deletions
diff --git a/net/tipc/msg.h b/net/tipc/msg.h index aee53864d7a..503511903d1 100644 --- a/net/tipc/msg.h +++ b/net/tipc/msg.h @@ -1,8 +1,8 @@  /*   * net/tipc/msg.h: Include file for TIPC message header routines   * - * Copyright (c) 2000-2007, Ericsson AB - * Copyright (c) 2005-2008, Wind River Systems + * Copyright (c) 2000-2007, 2014, Ericsson AB + * Copyright (c) 2005-2008, 2010-2011, Wind River Systems   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without @@ -39,59 +39,44 @@  #include "bearer.h" +/* + * Constants and routines used to read and write TIPC payload message headers + * + * Note: Some items are also used with TIPC internal message headers + */  #define TIPC_VERSION              2  /* - *		TIPC user data message header format, version 2: - * - * - *     1 0 9 8 7 6 5 4|3 2 1 0 9 8 7 6|5 4 3 2 1 0 9 8|7 6 5 4 3 2 1 0 - *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * w0:|vers | user  |hdr sz |n|d|s|-|          message size           | - *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * w1:|mstyp| error |rer cnt|lsc|opt p|      broadcast ack no         | - *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * w2:|        link level ack no      |   broadcast/link level seq no | - *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * w3:|                       previous node                           | - *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * w4:|                      originating port                         | - *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * w5:|                      destination port                         | - *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * w6:|                      originating node                         | - *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * w7:|                      destination node                         | - *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * w8:|            name type / transport sequence number              | - *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * w9:|              name instance/multicast lower bound              | - *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * wA:|                    multicast upper bound                      | - *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - *    /                                                               / - *    \                           options                             \ - *    /                                                               / - *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * + * Payload message users are defined in TIPC's public API: + * - TIPC_LOW_IMPORTANCE + * - TIPC_MEDIUM_IMPORTANCE + * - TIPC_HIGH_IMPORTANCE + * - TIPC_CRITICAL_IMPORTANCE   */ +/* + * Payload message types + */  #define TIPC_CONN_MSG		0  #define TIPC_MCAST_MSG		1  #define TIPC_NAMED_MSG		2  #define TIPC_DIRECT_MSG		3 - -#define SHORT_H_SIZE              24	/* Connected, in-cluster messages */ -#define DIR_MSG_H_SIZE            32	/* Directly addressed messages */ -#define LONG_H_SIZE               40	/* Named messages */ -#define MCAST_H_SIZE              44	/* Multicast messages */ +/* + * Message header sizes + */ +#define SHORT_H_SIZE              24	/* In-cluster basic payload message */ +#define BASIC_H_SIZE              32	/* Basic payload message */ +#define NAMED_H_SIZE              40	/* Named payload message */ +#define MCAST_H_SIZE              44	/* Multicast payload message */  #define INT_H_SIZE                40	/* Internal messages */  #define MIN_H_SIZE                24	/* Smallest legal TIPC header size */  #define MAX_H_SIZE                60	/* Largest possible TIPC header size */  #define MAX_MSG_SIZE (MAX_H_SIZE + TIPC_MAX_USER_MSG_SIZE) +#define TIPC_MEDIA_ADDR_OFFSET	5 +  struct tipc_msg {  	__be32 hdr[15]; @@ -133,7 +118,6 @@ static inline void msg_swap_words(struct tipc_msg *msg, u32 a, u32 b)  /*   * Word 0   */ -  static inline u32 msg_version(struct tipc_msg *m)  {  	return msg_bits(m, 0, 29, 7); @@ -174,7 +158,7 @@ static inline u32 msg_hdr_sz(struct tipc_msg *m)  	return msg_bits(m, 0, 21, 0xf) << 2;  } -static inline void msg_set_hdr_sz(struct tipc_msg *m,u32 n) +static inline void msg_set_hdr_sz(struct tipc_msg *m, u32 n)  {  	msg_set_bits(m, 0, 21, 0xf, n>>2);  } @@ -228,7 +212,6 @@ static inline void msg_set_size(struct tipc_msg *m, u32 sz)  /*   * Word 1   */ -  static inline u32 msg_type(struct tipc_msg *m)  {  	return msg_bits(m, 1, 29, 0x7); @@ -303,7 +286,6 @@ static inline void msg_set_bcast_ack(struct tipc_msg *m, u32 n)  /*   * Word 2   */ -  static inline u32 msg_ack(struct tipc_msg *m)  {  	return msg_bits(m, 2, 16, 0xffff); @@ -325,30 +307,8 @@ static inline void msg_set_seqno(struct tipc_msg *m, u32 n)  }  /* - * TIPC may utilize the "link ack #" and "link seq #" fields of a short - * message header to hold the destination node for the message, since the - * normal "dest node" field isn't present.  This cache is only referenced - * when required, so populating the cache of a longer message header is - * harmless (as long as the header has the two link sequence fields present). - * - * Note: Host byte order is OK here, since the info never goes off-card. - */ - -static inline u32 msg_destnode_cache(struct tipc_msg *m) -{ -	return m->hdr[2]; -} - -static inline void msg_set_destnode_cache(struct tipc_msg *m, u32 dnode) -{ -	m->hdr[2] = dnode; -} - -/*   * Words 3-10   */ - -  static inline u32 msg_prevnode(struct tipc_msg *m)  {  	return msg_word(m, 3); @@ -391,7 +351,7 @@ static inline void msg_set_mc_netid(struct tipc_msg *m, u32 p)  static inline int msg_short(struct tipc_msg *m)  { -	return msg_hdr_sz(m) == 24; +	return msg_hdr_sz(m) == SHORT_H_SIZE;  }  static inline u32 msg_orignode(struct tipc_msg *m) @@ -416,18 +376,6 @@ static inline void msg_set_destnode(struct tipc_msg *m, u32 a)  	msg_set_word(m, 7, a);  } -static inline int msg_is_dest(struct tipc_msg *m, u32 d) -{ -	return msg_short(m) || (msg_destnode(m) == d); -} - -static inline u32 msg_routed(struct tipc_msg *m) -{ -	if (likely(msg_short(m))) -		return 0; -	return(msg_destnode(m) ^ msg_orignode(m)) >> 11; -} -  static inline u32 msg_nametype(struct tipc_msg *m)  {  	return msg_word(m, 8); @@ -438,26 +386,6 @@ static inline void msg_set_nametype(struct tipc_msg *m, u32 n)  	msg_set_word(m, 8, n);  } -static inline u32 msg_transp_seqno(struct tipc_msg *m) -{ -	return msg_word(m, 8); -} - -static inline void msg_set_timestamp(struct tipc_msg *m, u32 n) -{ -	msg_set_word(m, 8, n); -} - -static inline u32 msg_timestamp(struct tipc_msg *m) -{ -	return msg_word(m, 8); -} - -static inline void msg_set_transp_seqno(struct tipc_msg *m, u32 n) -{ -	msg_set_word(m, 8, n); -} -  static inline u32 msg_nameinst(struct tipc_msg *m)  {  	return msg_word(m, 9); @@ -498,75 +426,66 @@ static inline struct tipc_msg *msg_get_wrapped(struct tipc_msg *m)  	return (struct tipc_msg *)msg_data(m);  } -  /* -		TIPC internal message header format, version 2 - -       1 0 9 8 7 6 5 4|3 2 1 0 9 8 7 6|5 4 3 2 1 0 9 8|7 6 5 4 3 2 1 0 -      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -   w0:|vers |msg usr|hdr sz |n|resrv|            packet size          | -      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -   w1:|m typ|      sequence gap       |       broadcast ack no        | -      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -   w2:| link level ack no/bc_gap_from |     seq no / bcast_gap_to     | -      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -   w3:|                       previous node                           | -      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -   w4:|  next sent broadcast/fragm no | next sent pkt/ fragm msg no   | -      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -   w5:|          session no           |rsv=0|r|berid|link prio|netpl|p| -      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -   w6:|                      originating node                         | -      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -   w7:|                      destination node                         | -      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -   w8:|                   transport sequence number                   | -      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -   w9:|   msg count / bcast tag       |       link tolerance          | -      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -      \                                                               \ -      /                     User Specific Data                        / -      \                                                               \ -      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - -      NB: CONN_MANAGER use data message format. LINK_CONFIG has own format. -*/ + * Constants and routines used to read and write TIPC internal message headers + */  /* - * Internal users + * Internal message users   */ -  #define  BCAST_PROTOCOL       5  #define  MSG_BUNDLER          6  #define  LINK_PROTOCOL        7  #define  CONN_MANAGER         8 -#define  ROUTE_DISTRIBUTOR    9 +#define  ROUTE_DISTRIBUTOR    9		/* obsoleted */  #define  CHANGEOVER_PROTOCOL  10  #define  NAME_DISTRIBUTOR     11  #define  MSG_FRAGMENTER       12  #define  LINK_CONFIG          13 -#define  DSC_H_SIZE           40  /* - *  Connection management protocol messages + *  Connection management protocol message types   */ -  #define CONN_PROBE        0  #define CONN_PROBE_REPLY  1  #define CONN_ACK          2  /* - * Name distributor messages + * Name distributor message types   */ -  #define PUBLICATION       0  #define WITHDRAWAL        1 +/* + * Segmentation message types + */ +#define FIRST_FRAGMENT		0 +#define FRAGMENT		1 +#define LAST_FRAGMENT		2 + +/* + * Link management protocol message types + */ +#define STATE_MSG		0 +#define RESET_MSG		1 +#define ACTIVATE_MSG		2  /* - * Word 1 + * Changeover tunnel message types   */ +#define DUPLICATE_MSG		0 +#define ORIGINAL_MSG		1 +/* + * Config protocol message types + */ +#define DSC_REQ_MSG		0 +#define DSC_RESP_MSG		1 + + +/* + * Word 1 + */  static inline u32 msg_seq_gap(struct tipc_msg *m)  {  	return msg_bits(m, 1, 16, 0x1fff); @@ -577,21 +496,20 @@ static inline void msg_set_seq_gap(struct tipc_msg *m, u32 n)  	msg_set_bits(m, 1, 16, 0x1fff, n);  } -static inline u32 msg_req_links(struct tipc_msg *m) +static inline u32 msg_node_sig(struct tipc_msg *m)  { -	return msg_bits(m, 1, 16, 0xfff); +	return msg_bits(m, 1, 0, 0xffff);  } -static inline void msg_set_req_links(struct tipc_msg *m, u32 n) +static inline void msg_set_node_sig(struct tipc_msg *m, u32 n)  { -	msg_set_bits(m, 1, 16, 0xfff, n); +	msg_set_bits(m, 1, 0, 0xffff, n);  }  /*   * Word 2   */ -  static inline u32 msg_dest_domain(struct tipc_msg *m)  {  	return msg_word(m, 2); @@ -626,7 +544,6 @@ static inline void msg_set_bcgap_to(struct tipc_msg *m, u32 n)  /*   * Word 4   */ -  static inline u32 msg_last_bcast(struct tipc_msg *m)  {  	return msg_bits(m, 4, 16, 0xffff); @@ -637,12 +554,6 @@ static inline void msg_set_last_bcast(struct tipc_msg *m, u32 n)  	msg_set_bits(m, 4, 16, 0xffff, n);  } - -static inline u32 msg_fragm_no(struct tipc_msg *m) -{ -	return msg_bits(m, 4, 16, 0xffff); -} -  static inline void msg_set_fragm_no(struct tipc_msg *m, u32 n)  {  	msg_set_bits(m, 4, 16, 0xffff, n); @@ -659,12 +570,6 @@ static inline void msg_set_next_sent(struct tipc_msg *m, u32 n)  	msg_set_bits(m, 4, 0, 0xffff, n);  } - -static inline u32 msg_long_msgno(struct tipc_msg *m) -{ -	return msg_bits(m, 4, 0, 0xffff); -} -  static inline void msg_set_long_msgno(struct tipc_msg *m, u32 n)  {  	msg_set_bits(m, 4, 0, 0xffff, n); @@ -687,13 +592,12 @@ static inline u32 msg_link_selector(struct tipc_msg *m)  static inline void msg_set_link_selector(struct tipc_msg *m, u32 n)  { -	msg_set_bits(m, 4, 0, 1, (n & 1)); +	msg_set_bits(m, 4, 0, 1, n);  }  /*   * Word 5   */ -  static inline u32 msg_session(struct tipc_msg *m)  {  	return msg_bits(m, 5, 16, 0xffff); @@ -711,7 +615,7 @@ static inline u32 msg_probe(struct tipc_msg *m)  static inline void msg_set_probe(struct tipc_msg *m, u32 val)  { -	msg_set_bits(m, 5, 0, 1, (val & 1)); +	msg_set_bits(m, 5, 0, 1, val);  }  static inline char msg_net_plane(struct tipc_msg *m) @@ -749,21 +653,19 @@ static inline u32 msg_redundant_link(struct tipc_msg *m)  	return msg_bits(m, 5, 12, 0x1);  } -static inline void msg_set_redundant_link(struct tipc_msg *m) +static inline void msg_set_redundant_link(struct tipc_msg *m, u32 r)  { -	msg_set_bits(m, 5, 12, 0x1, 1); +	msg_set_bits(m, 5, 12, 0x1, r);  } -static inline void msg_clear_redundant_link(struct tipc_msg *m) +static inline char *msg_media_addr(struct tipc_msg *m)  { -	msg_set_bits(m, 5, 12, 0x1, 0); +	return (char *)&m->hdr[TIPC_MEDIA_ADDR_OFFSET];  } -  /*   * Word 9   */ -  static inline u32 msg_msgcnt(struct tipc_msg *m)  {  	return msg_bits(m, 9, 16, 0xffff); @@ -804,80 +706,12 @@ static inline void msg_set_link_tolerance(struct tipc_msg *m, u32 n)  	msg_set_bits(m, 9, 0, 0xffff, n);  } -/* - * Routing table message data - */ - - -static inline u32 msg_remote_node(struct tipc_msg *m) -{ -	return msg_word(m, msg_hdr_sz(m)/4); -} - -static inline void msg_set_remote_node(struct tipc_msg *m, u32 a) -{ -	msg_set_word(m, msg_hdr_sz(m)/4, a); -} - -static inline void msg_set_dataoctet(struct tipc_msg *m, u32 pos) -{ -	msg_data(m)[pos + 4] = 1; -} - -/* - * Segmentation message types - */ - -#define FIRST_FRAGMENT     0 -#define FRAGMENT           1 -#define LAST_FRAGMENT      2 - -/* - * Link management protocol message types - */ - -#define STATE_MSG       0 -#define RESET_MSG       1 -#define ACTIVATE_MSG    2 - -/* - * Changeover tunnel message types - */ -#define DUPLICATE_MSG    0 -#define ORIGINAL_MSG     1 - -/* - * Routing table message types - */ -#define EXT_ROUTING_TABLE    0 -#define LOCAL_ROUTING_TABLE  1 -#define SLAVE_ROUTING_TABLE  2 -#define ROUTE_ADDITION       3 -#define ROUTE_REMOVAL        4 - -/* - * Config protocol message types - */ - -#define DSC_REQ_MSG          0 -#define DSC_RESP_MSG         1 -  u32 tipc_msg_tot_importance(struct tipc_msg *m); -void tipc_msg_init(struct tipc_msg *m, u32 user, u32 type, -			    u32 hsize, u32 destnode); -int tipc_msg_calc_data_size(struct iovec const *msg_sect, u32 num_sect); -int tipc_msg_build(struct tipc_msg *hdr, -			    struct iovec const *msg_sect, u32 num_sect, -			    int max_size, int usrmem, struct sk_buff** buf); - -static inline void msg_set_media_addr(struct tipc_msg *m, struct tipc_media_addr *a) -{ -	memcpy(&((int *)m)[5], a, sizeof(*a)); -} +void tipc_msg_init(struct tipc_msg *m, u32 user, u32 type, u32 hsize, +		   u32 destnode); +int tipc_msg_build(struct tipc_msg *hdr, struct iovec const *msg_sect, +		   unsigned int len, int max_size, struct sk_buff **buf); -static inline void msg_get_media_addr(struct tipc_msg *m, struct tipc_media_addr *a) -{ -	memcpy(a, &((int*)m)[5], sizeof(*a)); -} +int tipc_buf_append(struct sk_buff **headbuf, struct sk_buff **buf);  #endif  | 
