📄 sock.h
字号:
int ip_ttl; /* TTL setting */ int ip_tos; /* TOS */ struct tcphdr dummy_th; struct timer_list keepalive_timer; /* TCP keepalive hack */ struct timer_list retransmit_timer; /* TCP retransmit timer */ struct timer_list delack_timer; /* TCP delayed ack timer */ int ip_xmit_timeout; /* Why the timeout is running */ struct rtable *ip_route_cache; /* Cached output route */ unsigned char ip_hdrincl; /* Include headers ? */#ifdef CONFIG_IP_MULTICAST int ip_mc_ttl; /* Multicasting TTL */ int ip_mc_loop; /* Loopback */ char ip_mc_name[MAX_ADDR_LEN];/* Multicast device name */ struct ip_mc_socklist *ip_mc_list; /* Group array */#endif /* * This part is used for the timeout functions (timer.c). */ int timeout; /* What are we waiting for? */ struct timer_list timer; /* This is the TIME_WAIT/receive timer * when we are doing IP */ struct timeval stamp; /* * Identd */ struct socket *socket; /* * Callbacks */ void (*state_change)(struct sock *sk); void (*data_ready)(struct sock *sk,int bytes); void (*write_space)(struct sock *sk); void (*error_report)(struct sock *sk); /* * Moved solely for 2.0 to keep binary module compatibility stuff straight. */ unsigned short max_ack_backlog; struct sock *listening;};/* * IP protocol blocks we attach to sockets. */ struct proto { /* These must be first. */ struct sock *sklist_next; struct sock *sklist_prev; void (*close)(struct sock *sk, unsigned long timeout); int (*build_header)(struct sk_buff *skb, __u32 saddr, __u32 daddr, struct device **dev, int type, struct options *opt, int len, int tos, int ttl, struct rtable ** rp); int (*connect)(struct sock *sk, struct sockaddr_in *usin, int addr_len); struct sock * (*accept) (struct sock *sk, int flags); void (*queue_xmit)(struct sock *sk, struct device *dev, struct sk_buff *skb, int free); void (*retransmit)(struct sock *sk, int all); void (*write_wakeup)(struct sock *sk); void (*read_wakeup)(struct sock *sk); int (*rcv)(struct sk_buff *buff, struct device *dev, struct options *opt, __u32 daddr, unsigned short len, __u32 saddr, int redo, struct inet_protocol *protocol); int (*select)(struct sock *sk, int which, select_table *wait); int (*ioctl)(struct sock *sk, int cmd, unsigned long arg); int (*init)(struct sock *sk); void (*shutdown)(struct sock *sk, int how); int (*setsockopt)(struct sock *sk, int level, int optname, char *optval, int optlen); int (*getsockopt)(struct sock *sk, int level, int optname, char *optval, int *option); int (*sendmsg)(struct sock *sk, struct msghdr *msg, int len, int noblock, int flags); int (*recvmsg)(struct sock *sk, struct msghdr *msg, int len, int noblock, int flags, int *addr_len); int (*bind)(struct sock *sk, struct sockaddr *uaddr, int addr_len); /* Keeping track of sk's, looking them up, and port selection methods. */ void (*hash)(struct sock *sk); void (*unhash)(struct sock *sk); void (*rehash)(struct sock *sk); unsigned short (*good_socknum)(void); int (*verify_bind)(struct sock *sk, unsigned short snum); unsigned short max_header; unsigned long retransmits; char name[32]; int inuse, highestinuse;};#define TIME_WRITE 1#define TIME_CLOSE 2#define TIME_KEEPOPEN 3#define TIME_DESTROY 4#define TIME_DONE 5 /* Used to absorb those last few packets */#define TIME_PROBE0 6/* * About 10 seconds */#define SOCK_DESTROY_TIME (10*HZ)/* * Sockets 0-1023 can't be bound to unless you are superuser */ #define PROT_SOCK 1024#define SHUTDOWN_MASK 3#define RCV_SHUTDOWN 1#define SEND_SHUTDOWN 2/* Per-protocol hash table implementations use this to make sure * nothing changes. */#define SOCKHASH_LOCK() start_bh_atomic()#define SOCKHASH_UNLOCK() end_bh_atomic()/* Some things in the kernel just want to get at a protocols * entire socket list commensurate, thus... */static __inline__ void add_to_prot_sklist(struct sock *sk){ SOCKHASH_LOCK(); if(!sk->sklist_next) { struct proto *p = sk->prot; sk->sklist_prev = (struct sock *) p; sk->sklist_next = p->sklist_next; p->sklist_next->sklist_prev = sk; p->sklist_next = sk; /* Charge the protocol. */ sk->prot->inuse += 1; if(sk->prot->highestinuse < sk->prot->inuse) sk->prot->highestinuse = sk->prot->inuse; } SOCKHASH_UNLOCK();}static __inline__ void del_from_prot_sklist(struct sock *sk){ SOCKHASH_LOCK(); if(sk->sklist_next) { sk->sklist_next->sklist_prev = sk->sklist_prev; sk->sklist_prev->sklist_next = sk->sklist_next; sk->sklist_next = NULL; sk->prot->inuse--; } SOCKHASH_UNLOCK();}/* * Used by processes to "lock" a socket state, so that * interrupts and bottom half handlers won't change it * from under us. It essentially blocks any incoming * packets, so that we won't get any new data or any * packets that change the state of the socket. * * Note the 'barrier()' calls: gcc may not move a lock * "downwards" or a unlock "upwards" when optimizing. */extern void __release_sock(struct sock *sk);static inline void lock_sock(struct sock *sk){#if 0/* debugging code: the test isn't even 100% correct, but it can catch bugs *//* Note that a double lock is ok in theory - it's just _usually_ a bug */ if (sk->users) { __label__ here; printk("double lock on socket at %p\n", &&here);here: }#endif sk->users++; barrier();}static inline void release_sock(struct sock *sk){ barrier();#if 0/* debugging code: remove me when ok */ if (sk->users == 0) { __label__ here; sk->users = 1; printk("trying to unlock unlocked socket at %p\n", &&here);here: }#endif if ((sk->users = sk->users-1) == 0) __release_sock(sk);}extern struct sock * sk_alloc(int priority);extern void sk_free(struct sock *sk);extern void destroy_sock(struct sock *sk);extern struct sk_buff *sock_wmalloc(struct sock *sk, unsigned long size, int force, int priority);extern struct sk_buff *sock_rmalloc(struct sock *sk, unsigned long size, int force, int priority);extern void sock_wfree(struct sock *sk, struct sk_buff *skb);extern void sock_rfree(struct sock *sk, struct sk_buff *skb);extern unsigned long sock_rspace(struct sock *sk);extern unsigned long sock_wspace(struct sock *sk);extern int sock_setsockopt(struct sock *sk, int level, int op, char *optval, int optlen);extern int sock_getsockopt(struct sock *sk, int level, int op, char *optval, int *optlen);extern struct sk_buff *sock_alloc_send_skb(struct sock *skb, unsigned long size, unsigned long fallback, int noblock, int *errcode);/* * Queue a received datagram if it will fit. Stream and sequenced * protocols can't normally use this as they need to fit buffers in * and play with them. * * Inlined as it's very short and called for pretty much every * packet ever received. */extern __inline__ int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb){ if (sk->rmem_alloc + skb->truesize >= sk->rcvbuf) return -ENOMEM; atomic_add(skb->truesize, &sk->rmem_alloc); skb->sk=sk; skb_queue_tail(&sk->receive_queue,skb); if (!sk->dead) sk->data_ready(sk,skb->len); return 0;}extern __inline__ int __sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb){ if (sk->rmem_alloc + skb->truesize >= sk->rcvbuf) return -ENOMEM; atomic_add(skb->truesize, &sk->rmem_alloc); skb->sk=sk; __skb_queue_tail(&sk->receive_queue,skb); if (!sk->dead) sk->data_ready(sk,skb->len); return 0;}/* * Recover an error report and clear atomically */ extern __inline__ int sock_error(struct sock *sk){ int err=xchg(&sk->err,0); return -err;}/* * Declarations from timer.c */ extern struct sock *timer_base;extern void delete_timer (struct sock *);extern void reset_timer (struct sock *, int, unsigned long);extern void net_timer (unsigned long);/* * Enable debug/info messages */#define NETDEBUG(x) do { } while (0)#endif /* _SOCK_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -