sock.h 17.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
/*
 * INET		An implementation of the TCP/IP protocol suite for the LINUX
 *		operating system.  INET is implemented using the  BSD Socket
 *		interface as the means of communication with the user level.
 *
 *		Definitions for the AF_INET socket handler.
 *
 * Version:	@(#)sock.h	1.0.4	05/13/93
 *
 * Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
 *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
 *		Corey Minyard <wf-rch!minyard@relay.EU.net>
13
 *		Florian La Roche <flla@stud.uni-sb.de>
14
 *
Linus Torvalds's avatar
Linus Torvalds committed
15 16 17 18 19 20 21 22 23
 * Fixes:
 *		Alan Cox	:	Volatiles in skbuff pointers. See
 *					skbuff comments. May be overdone,
 *					better to prove they can be removed
 *					than the reverse.
 *		Alan Cox	:	Added a zapped field for tcp to note
 *					a socket is reset and must stay shut up
 *		Alan Cox	:	New fields for options
 *	Pauline Middelink	:	identd support
Linus Torvalds's avatar
Linus Torvalds committed
24
 *		Alan Cox	:	Eliminate low level recv/recvfrom
Linus Torvalds's avatar
Linus Torvalds committed
25
 *
26 27 28 29 30 31 32 33
 *		This program is free software; you can redistribute it and/or
 *		modify it under the terms of the GNU General Public License
 *		as published by the Free Software Foundation; either version
 *		2 of the License, or (at your option) any later version.
 */
#ifndef _SOCK_H
#define _SOCK_H

Linus Torvalds's avatar
Linus Torvalds committed
34
#include <linux/config.h>
35
#include <linux/timer.h>
36
#include <linux/ip.h>		/* struct options */
Linus Torvalds's avatar
Linus Torvalds committed
37
#include <linux/in.h>		/* struct sockaddr_in */
Linus Torvalds's avatar
Linus Torvalds committed
38 39 40 41 42 43 44 45

#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
#include <linux/in6.h>		/* struct sockaddr_in6 */
#include <linux/ipv6.h>		/* dest_cache, inet6_options */
#include <linux/icmpv6.h>
#include <net/if_inet6.h>	/* struct ipv6_mc_socklist */
#endif

46
#include <linux/tcp.h>		/* struct tcphdr */
Linus Torvalds's avatar
Linus Torvalds committed
47
#include <linux/config.h>
48

Linus Torvalds's avatar
Linus Torvalds committed
49
#include <linux/netdevice.h>
Linus Torvalds's avatar
Linus Torvalds committed
50
#include <linux/skbuff.h>	/* struct sk_buff */
Linus Torvalds's avatar
Linus Torvalds committed
51
#include <net/protocol.h>		/* struct inet_protocol */
Linus Torvalds's avatar
Linus Torvalds committed
52
#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
Linus Torvalds's avatar
Linus Torvalds committed
53
#include <net/ax25.h>
Linus Torvalds's avatar
Linus Torvalds committed
54
#if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE)
Linus Torvalds's avatar
Linus Torvalds committed
55
#include <net/netrom.h>
Linus Torvalds's avatar
Linus Torvalds committed
56
#endif
Linus Torvalds's avatar
Linus Torvalds committed
57 58 59
#if defined(CONFIG_ROSE) || defined(CONFIG_ROSE_MODULE)
#include <net/rose.h>
#endif
Linus Torvalds's avatar
Linus Torvalds committed
60
#endif
Linus Torvalds's avatar
Linus Torvalds committed
61 62

#if defined(CONFIG_IPX) || defined(CONFIG_IPX_MODULE)
Linus Torvalds's avatar
Linus Torvalds committed
63
#include <net/ipx.h>
Linus Torvalds's avatar
Linus Torvalds committed
64
#endif
Linus Torvalds's avatar
Linus Torvalds committed
65 66

#if defined(CONFIG_ATALK) || defined(CONFIG_ATALK_MODULE)
Linus Torvalds's avatar
Linus Torvalds committed
67
#include <linux/atalk.h>
Linus Torvalds's avatar
Linus Torvalds committed
68
#endif
69

Linus Torvalds's avatar
Linus Torvalds committed
70
#include <linux/igmp.h>
Linus Torvalds's avatar
Linus Torvalds committed
71

Linus Torvalds's avatar
Linus Torvalds committed
72 73
#include <asm/atomic.h>

Linus Torvalds's avatar
Linus Torvalds committed
74 75
/* Think big (also on some systems a byte is faster) */
#define SOCK_ARRAY_SIZE	256
76 77


Linus Torvalds's avatar
Linus Torvalds committed
78 79 80 81 82 83 84 85 86 87 88 89
/*
 *	The AF_UNIX specific socket options
 */
 
struct unix_opt
{
	int 			family;
	char *			name;
	int  			locks;
	struct inode *		inode;
	struct semaphore	readsem;
	struct sock *		other;
Linus Torvalds's avatar
Linus Torvalds committed
90 91 92
	int 			marksweep;
#define MARKED			1
	int			inflight;
Linus Torvalds's avatar
Linus Torvalds committed
93 94
};

Linus Torvalds's avatar
Linus Torvalds committed
95 96 97 98 99 100 101 102 103 104 105 106 107
/*
 *	IP packet socket options
 */

struct inet_packet_opt
{
	struct notifier_block	notifier;		/* Used when bound */
	struct device		*bound_dev;
	unsigned long		dev_stamp;
	struct packet_type	*prot_hook;
	char			device_name[15];
};

Linus Torvalds's avatar
Linus Torvalds committed
108 109 110 111
/*
 *	Once the IPX ncpd patches are in these are going into protinfo
 */

Linus Torvalds's avatar
Linus Torvalds committed
112
#if defined(CONFIG_IPX) || defined(CONFIG_IPX_MODULE)
Linus Torvalds's avatar
Linus Torvalds committed
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
struct ipx_opt
{
	ipx_address		dest_addr;
	ipx_interface		*intrfc;
	unsigned short		port;
#ifdef CONFIG_IPX_INTERN
	unsigned char           node[IPX_NODE_LEN];
#endif
	unsigned short		type;
/* 
 * To handle asynchronous messages from the NetWare server, we have to
 * know the connection this socket belongs to. 
 */
	struct ncp_server       *ncp_server;
	
};
#endif
Linus Torvalds's avatar
Linus Torvalds committed
130

Linus Torvalds's avatar
Linus Torvalds committed
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
struct ipv6_pinfo
{
	struct in6_addr 	saddr;
	struct in6_addr 	rcv_saddr;
	struct in6_addr		daddr;

	__u32			flow_lbl;
	__u8			priority;
	__u8			hop_limit;

	__u8			mcast_hops;

	/* sockopt flags */

	__u8			recvsrcrt:1,
	                        rxinfo:1,
				mc_loop:1,
                                unused:4;

	/* device for outgoing mcast packets */

	struct device		*mc_if;

	struct ipv6_mc_socklist	*ipv6_mc_list;
	/* 
	 * destination cache entry pointer
	 * contains a pointer to neighbour cache
	 * and other info related to network level 
	 * (ex. PMTU)
	 */
	
	struct dest_entry	*dest;
	__u32			dc_sernum;

	struct ipv6_options	*opt;
};

struct raw6_opt {
	__u32			checksum;	/* perform checksum */
	__u32			offset;		/* checksum offset  */

	struct icmp6_filter	filter;
};

#endif /* IPV6 */

Linus Torvalds's avatar
Linus Torvalds committed
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
struct tcp_opt
{
/*
 *	RFC793 variables by their proper names. This means you can
 *	read the code and the spec side by side (and laugh ...)
 *	See RFC793 and RFC1122. The RFC writes these in capitals.
 */
 	__u32	rcv_nxt;	/* What we want to receive next 	*/
 	__u32	rcv_up;		/* The urgent point (may not be valid) 	*/
 	__u32	rcv_wnd;	/* Current receiver window		*/
 	__u32	snd_nxt;	/* Next sequence we send		*/
 	__u32	snd_una;	/* First byte we want an ack for	*/
	__u32	snd_up;		/* Outgoing urgent pointer		*/
	__u32	snd_wl1;	/* Sequence for window update		*/
	__u32	snd_wl2;	/* Ack sequence for update		*/
Linus Torvalds's avatar
Linus Torvalds committed
193 194 195 196 197 198 199 200

	__u32	rcv_wup;	/* rcv_nxt on last window update sent	*/


	__u32	srtt;		/* smothed round trip time << 3		*/
	__u32	mdev;		/* medium deviation			*/
	__u32	rto;		/* retransmit timeout			*/
	__u32	backoff;	/* backoff				*/
Linus Torvalds's avatar
Linus Torvalds committed
201 202 203 204 205 206 207 208 209 210 211 212 213
/*
 *	Slow start and congestion control (see also Nagle, and Karn & Partridge)
 */
 	__u32	snd_cwnd;	/* Sending congestion window		*/
 	__u32	snd_ssthresh;	/* Slow start size threshold		*/
/*
 *	Timers used by the TCP protocol layer
 */
 	struct timer_list	delack_timer;		/* Ack delay 	*/
 	struct timer_list	idle_timer;		/* Idle watch 	*/
 	struct timer_list	completion_timer;	/* Up/Down timer */
 	struct timer_list	probe_timer;		/* Probes	*/
 	struct timer_list	retransmit_timer;	/* Resend (no ack) */
Linus Torvalds's avatar
Linus Torvalds committed
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251

	__u32	basertt;	/* Vegas baseRTT */

	__u8	delayed_acks;
	__u8	dup_acks;

	__u32	lrcvtime;	/* timestamp of last received data packet  */
	__u32	rcv_tstamp;	/* timestamp of last received packet  */
	__u32	iat_mdev;	/* interarrival time medium deviation */
	__u32	iat;		/* interarrival time */
	__u32	ato;		/* delayed ack timeout */

	__u32	high_seq;
/*
 *	new send pointers
 */
	struct sk_buff *	send_head;
	struct sk_buff *	retrans_head;	/* retrans head can be 
						 * different to the head of
						 * write queue if we are doing
						 * fast retransmit
						 */
/*
 * pending events
 */
	__u8	pending;

/*
 *	Header prediction flags
 *	0x5?10 << 16 + snd_wnd in net byte order
 */
	__u32	pred_flags;
	__u32	snd_wnd;		/* The window we expect to receive */

	__u32	probes_out;		/* unanswered 0 window probes	   */

	struct open_request	*syn_wait_queue;
	struct tcp_func		*af_specific;
Linus Torvalds's avatar
Linus Torvalds committed
252
};
Linus Torvalds's avatar
Linus Torvalds committed
253

Linus Torvalds's avatar
Linus Torvalds committed
254
 	
255 256 257 258 259
/*
 * This structure really needs to be cleaned up.
 * Most of it is for TCP, and not used by any of
 * the other protocols.
 */
Linus Torvalds's avatar
Linus Torvalds committed
260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292

/*
 * The idea is to start moving to a newer struct gradualy
 * 
 * IMHO the newer struct should have the following format:
 * 
 *	struct sock {
 *		sockmem [mem, proto, callbacks]
 *
 *		union or struct {
 *			netrom;
 *			ax_25;
 *		} ll_pinfo;
 *	
 *		union {
 *			ipv4;
 *			ipv6;
 *			ipx;
 *		} net_pinfo;
 *
 *		union {
 *			tcp;
 *			udp;
 *			spx;
 *		} tp_pinfo;
 *
 *	}
 */

/*
 *  TCP will start to use the new protinfo while *still using the old* fields 
 */

Linus Torvalds's avatar
Linus Torvalds committed
293 294 295
struct sock 
{
	struct options		*opt;
Linus Torvalds's avatar
Linus Torvalds committed
296 297
	atomic_t		wmem_alloc;
	atomic_t		rmem_alloc;
Linus Torvalds's avatar
Linus Torvalds committed
298 299 300 301
	unsigned long		allocation;		/* Allocation mode */
	__u32			write_seq;
	__u32			copied_seq;
	__u32			fin_seq;
Linus Torvalds's avatar
Linus Torvalds committed
302
	__u32			syn_seq;
Linus Torvalds's avatar
Linus Torvalds committed
303 304
	__u32			urg_seq;
	__u32			urg_data;
Linus Torvalds's avatar
Linus Torvalds committed
305
	int			users;			/* user count */
Linus Torvalds's avatar
Linus Torvalds committed
306 307 308

	unsigned char		delayed_acks,
				dup_acks;
309
  /*
Linus Torvalds's avatar
Linus Torvalds committed
310 311
   *	Not all are volatile, but some are, so we
   * 	might as well say they all are.
312
   */
Linus Torvalds's avatar
Linus Torvalds committed
313
	volatile char		dead,
314 315 316 317 318 319 320 321 322 323
				urginline,
				intr,
				blog,
				done,
				reuse,
				keepopen,
				linger,
				destroy,
				ack_timed,
				no_check,
Linus Torvalds's avatar
Linus Torvalds committed
324
				zapped,	/* In ax25 & ipx means not linked */
Linus Torvalds's avatar
Linus Torvalds committed
325
				broadcast,
Linus Torvalds's avatar
Linus Torvalds committed
326 327
				nonagle,
				bsdism;
Linus Torvalds's avatar
Linus Torvalds committed
328 329 330 331 332
	unsigned long	        lingertime;
	int			proc;
	struct sock		*next;
	struct sock		*prev; /* Doubly linked chain.. */
	struct sock		*pair;
Linus Torvalds's avatar
Linus Torvalds committed
333 334 335 336

	struct sk_buff		* send_head;
	struct sk_buff		* send_tail;

Linus Torvalds's avatar
Linus Torvalds committed
337 338 339
	struct sk_buff_head	back_log;
	struct sk_buff		*partial;
	struct timer_list	partial_timer;
Linus Torvalds's avatar
Linus Torvalds committed
340 341
	atomic_t		retransmits;

Linus Torvalds's avatar
Linus Torvalds committed
342
	struct sk_buff_head	write_queue,
Linus Torvalds's avatar
Linus Torvalds committed
343 344 345 346
				receive_queue,
				out_of_order_queue;

	unsigned short		family;
Linus Torvalds's avatar
Linus Torvalds committed
347 348
	struct proto		*prot;
	struct wait_queue	**sleep;
Linus Torvalds's avatar
Linus Torvalds committed
349

Linus Torvalds's avatar
Linus Torvalds committed
350 351 352
	__u32			daddr;
	__u32			saddr;		/* Sending source */
	__u32			rcv_saddr;	/* Bound address */
Linus Torvalds's avatar
Linus Torvalds committed
353

Linus Torvalds's avatar
Linus Torvalds committed
354
	unsigned short		max_unacked;
Linus Torvalds's avatar
Linus Torvalds committed
355 356


Linus Torvalds's avatar
Linus Torvalds committed
357 358 359 360 361
	unsigned short		bytes_rcv;
/*
 *	mss is min(mtu, max_window) 
 */
	unsigned short		mtu;       /* mss negotiated in the syn's */
Linus Torvalds's avatar
Linus Torvalds committed
362 363 364
	unsigned short		mss;       /* current eff. mss - can change */
	unsigned short		user_mss;  /* mss requested by user in ioctl */
	unsigned short		max_window;
Linus Torvalds's avatar
Linus Torvalds committed
365
	unsigned long 		window_clamp;
Linus Torvalds's avatar
Linus Torvalds committed
366
	unsigned int		ssthresh;
Linus Torvalds's avatar
Linus Torvalds committed
367 368
	unsigned short		num;

Linus Torvalds's avatar
Linus Torvalds committed
369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387
	unsigned short		cong_window;
	unsigned short		cong_count;
	atomic_t		packets_out;
	unsigned short		shutdown;

	unsigned short		window;		/* used by netrom/ax.25 */

#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
	union {
		struct ipv6_pinfo	af_inet6;
	} net_pinfo;
#endif

	union {
		struct tcp_opt		af_tcp;
#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
		struct raw6_opt		tp_raw;
#endif
	} tp_pinfo;
Linus Torvalds's avatar
Linus Torvalds committed
388 389 390
/*
 *	currently backoff isn't used, but I'm maintaining it in case
 *	we want to go back to a backoff formula that needs it
Linus Torvalds's avatar
Linus Torvalds committed
391
 */
Linus Torvalds's avatar
Linus Torvalds committed
392 393 394
/* 
	unsigned short		backoff;
 */
Linus Torvalds's avatar
Linus Torvalds committed
395
	int			err, err_soft;	/* Soft holds errors that don't
Linus Torvalds's avatar
Linus Torvalds committed
396 397 398
						   cause failure but are the cause
						   of a persistent failure not just
						   'timed out' */
Linus Torvalds's avatar
Linus Torvalds committed
399 400
	unsigned char		protocol;
	volatile unsigned char	state;
Linus Torvalds's avatar
Linus Torvalds committed
401
	unsigned char		ack_backlog;
Linus Torvalds's avatar
Linus Torvalds committed
402 403 404
	unsigned char		max_ack_backlog;
	unsigned char		priority;
	unsigned char		debug;
Linus Torvalds's avatar
Linus Torvalds committed
405 406
	int			rcvbuf;
	int			sndbuf;
Linus Torvalds's avatar
Linus Torvalds committed
407 408
	unsigned short		type;
	unsigned char		localroute;	/* Route locally only */
Linus Torvalds's avatar
Linus Torvalds committed
409 410
  
/*
Linus Torvalds's avatar
Linus Torvalds committed
411
 *	This is where all the private (optional) areas that don't
Linus Torvalds's avatar
Linus Torvalds committed
412
 *	overlap will eventually live. 
Linus Torvalds's avatar
Linus Torvalds committed
413 414
 */

Linus Torvalds's avatar
Linus Torvalds committed
415 416 417
	union
	{
	  	struct unix_opt	af_unix;
Linus Torvalds's avatar
Linus Torvalds committed
418
#if defined(CONFIG_ATALK) || defined(CONFIG_ATALK_MODULE)
Linus Torvalds's avatar
Linus Torvalds committed
419
		struct atalk_sock	af_at;
Linus Torvalds's avatar
Linus Torvalds committed
420
#endif
Linus Torvalds's avatar
Linus Torvalds committed
421
#if defined(CONFIG_IPX) || defined(CONFIG_IPX_MODULE)
Linus Torvalds's avatar
Linus Torvalds committed
422
		struct ipx_opt		af_ipx;
Linus Torvalds's avatar
Linus Torvalds committed
423
#endif
Linus Torvalds's avatar
Linus Torvalds committed
424 425
#ifdef CONFIG_INET
		struct inet_packet_opt  af_packet;
Linus Torvalds's avatar
Linus Torvalds committed
426 427 428
#ifdef CONFIG_NUTCP		
		struct tcp_opt		af_tcp;
#endif		
Linus Torvalds's avatar
Linus Torvalds committed
429 430 431 432 433 434 435 436 437
#endif
#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
		ax25_cb			*ax25;
#if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE)
		nr_cb			*nr;
#endif
#if defined(CONFIG_ROSE) || defined(CONFIG_ROSE_MODULE)
		rose_cb			*rose;
#endif
Linus Torvalds's avatar
Linus Torvalds committed
438 439 440 441 442 443 444 445 446 447 448
#endif
	} protinfo;  		

/* 
 *	IP 'private area' or will be eventually 
 */
	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 */
Linus Torvalds's avatar
Linus Torvalds committed
449
	struct timer_list	delack_timer;		/* TCP delayed ack timer */
Linus Torvalds's avatar
Linus Torvalds committed
450 451 452
	int			ip_xmit_timeout;	/* Why the timeout is running */
	struct rtable		*ip_route_cache;	/* Cached output route */
	unsigned char		ip_hdrincl;		/* Include headers ? */
Linus Torvalds's avatar
Linus Torvalds committed
453
#ifdef CONFIG_IP_MULTICAST  
Linus Torvalds's avatar
Linus Torvalds committed
454 455 456 457
	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 */
Linus Torvalds's avatar
Linus Torvalds committed
458
#endif  
459

Linus Torvalds's avatar
Linus Torvalds committed
460 461 462 463 464 465
/*
 *	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
Linus Torvalds's avatar
Linus Torvalds committed
466 467
					 * when we are doing IP
					 */
Linus Torvalds's avatar
Linus Torvalds committed
468
	struct timeval		stamp;
Linus Torvalds's avatar
Linus Torvalds committed
469

Linus Torvalds's avatar
Linus Torvalds committed
470 471 472 473 474
 /*
  *	Identd 
  */
  
