⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sctp.h

📁 优龙2410linux2.6.8内核源代码
💻 H
📖 第 1 页 / 共 2 页
字号:
#define sctp_crypto_free_tfm crypto_free_tfm#define sctp_crypto_hmac crypto_hmac#else#define sctp_crypto_alloc_tfm(x...) NULL#define sctp_crypto_free_tfm(x...)#define sctp_crypto_hmac(x...)#endif/* Map an association to an assoc_id. */static inline sctp_assoc_t sctp_assoc2id(const struct sctp_association *asoc){	return (asoc?asoc->assoc_id:NULL);}/* Look up the association by its id.  */struct sctp_association *sctp_id2assoc(struct sock *sk, sctp_assoc_t id);/* A macro to walk a list of skbs.  */#define sctp_skb_for_each(pos, head, tmp) \for (pos = (head)->next;\     tmp = (pos)->next, pos != ((struct sk_buff *)(head));\     pos = tmp)/* A helper to append an entire skb list (list) to another (head). */static inline void sctp_skb_list_tail(struct sk_buff_head *list,				      struct sk_buff_head *head){	unsigned long flags;	sctp_spin_lock_irqsave(&head->lock, flags);	sctp_spin_lock(&list->lock);	list_splice((struct list_head *)list, (struct list_head *)head->prev);	head->qlen += list->qlen;	list->qlen = 0;	sctp_spin_unlock(&list->lock);	sctp_spin_unlock_irqrestore(&head->lock, flags);}/** *	sctp_list_dequeue - remove from the head of the queue *	@list: list to dequeue from * *	Remove the head of the list. The head item is *	returned or %NULL if the list is empty. */static inline struct list_head *sctp_list_dequeue(struct list_head *list){	struct list_head *result = NULL;	if (list->next != list) {		result = list->next;		list->next = result->next;		list->next->prev = list;		INIT_LIST_HEAD(result);	}	return result;}/* Tests if the list has one and only one entry. */static inline int sctp_list_single_entry(struct list_head *head){	return ((head->next != head) && (head->next == head->prev));}/* Calculate the size (in bytes) occupied by the data of an iovec.  */static inline size_t get_user_iov_size(struct iovec *iov, int iovlen){	size_t retval = 0;	for (; iovlen > 0; --iovlen) {		retval += iov->iov_len;		iov++;	}	return retval;}/* Generate a random jitter in the range of -50% ~ +50% of input RTO. */static inline __s32 sctp_jitter(__u32 rto){	static __u32 sctp_rand;	__s32 ret;	/* Avoid divide by zero. */	if (!rto)		rto = 1;	sctp_rand += jiffies;	sctp_rand ^= (sctp_rand << 12);	sctp_rand ^= (sctp_rand >> 20);	/* Choose random number from 0 to rto, then move to -50% ~ +50%	 * of rto.	 */	ret = sctp_rand % rto - (rto >> 1);	return ret;}/* Break down data chunks at this point.  */static inline int sctp_frag_point(const struct sctp_opt *sp, int pmtu){	int frag = pmtu;	frag -= sp->pf->af->net_header_len;	frag -= sizeof(struct sctphdr) + sizeof(struct sctp_data_chunk);	if (sp->user_frag)		frag = min_t(int, frag, sp->user_frag);	frag = min_t(int, frag, SCTP_MAX_CHUNK_LEN);	return frag;}/* Walk through a list of TLV parameters.  Don't trust the * individual parameter lengths and instead depend on * the chunk length to indicate when to stop.  Make sure * there is room for a param header too. */#define sctp_walk_params(pos, chunk, member)\_sctp_walk_params((pos), (chunk), WORD_ROUND(ntohs((chunk)->chunk_hdr.length)), member)#define _sctp_walk_params(pos, chunk, end, member)\for (pos.v = chunk->member;\     pos.v <= (void *)chunk + end - sizeof(sctp_paramhdr_t) &&\     pos.v <= (void *)chunk + end - WORD_ROUND(ntohs(pos.p->length)); \     pos.v += WORD_ROUND(ntohs(pos.p->length)))#define sctp_walk_errors(err, chunk_hdr)\_sctp_walk_errors((err), (chunk_hdr), ntohs((chunk_hdr)->length))#define _sctp_walk_errors(err, chunk_hdr, end)\for (err = (sctp_errhdr_t *)((void *)chunk_hdr + \	    sizeof(sctp_chunkhdr_t));\     (void *)err <= (void *)chunk_hdr + end - sizeof(sctp_errhdr_t) &&\     (void *)err <= (void *)chunk_hdr + end - \		    WORD_ROUND(ntohs(err->length));\     err = (sctp_errhdr_t *)((void *)err + \	    WORD_ROUND(ntohs(err->length))))#define sctp_walk_fwdtsn(pos, chunk)\_sctp_walk_fwdtsn((pos), (chunk), ntohs((chunk)->chunk_hdr->length) - sizeof(struct sctp_fwdtsn_chunk))#define _sctp_walk_fwdtsn(pos, chunk, end)\for (pos = chunk->subh.fwdtsn_hdr->skip;\     (void *)pos <= (void *)chunk->subh.fwdtsn_hdr->skip + end - sizeof(struct sctp_fwdtsn_skip);\     pos++)/* Round an int up to the next multiple of 4.  */#define WORD_ROUND(s) (((s)+3)&~3)/* Make a new instance of type.  */#define t_new(type, flags)	(type *)kmalloc(sizeof(type), flags)/* Compare two timevals.  */#define tv_lt(s, t) \   (s.tv_sec < t.tv_sec || (s.tv_sec == t.tv_sec && s.tv_usec < t.tv_usec))/* Add tv1 to tv2. */#define TIMEVAL_ADD(tv1, tv2) \({ \        suseconds_t usecs = (tv2).tv_usec + (tv1).tv_usec; \        time_t secs = (tv2).tv_sec + (tv1).tv_sec; \\        if (usecs >= 1000000) { \                usecs -= 1000000; \                secs++; \        } \        (tv2).tv_sec = secs; \        (tv2).tv_usec = usecs; \})/* External references. */extern struct proto sctp_prot;extern struct proc_dir_entry *proc_net_sctp;void sctp_put_port(struct sock *sk);extern struct idr sctp_assocs_id;extern spinlock_t sctp_assocs_id_lock;/* Static inline functions. *//* Convert from an IP version number to an Address Family symbol.  */static inline int ipver2af(__u8 ipver){	switch (ipver) {	case 4:	        return  AF_INET;	case 6:		return AF_INET6;	default:		return 0;	};}/* Convert from an address parameter type to an address family.  */static inline int param_type2af(__u16 type){	switch (type) {	case SCTP_PARAM_IPV4_ADDRESS:	        return  AF_INET;	case SCTP_PARAM_IPV6_ADDRESS:		return AF_INET6;	default:		return 0;	};}/* Perform some sanity checks. */static inline int sctp_sanity_check(void){	SCTP_ASSERT(sizeof(struct sctp_ulpevent) <=		    sizeof(((struct sk_buff *)0)->cb),		    "SCTP: ulpevent does not fit in skb!\n", return 0);	return 1;}/* Warning: The following hash functions assume a power of two 'size'. *//* This is the hash function for the SCTP port hash table. */static inline int sctp_phashfn(__u16 lport){	return (lport & (sctp_port_hashsize - 1));}/* This is the hash function for the endpoint hash table. */static inline int sctp_ep_hashfn(__u16 lport){	return (lport & (sctp_ep_hashsize - 1));}/* This is the hash function for the association hash table. */static inline int sctp_assoc_hashfn(__u16 lport, __u16 rport){	int h = (lport << 16) + rport;	h ^= h>>8;	return (h & (sctp_assoc_hashsize - 1));}/* This is the hash function for the association hash table.  This is * not used yet, but could be used as a better hash function when * we have a vtag. */static inline int sctp_vtag_hashfn(__u16 lport, __u16 rport, __u32 vtag){	int h = (lport << 16) + rport;	h ^= vtag;	return (h & (sctp_assoc_hashsize-1));}/* WARNING: Do not change the layout of the members in sctp_sock! */struct sctp_sock {	struct sock	  sk;#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)	struct ipv6_pinfo *pinet6;#endif /* CONFIG_IPV6 */	struct inet_opt	  inet;	struct sctp_opt	  sctp;};#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)struct sctp6_sock {	struct sock	  sk;	struct ipv6_pinfo *pinet6;	struct inet_opt	  inet;	struct sctp_opt	  sctp;	struct ipv6_pinfo inet6;};#endif /* CONFIG_IPV6 */#define sctp_sk(__sk) (&((struct sctp_sock *)__sk)->sctp)#define sctp_opt2sk(__sp) &container_of(__sp, struct sctp_sock, sctp)->sk/* Is a socket of this style? */#define sctp_style(sk, style) __sctp_style((sk), (SCTP_SOCKET_##style))int static inline __sctp_style(const struct sock *sk, sctp_socket_type_t style){	return sctp_sk(sk)->type == style;}/* Is the association in this state? */#define sctp_state(asoc, state) __sctp_state((asoc), (SCTP_STATE_##state))int static inline __sctp_state(const struct sctp_association *asoc,			       sctp_state_t state){	return asoc->state == state;}/* Is the socket in this state? */#define sctp_sstate(sk, state) __sctp_sstate((sk), (SCTP_SS_##state))int static inline __sctp_sstate(const struct sock *sk, sctp_sock_state_t state){	return sk->sk_state == state;}/* Map v4-mapped v6 address back to v4 address */static inline void sctp_v6_map_v4(union sctp_addr *addr){	addr->v4.sin_family = AF_INET;	addr->v4.sin_port = addr->v6.sin6_port;	addr->v4.sin_addr.s_addr = addr->v6.sin6_addr.s6_addr32[3];}/* Map v4 address to v4-mapped v6 address */static inline void sctp_v4_map_v6(union sctp_addr *addr){	addr->v6.sin6_family = AF_INET6;	addr->v6.sin6_port = addr->v4.sin_port;	addr->v6.sin6_addr.s6_addr32[3] = addr->v4.sin_addr.s_addr;	addr->v6.sin6_addr.s6_addr32[0] = 0;	addr->v6.sin6_addr.s6_addr32[1] = 0;	addr->v6.sin6_addr.s6_addr32[2] = htonl(0x0000ffff);}#endif /* __net_sctp_h__ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -