diff options
Diffstat (limited to 'net/tipc/msg.h')
| -rw-r--r-- | net/tipc/msg.h | 288 | 
1 files changed, 175 insertions, 113 deletions
| diff --git a/net/tipc/msg.h b/net/tipc/msg.h index 7ee6ae23814..92c4c4fd7b3 100644 --- a/net/tipc/msg.h +++ b/net/tipc/msg.h @@ -37,10 +37,51 @@  #ifndef _TIPC_MSG_H  #define _TIPC_MSG_H -#include "core.h" +#include "bearer.h"  #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                             \ + *    /                                                               / + *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + */ + +#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 */ @@ -52,20 +93,26 @@  #define MAX_MSG_SIZE (MAX_H_SIZE + TIPC_MAX_USER_MSG_SIZE) -/* -		TIPC user data message header format, version 2 +struct tipc_msg { +	__be32 hdr[15]; +}; -	- Fundamental definitions available to privileged TIPC users -	  are located in tipc_msg.h. -	- Remaining definitions available to TIPC internal users appear below. -*/ +static inline u32 msg_word(struct tipc_msg *m, u32 pos) +{ +	return ntohl(m->hdr[pos]); +}  static inline void msg_set_word(struct tipc_msg *m, u32 w, u32 val)  {  	m->hdr[w] = htonl(val);  } +static inline u32 msg_bits(struct tipc_msg *m, u32 w, u32 pos, u32 mask) +{ +	return (msg_word(m, w) >> pos) & mask; +} +  static inline void msg_set_bits(struct tipc_msg *m, u32 w,  				u32 pos, u32 mask, u32 val)  { @@ -104,7 +151,7 @@ static inline u32 msg_user(struct tipc_msg *m)  static inline u32 msg_isdata(struct tipc_msg *m)  { -	return (msg_user(m) <= TIPC_CRITICAL_IMPORTANCE); +	return msg_user(m) <= TIPC_CRITICAL_IMPORTANCE;  }  static inline void msg_set_user(struct tipc_msg *m, u32 n) @@ -112,16 +159,36 @@ static inline void msg_set_user(struct tipc_msg *m, u32 n)  	msg_set_bits(m, 0, 25, 0xf, n);  } +static inline u32 msg_importance(struct tipc_msg *m) +{ +	return msg_bits(m, 0, 25, 0xf); +} +  static inline void msg_set_importance(struct tipc_msg *m, u32 i)  {  	msg_set_user(m, i);  } -static inline void msg_set_hdr_sz(struct tipc_msg *m,u32 n) +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)  {  	msg_set_bits(m, 0, 21, 0xf, n>>2);  } +static inline u32 msg_size(struct tipc_msg *m) +{ +	return msg_bits(m, 0, 0, 0x1ffff); +} + +static inline u32 msg_data_sz(struct tipc_msg *m) +{ +	return msg_size(m) - msg_hdr_sz(m); +} +  static inline int msg_non_seq(struct tipc_msg *m)  {  	return msg_bits(m, 0, 20, 1); @@ -162,11 +229,36 @@ 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); +} +  static inline void msg_set_type(struct tipc_msg *m, u32 n)  {  	msg_set_bits(m, 1, 29, 0x7, n);  } +static inline u32 msg_named(struct tipc_msg *m) +{ +	return msg_type(m) == TIPC_NAMED_MSG; +} + +static inline u32 msg_mcast(struct tipc_msg *m) +{ +	return msg_type(m) == TIPC_MCAST_MSG; +} + +static inline u32 msg_connected(struct tipc_msg *m) +{ +	return msg_type(m) == TIPC_CONN_MSG; +} + +static inline u32 msg_errcode(struct tipc_msg *m) +{ +	return msg_bits(m, 1, 25, 0xf); +} +  static inline void msg_set_errcode(struct tipc_msg *m, u32 err)  {  	msg_set_bits(m, 1, 25, 0xf, err); @@ -257,31 +349,68 @@ static inline void msg_set_destnode_cache(struct tipc_msg *m, u32 dnode)   */ +static inline u32 msg_prevnode(struct tipc_msg *m) +{ +	return msg_word(m, 3); +} +  static inline void msg_set_prevnode(struct tipc_msg *m, u32 a)  {  	msg_set_word(m, 3, a);  } +static inline u32 msg_origport(struct tipc_msg *m) +{ +	return msg_word(m, 4); +} +  static inline void msg_set_origport(struct tipc_msg *m, u32 p)  {  	msg_set_word(m, 4, p);  } +static inline u32 msg_destport(struct tipc_msg *m) +{ +	return msg_word(m, 5); +} +  static inline void msg_set_destport(struct tipc_msg *m, u32 p)  {  	msg_set_word(m, 5, p);  } +static inline u32 msg_mc_netid(struct tipc_msg *m) +{ +	return msg_word(m, 5); +} +  static inline void msg_set_mc_netid(struct tipc_msg *m, u32 p)  {  	msg_set_word(m, 5, p);  } +static inline int msg_short(struct tipc_msg *m) +{ +	return msg_hdr_sz(m) == 24; +} + +static inline u32 msg_orignode(struct tipc_msg *m) +{ +	if (likely(msg_short(m))) +		return msg_prevnode(m); +	return msg_word(m, 6); +} +  static inline void msg_set_orignode(struct tipc_msg *m, u32 a)  {  	msg_set_word(m, 6, a);  } +static inline u32 msg_destnode(struct tipc_msg *m) +{ +	return msg_word(m, 7); +} +  static inline void msg_set_destnode(struct tipc_msg *m, u32 a)  {  	msg_set_word(m, 7, a); @@ -289,14 +418,19 @@ static inline void msg_set_destnode(struct tipc_msg *m, u32 a)  static inline int msg_is_dest(struct tipc_msg *m, u32 d)  { -	return(msg_short(m) || (msg_destnode(m) == 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; +	return (msg_destnode(m) ^ msg_orignode(m)) >> 11; +} + +static inline u32 msg_nametype(struct tipc_msg *m) +{ +	return msg_word(m, 8);  }  static inline void msg_set_nametype(struct tipc_msg *m, u32 n) @@ -324,6 +458,16 @@ 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); +} + +static inline u32 msg_namelower(struct tipc_msg *m) +{ +	return msg_nameinst(m); +} +  static inline void msg_set_namelower(struct tipc_msg *m, u32 n)  {  	msg_set_word(m, 9, n); @@ -334,11 +478,21 @@ static inline void msg_set_nameinst(struct tipc_msg *m, u32 n)  	msg_set_namelower(m, n);  } +static inline u32 msg_nameupper(struct tipc_msg *m) +{ +	return msg_word(m, 10); +} +  static inline void msg_set_nameupper(struct tipc_msg *m, u32 n)  {  	msg_set_word(m, 10, n);  } +static inline unchar *msg_data(struct tipc_msg *m) +{ +	return ((unchar *)m) + msg_hdr_sz(m); +} +  static inline struct tipc_msg *msg_get_wrapped(struct tipc_msg *m)  {  	return (struct tipc_msg *)msg_data(m); @@ -386,7 +540,7 @@ static inline struct tipc_msg *msg_get_wrapped(struct tipc_msg *m)  #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 @@ -632,7 +786,7 @@ static inline void msg_set_bcast_tag(struct tipc_msg *m, u32 n)  static inline u32 msg_max_pkt(struct tipc_msg *m)  { -	return (msg_bits(m, 9, 16, 0xffff) * 4); +	return msg_bits(m, 9, 16, 0xffff) * 4;  }  static inline void msg_set_max_pkt(struct tipc_msg *m, u32 n) @@ -665,11 +819,6 @@ 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   */ @@ -696,7 +845,7 @@ static inline void msg_set_dataoctet(struct tipc_msg *m, u32 pos)   * Routing table message types   */  #define EXT_ROUTING_TABLE    0 -#define LOCAL_ROUTING_TABLE  1 +#define LOCAL_ROUTING_TABLE  1		/* obsoleted */  #define SLAVE_ROUTING_TABLE  2  #define ROUTE_ADDITION       3  #define ROUTE_REMOVAL        4 @@ -708,100 +857,13 @@ static inline void msg_set_dataoctet(struct tipc_msg *m, u32 pos)  #define DSC_REQ_MSG          0  #define DSC_RESP_MSG         1 -static inline u32 msg_tot_importance(struct tipc_msg *m) -{ -	if (likely(msg_isdata(m))) { -		if (likely(msg_orignode(m) == tipc_own_addr)) -			return msg_importance(m); -		return msg_importance(m) + 4; -	} -	if ((msg_user(m) == MSG_FRAGMENTER)  && -	    (msg_type(m) == FIRST_FRAGMENT)) -		return msg_importance(msg_get_wrapped(m)); -	return msg_importance(m); -} - - -static inline void msg_init(struct tipc_msg *m, u32 user, u32 type, -			    u32 hsize, u32 destnode) -{ -	memset(m, 0, hsize); -	msg_set_version(m); -	msg_set_user(m, user); -	msg_set_hdr_sz(m, hsize); -	msg_set_size(m, hsize); -	msg_set_prevnode(m, tipc_own_addr); -	msg_set_type(m, type); -	if (!msg_short(m)) { -		msg_set_orignode(m, tipc_own_addr); -		msg_set_destnode(m, destnode); -	} -} - -/** - * msg_calc_data_size - determine total data size for message - */ - -static inline int msg_calc_data_size(struct iovec const *msg_sect, u32 num_sect) -{ -	int dsz = 0; -	int i; - -	for (i = 0; i < num_sect; i++) -		dsz += msg_sect[i].iov_len; -	return dsz; -} - -/** - * msg_build - create message using specified header and data - * - * Note: Caller must not hold any locks in case copy_from_user() is interrupted! - * - * Returns message data size or errno - */ - -static inline int msg_build(struct tipc_msg *hdr, +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) -{ -	int dsz, sz, hsz, pos, res, cnt; - -	dsz = msg_calc_data_size(msg_sect, num_sect); -	if (unlikely(dsz > TIPC_MAX_USER_MSG_SIZE)) { -		*buf = NULL; -		return -EINVAL; -	} - -	pos = hsz = msg_hdr_sz(hdr); -	sz = hsz + dsz; -	msg_set_size(hdr, sz); -	if (unlikely(sz > max_size)) { -		*buf = NULL; -		return dsz; -	} - -	*buf = buf_acquire(sz); -	if (!(*buf)) -		return -ENOMEM; -	skb_copy_to_linear_data(*buf, hdr, hsz); -	for (res = 1, cnt = 0; res && (cnt < num_sect); cnt++) { -		if (likely(usrmem)) -			res = !copy_from_user((*buf)->data + pos, -					      msg_sect[cnt].iov_base, -					      msg_sect[cnt].iov_len); -		else -			skb_copy_to_linear_data_offset(*buf, pos, -						       msg_sect[cnt].iov_base, -						       msg_sect[cnt].iov_len); -		pos += msg_sect[cnt].iov_len; -	} -	if (likely(res)) -		return dsz; - -	buf_discard(*buf); -	*buf = NULL; -	return -EFAULT; -} +			    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)  { @@ -810,7 +872,7 @@ static inline void msg_set_media_addr(struct tipc_msg *m, struct tipc_media_addr  static inline void msg_get_media_addr(struct tipc_msg *m, struct tipc_media_addr *a)  { -	memcpy(a, &((int*)m)[5], sizeof(*a)); +	memcpy(a, &((int *)m)[5], sizeof(*a));  }  #endif | 