	struct socket		*socket;
Linus Torvalds's avatar
Linus Torvalds committed
475
  
Linus Torvalds's avatar
Linus Torvalds committed
476 477 478 479 480 481 482 483
  /*
   *	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);
Linus Torvalds's avatar
Linus Torvalds committed
484 485 486

  	int			(*backlog_rcv) (struct sock *sk,
						struct sk_buff *skb);  
487 488
};

Linus Torvalds's avatar
Linus Torvalds committed
489 490 491 492 493 494 495 496 497 498 499 500 501
#if 0
/*
 *	Inet protocol options
 */
struct inet_options {
	__u8				version;
	union {
		struct options		opt_v4;
		struct ipv6_options	opt_v6;
	} u;
};
#endif

Linus Torvalds's avatar
Linus Torvalds committed
502 503
/*
 *	IP protocol blocks we attach to sockets.
Linus Torvalds's avatar
Linus Torvalds committed
504 505
 *	socket layer -> transport layer interface
 *	transport -> network interface is defined by struct inet_proto
Linus Torvalds's avatar
Linus Torvalds committed
506 507 508 509
 */
 
struct proto 
{
Linus Torvalds's avatar
Linus Torvalds committed
510 511
	void			(*close)(struct sock *sk, 
					unsigned long timeout);
Linus Torvalds's avatar
Linus Torvalds committed
512
	int			(*connect)(struct sock *sk,
Linus Torvalds's avatar
Linus Torvalds committed
513 514 515
				        struct sockaddr *uaddr, 
					int addr_len);

Linus Torvalds's avatar
Linus Torvalds committed
516 517 518 519
	struct sock *		(*accept) (struct sock *sk, int flags);
	void			(*retransmit)(struct sock *sk, int all);
	void			(*write_wakeup)(struct sock *sk);
	void			(*read_wakeup)(struct sock *sk);
Linus Torvalds's avatar
Linus Torvalds committed
520

Linus Torvalds's avatar
Linus Torvalds committed
521 522
	int			(*select)(struct sock *sk, int which,
					select_table *wait);
Linus Torvalds's avatar
Linus Torvalds committed
523

Linus Torvalds's avatar
Linus Torvalds committed
524 525 526
	int			(*ioctl)(struct sock *sk, int cmd,
					unsigned long arg);
	int			(*init)(struct sock *sk);
Linus Torvalds's avatar
Linus Torvalds committed
527
	int			(*destroy)(struct sock *sk);
Linus Torvalds's avatar
Linus Torvalds committed
528
	void			(*shutdown)(struct sock *sk, int how);
Linus Torvalds's avatar
Linus Torvalds committed
529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544
	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);

	int			(*backlog_rcv) (struct sock *sk, 
						struct sk_buff *skb);

Linus Torvalds's avatar
Linus Torvalds committed
545 546 547 548
	unsigned short		max_header;
	unsigned long		retransmits;
	char			name[32];
	int			inuse, highestinuse;
Linus Torvalds's avatar
Linus Torvalds committed
549
	struct sock **		sock_array;
550 551
};

