📄 sctp.h
字号:
#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 + -