Linus Torvalds's avatar
Linus Torvalds committed
552 553 554 555 556 557 558 559
#define TIME_WRITE	1	/* Not yet used */
#define TIME_RETRANS	2	/* Retransmit timer */
#define TIME_DACK	3	/* Delayed ack timer */
#define TIME_CLOSE	4
#define TIME_KEEPOPEN	5
#define TIME_DESTROY	6
#define TIME_DONE	7	/* Used to absorb those last few packets */
#define TIME_PROBE0	8
Linus Torvalds's avatar
Linus Torvalds committed
560

Linus Torvalds's avatar
Linus Torvalds committed
561 562 563
/*
 *	About 10 seconds 
 */
Linus Torvalds's avatar
Linus Torvalds committed
564

Linus Torvalds's avatar
Linus Torvalds committed
565
#define SOCK_DESTROY_TIME (10*HZ)
Linus Torvalds's avatar
Linus Torvalds committed
566

Linus Torvalds's avatar
Linus Torvalds committed
567
/*
Linus Torvalds's avatar
Linus Torvalds committed
568
 *	Sockets 0-1023 can't be bound to unless you are superuser 
Linus Torvalds's avatar
Linus Torvalds committed
569 570
 */
 
Linus Torvalds's avatar
Linus Torvalds committed
571
#define PROT_SOCK	1024
572 573 574 575 576

#define SHUTDOWN_MASK	3
#define RCV_SHUTDOWN	1
#define SEND_SHUTDOWN	2

Linus Torvalds's avatar
Linus Torvalds committed
577 578 579 580 581 582 583 584 585 586 587 588 589 590
/*
 * 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)
{
Linus Torvalds's avatar
Linus Torvalds committed
591
#if 0
Linus Torvalds's avatar
Linus Torvalds committed
592 593 594 595 596 597 598 599 600 601 602 603 604 605 606
/* 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();
Linus Torvalds's avatar
Linus Torvalds committed
607
#if 0
Linus Torvalds's avatar
Linus Torvalds committed
608 609 610 611 612 613 614 615
/* 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
Linus Torvalds's avatar
Linus Torvalds committed
616
	if ((sk->users = sk->users-1) == 0)
Linus Torvalds's avatar
Linus Torvalds committed
617 618 619
		__release_sock(sk);
}

Linus Torvalds's avatar
Linus Torvalds committed
620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638
/*
 *	This might not be the most apropriate place for this two	 
 *	but since they are used by a lot of the net related code
 *	at least they get declared on a include that is common to all
 */

static __inline__ int min(unsigned int a, unsigned int b)
{
	if (a > b)
		a = b; 
	return a;
}

static __inline__ int max(unsigned int a, unsigned int b)
{
	if (a < b)
		a = b;
	return a;
}
639

Linus Torvalds's avatar
Linus Torvalds committed
640 641
extern struct sock *		sk_alloc(int priority);
extern void			sk_free(struct sock *sk);
642
extern void			destroy_sock(struct sock *sk);
Linus Torvalds's avatar
Linus Torvalds committed
643 644
extern unsigned short		get_new_socknum(struct proto *,
						unsigned short);
Linus Torvalds's avatar
Linus Torvalds committed
645
extern void			inet_put_sock(unsigned short, struct sock *); 
646 647
extern struct sock		*get_sock(struct proto *, unsigned short,
					  unsigned long, unsigned short,
Linus Torvalds's avatar
Linus Torvalds committed
648 649
					  unsigned long,
					  unsigned long, unsigned short);
Linus Torvalds's avatar
Linus Torvalds committed
650 651 652 653 654 655
extern struct sock		*get_sock_mcast(struct sock *, unsigned short,
					  unsigned long, unsigned short,
					  unsigned long);
extern struct sock		*get_sock_raw(struct sock *, unsigned short,
					  unsigned long, unsigned long);

Linus Torvalds's avatar
Linus Torvalds committed
656
extern struct sk_buff		*sock_wmalloc(struct sock *sk,
657 658
					      unsigned long size, int force,
					      int priority);
Linus Torvalds's avatar
Linus Torvalds committed
659
extern struct sk_buff		*sock_rmalloc(struct sock *sk,
660 661
					      unsigned long size, int force,
					      int priority);
Linus Torvalds's avatar
Linus Torvalds committed
662 663 664 665
extern void			sock_wfree(struct sock *sk,
					   struct sk_buff *skb);
extern void			sock_rfree(struct sock *sk,
					   struct sk_buff *skb);
666 667 668
extern unsigned long		sock_rspace(struct sock *sk);
extern unsigned long		sock_wspace(struct sock *sk);

Linus Torvalds's avatar
Linus Torvalds committed
669 670 671
extern int			sock_setsockopt(struct sock *sk, int level,
						int op, char *optval,
						int optlen);
Linus Torvalds's avatar
Linus Torvalds committed
672

Linus Torvalds's avatar
Linus Torvalds committed
673 674 675 676 677
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,
Linus Torvalds's avatar
Linus Torvalds committed
678
						     unsigned long fallback,
Linus Torvalds's avatar
Linus Torvalds committed
679 680
						     int noblock,
						     int *errcode);
Linus Torvalds's avatar
Linus Torvalds committed
681 682

/*
Linus Torvalds's avatar
Linus Torvalds committed
683 684 685
 * 	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.
Linus Torvalds's avatar
Linus Torvalds committed
686
 *
Linus Torvalds's avatar
Linus Torvalds committed
687
 * 	Inlined as it's very short and called for pretty much every
Linus Torvalds's avatar
Linus Torvalds committed
688
 *	packet ever received.
Linus Torvalds's avatar
Linus Torvalds committed
689 690 691
 */

extern __inline__ int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
Linus Torvalds's avatar
Linus Torvalds committed
692 693 694 695 696 697 698 699 700 701 702 703
{
	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)
Linus Torvalds's avatar
Linus Torvalds committed
704
{
Linus Torvalds's avatar
Linus Torvalds committed
705
	if (sk->rmem_alloc + skb->truesize >= sk->rcvbuf)
Linus Torvalds's avatar
Linus Torvalds committed
706
		return -ENOMEM;
Linus Torvalds's avatar
Linus Torvalds committed
707
	atomic_add(skb->truesize, &sk->rmem_alloc);
Linus Torvalds's avatar
Linus Torvalds committed
708
	skb->sk=sk;
Linus Torvalds's avatar
Linus Torvalds committed
709 710
	__skb_queue_tail(&sk->receive_queue,skb);
	if (!sk->dead)
Linus Torvalds's avatar
Linus Torvalds committed
711 712 713
		sk->data_ready(sk,skb->len);
	return 0;
}
714

Linus Torvalds's avatar
Linus Torvalds committed
715 716 717 718 719 720 721 722 723
/*
 *	Recover an error report and clear atomically
 */
 
extern __inline__ int sock_error(struct sock *sk)
{
	int err=xchg(&sk->err,0);
	return -err;
}
Linus Torvalds's avatar
Linus Torvalds committed
724

Linus Torvalds's avatar
Linus Torvalds committed
725 726 727 728
/* 
 *	Declarations from timer.c 
 */
 
729 730
extern struct sock *timer_base;

Linus Torvalds's avatar
Linus Torvalds committed
731 732
extern void net_delete_timer (struct sock *);
extern void net_reset_timer (struct sock *, int, unsigned long);
Linus Torvalds's avatar
Linus Torvalds committed
733
extern void net_timer (unsigned long);
734 735


Linus Torvalds's avatar
Linus Torvalds committed
736 737 738
/* 
 *	Enable debug/info messages 
 */
Linus Torvalds's avatar
Linus Torvalds committed
739

Linus Torvalds's avatar
Linus Torvalds committed
740
#define NETDEBUG(x)	do { } while (0)
Linus Torvalds's avatar
Linus Torvalds committed
741

742
#endif	/* _SOCK_H */