diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2005-08-29 20:36:46 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-08-29 20:36:46 -0400 |
commit | 826509f8110049663799bc20f2b5b6170e2f78ca (patch) | |
tree | 9d8823cf283592625b882125b4b13988f2934cc6 /include | |
parent | d992895ba2b27cf5adf1ba0ad6d27662adc54c5e (diff) | |
parent | c530cfb1ce1e8f230744c3f3bd86771f50725053 (diff) |
Merge HEAD from master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6.git
Diffstat (limited to 'include')
119 files changed, 3449 insertions, 1038 deletions
diff --git a/include/asm-alpha/socket.h b/include/asm-alpha/socket.h index d00259d3dc78..b5193229132a 100644 --- a/include/asm-alpha/socket.h +++ b/include/asm-alpha/socket.h | |||
@@ -25,6 +25,8 @@ | |||
25 | #define SO_ERROR 0x1007 | 25 | #define SO_ERROR 0x1007 |
26 | #define SO_SNDBUF 0x1001 | 26 | #define SO_SNDBUF 0x1001 |
27 | #define SO_RCVBUF 0x1002 | 27 | #define SO_RCVBUF 0x1002 |
28 | #define SO_SNDBUFFORCE 0x100a | ||
29 | #define SO_RCVBUFFORCE 0x100b | ||
28 | #define SO_RCVLOWAT 0x1010 | 30 | #define SO_RCVLOWAT 0x1010 |
29 | #define SO_SNDLOWAT 0x1011 | 31 | #define SO_SNDLOWAT 0x1011 |
30 | #define SO_RCVTIMEO 0x1012 | 32 | #define SO_RCVTIMEO 0x1012 |
diff --git a/include/asm-arm/socket.h b/include/asm-arm/socket.h index 46d20585d951..3c51da6438c9 100644 --- a/include/asm-arm/socket.h +++ b/include/asm-arm/socket.h | |||
@@ -14,6 +14,8 @@ | |||
14 | #define SO_BROADCAST 6 | 14 | #define SO_BROADCAST 6 |
15 | #define SO_SNDBUF 7 | 15 | #define SO_SNDBUF 7 |
16 | #define SO_RCVBUF 8 | 16 | #define SO_RCVBUF 8 |
17 | #define SO_SNDBUFFORCE 32 | ||
18 | #define SO_RCVBUFFORCE 33 | ||
17 | #define SO_KEEPALIVE 9 | 19 | #define SO_KEEPALIVE 9 |
18 | #define SO_OOBINLINE 10 | 20 | #define SO_OOBINLINE 10 |
19 | #define SO_NO_CHECK 11 | 21 | #define SO_NO_CHECK 11 |
diff --git a/include/asm-arm26/socket.h b/include/asm-arm26/socket.h index 46d20585d951..3c51da6438c9 100644 --- a/include/asm-arm26/socket.h +++ b/include/asm-arm26/socket.h | |||
@@ -14,6 +14,8 @@ | |||
14 | #define SO_BROADCAST 6 | 14 | #define SO_BROADCAST 6 |
15 | #define SO_SNDBUF 7 | 15 | #define SO_SNDBUF 7 |
16 | #define SO_RCVBUF 8 | 16 | #define SO_RCVBUF 8 |
17 | #define SO_SNDBUFFORCE 32 | ||
18 | #define SO_RCVBUFFORCE 33 | ||
17 | #define SO_KEEPALIVE 9 | 19 | #define SO_KEEPALIVE 9 |
18 | #define SO_OOBINLINE 10 | 20 | #define SO_OOBINLINE 10 |
19 | #define SO_NO_CHECK 11 | 21 | #define SO_NO_CHECK 11 |
diff --git a/include/asm-cris/socket.h b/include/asm-cris/socket.h index f159b4f165f7..8b1da3e58c55 100644 --- a/include/asm-cris/socket.h +++ b/include/asm-cris/socket.h | |||
@@ -16,6 +16,8 @@ | |||
16 | #define SO_BROADCAST 6 | 16 | #define SO_BROADCAST 6 |
17 | #define SO_SNDBUF 7 | 17 | #define SO_SNDBUF 7 |
18 | #define SO_RCVBUF 8 | 18 | #define SO_RCVBUF 8 |
19 | #define SO_SNDBUFFORCE 32 | ||
20 | #define SO_RCVBUFFORCE 33 | ||
19 | #define SO_KEEPALIVE 9 | 21 | #define SO_KEEPALIVE 9 |
20 | #define SO_OOBINLINE 10 | 22 | #define SO_OOBINLINE 10 |
21 | #define SO_NO_CHECK 11 | 23 | #define SO_NO_CHECK 11 |
diff --git a/include/asm-frv/socket.h b/include/asm-frv/socket.h index c3be17c7de4b..7177f8b9817c 100644 --- a/include/asm-frv/socket.h +++ b/include/asm-frv/socket.h | |||
@@ -14,6 +14,8 @@ | |||
14 | #define SO_BROADCAST 6 | 14 | #define SO_BROADCAST 6 |
15 | #define SO_SNDBUF 7 | 15 | #define SO_SNDBUF 7 |
16 | #define SO_RCVBUF 8 | 16 | #define SO_RCVBUF 8 |
17 | #define SO_SNDBUFFORCE 32 | ||
18 | #define SO_RCVBUFFORCE 33 | ||
17 | #define SO_KEEPALIVE 9 | 19 | #define SO_KEEPALIVE 9 |
18 | #define SO_OOBINLINE 10 | 20 | #define SO_OOBINLINE 10 |
19 | #define SO_NO_CHECK 11 | 21 | #define SO_NO_CHECK 11 |
diff --git a/include/asm-h8300/socket.h b/include/asm-h8300/socket.h index af33b8525dcf..d98cf85bafc1 100644 --- a/include/asm-h8300/socket.h +++ b/include/asm-h8300/socket.h | |||
@@ -14,6 +14,8 @@ | |||
14 | #define SO_BROADCAST 6 | 14 | #define SO_BROADCAST 6 |
15 | #define SO_SNDBUF 7 | 15 | #define SO_SNDBUF 7 |
16 | #define SO_RCVBUF 8 | 16 | #define SO_RCVBUF 8 |
17 | #define SO_SNDBUFFORCE 32 | ||
18 | #define SO_RCVBUFFORCE 33 | ||
17 | #define SO_KEEPALIVE 9 | 19 | #define SO_KEEPALIVE 9 |
18 | #define SO_OOBINLINE 10 | 20 | #define SO_OOBINLINE 10 |
19 | #define SO_NO_CHECK 11 | 21 | #define SO_NO_CHECK 11 |
diff --git a/include/asm-i386/checksum.h b/include/asm-i386/checksum.h index f949e44c2a35..67d3630c4e89 100644 --- a/include/asm-i386/checksum.h +++ b/include/asm-i386/checksum.h | |||
@@ -83,7 +83,7 @@ static inline unsigned short ip_fast_csum(unsigned char * iph, | |||
83 | "adcl $0, %0 ;\n" | 83 | "adcl $0, %0 ;\n" |
84 | "notl %0 ;\n" | 84 | "notl %0 ;\n" |
85 | "2: ;\n" | 85 | "2: ;\n" |
86 | /* Since the input registers which are loaded with iph and ipl | 86 | /* Since the input registers which are loaded with iph and ihl |
87 | are modified, we must also specify them as outputs, or gcc | 87 | are modified, we must also specify them as outputs, or gcc |
88 | will assume they contain their original values. */ | 88 | will assume they contain their original values. */ |
89 | : "=r" (sum), "=r" (iph), "=r" (ihl) | 89 | : "=r" (sum), "=r" (iph), "=r" (ihl) |
diff --git a/include/asm-i386/socket.h b/include/asm-i386/socket.h index 07f6b38ad140..802ae76195b7 100644 --- a/include/asm-i386/socket.h +++ b/include/asm-i386/socket.h | |||
@@ -14,6 +14,8 @@ | |||
14 | #define SO_BROADCAST 6 | 14 | #define SO_BROADCAST 6 |
15 | #define SO_SNDBUF 7 | 15 | #define SO_SNDBUF 7 |
16 | #define SO_RCVBUF 8 | 16 | #define SO_RCVBUF 8 |
17 | #define SO_SNDBUFFORCE 32 | ||
18 | #define SO_RCVBUFFORCE 33 | ||
17 | #define SO_KEEPALIVE 9 | 19 | #define SO_KEEPALIVE 9 |
18 | #define SO_OOBINLINE 10 | 20 | #define SO_OOBINLINE 10 |
19 | #define SO_NO_CHECK 11 | 21 | #define SO_NO_CHECK 11 |
diff --git a/include/asm-ia64/socket.h b/include/asm-ia64/socket.h index 21a9f10d6baa..a255006fb7b5 100644 --- a/include/asm-ia64/socket.h +++ b/include/asm-ia64/socket.h | |||
@@ -23,6 +23,8 @@ | |||
23 | #define SO_BROADCAST 6 | 23 | #define SO_BROADCAST 6 |
24 | #define SO_SNDBUF 7 | 24 | #define SO_SNDBUF 7 |
25 | #define SO_RCVBUF 8 | 25 | #define SO_RCVBUF 8 |
26 | #define SO_SNDBUFFORCE 32 | ||
27 | #define SO_RCVBUFFORCE 33 | ||
26 | #define SO_KEEPALIVE 9 | 28 | #define SO_KEEPALIVE 9 |
27 | #define SO_OOBINLINE 10 | 29 | #define SO_OOBINLINE 10 |
28 | #define SO_NO_CHECK 11 | 30 | #define SO_NO_CHECK 11 |
diff --git a/include/asm-m32r/checksum.h b/include/asm-m32r/checksum.h index 99f37dbf2558..877ebf46e9ff 100644 --- a/include/asm-m32r/checksum.h +++ b/include/asm-m32r/checksum.h | |||
@@ -105,7 +105,7 @@ static inline unsigned short ip_fast_csum(unsigned char * iph, | |||
105 | " addx %0, %3 \n" | 105 | " addx %0, %3 \n" |
106 | " .fillinsn\n" | 106 | " .fillinsn\n" |
107 | "2: \n" | 107 | "2: \n" |
108 | /* Since the input registers which are loaded with iph and ipl | 108 | /* Since the input registers which are loaded with iph and ihl |
109 | are modified, we must also specify them as outputs, or gcc | 109 | are modified, we must also specify them as outputs, or gcc |
110 | will assume they contain their original values. */ | 110 | will assume they contain their original values. */ |
111 | : "=&r" (sum), "=r" (iph), "=r" (ihl), "=&r" (tmpreg0), "=&r" (tmpreg1) | 111 | : "=&r" (sum), "=r" (iph), "=r" (ihl), "=&r" (tmpreg0), "=&r" (tmpreg1) |
diff --git a/include/asm-m32r/socket.h b/include/asm-m32r/socket.h index 159519d99042..8b6680f223c0 100644 --- a/include/asm-m32r/socket.h +++ b/include/asm-m32r/socket.h | |||
@@ -14,6 +14,8 @@ | |||
14 | #define SO_BROADCAST 6 | 14 | #define SO_BROADCAST 6 |
15 | #define SO_SNDBUF 7 | 15 | #define SO_SNDBUF 7 |
16 | #define SO_RCVBUF 8 | 16 | #define SO_RCVBUF 8 |
17 | #define SO_SNDBUFFORCE 32 | ||
18 | #define SO_RCVBUFFORCE 33 | ||
17 | #define SO_KEEPALIVE 9 | 19 | #define SO_KEEPALIVE 9 |
18 | #define SO_OOBINLINE 10 | 20 | #define SO_OOBINLINE 10 |
19 | #define SO_NO_CHECK 11 | 21 | #define SO_NO_CHECK 11 |
diff --git a/include/asm-m68k/socket.h b/include/asm-m68k/socket.h index 8d0b9fc2d07e..f578ca4b776a 100644 --- a/include/asm-m68k/socket.h +++ b/include/asm-m68k/socket.h | |||
@@ -14,6 +14,8 @@ | |||
14 | #define SO_BROADCAST 6 | 14 | #define SO_BROADCAST 6 |
15 | #define SO_SNDBUF 7 | 15 | #define SO_SNDBUF 7 |
16 | #define SO_RCVBUF 8 | 16 | #define SO_RCVBUF 8 |
17 | #define SO_SNDBUFFORCE 32 | ||
18 | #define SO_RCVBUFFORCE 33 | ||
17 | #define SO_KEEPALIVE 9 | 19 | #define SO_KEEPALIVE 9 |
18 | #define SO_OOBINLINE 10 | 20 | #define SO_OOBINLINE 10 |
19 | #define SO_NO_CHECK 11 | 21 | #define SO_NO_CHECK 11 |
diff --git a/include/asm-mips/socket.h b/include/asm-mips/socket.h index 020b4db70ee5..d478a86294ee 100644 --- a/include/asm-mips/socket.h +++ b/include/asm-mips/socket.h | |||
@@ -37,6 +37,8 @@ To add: #define SO_REUSEPORT 0x0200 /* Allow local address and port reuse. */ | |||
37 | #define SO_ERROR 0x1007 /* get error status and clear */ | 37 | #define SO_ERROR 0x1007 /* get error status and clear */ |
38 | #define SO_SNDBUF 0x1001 /* Send buffer size. */ | 38 | #define SO_SNDBUF 0x1001 /* Send buffer size. */ |
39 | #define SO_RCVBUF 0x1002 /* Receive buffer. */ | 39 | #define SO_RCVBUF 0x1002 /* Receive buffer. */ |
40 | #define SO_SNDBUFFORCE 0x100a | ||
41 | #define SO_RCVBUFFORCE 0x100b | ||
40 | #define SO_SNDLOWAT 0x1003 /* send low-water mark */ | 42 | #define SO_SNDLOWAT 0x1003 /* send low-water mark */ |
41 | #define SO_RCVLOWAT 0x1004 /* receive low-water mark */ | 43 | #define SO_RCVLOWAT 0x1004 /* receive low-water mark */ |
42 | #define SO_SNDTIMEO 0x1005 /* send timeout */ | 44 | #define SO_SNDTIMEO 0x1005 /* send timeout */ |
diff --git a/include/asm-parisc/socket.h b/include/asm-parisc/socket.h index 4a77996c1862..1bf54dc53c10 100644 --- a/include/asm-parisc/socket.h +++ b/include/asm-parisc/socket.h | |||
@@ -16,6 +16,8 @@ | |||
16 | /* To add :#define SO_REUSEPORT 0x0200 */ | 16 | /* To add :#define SO_REUSEPORT 0x0200 */ |
17 | #define SO_SNDBUF 0x1001 | 17 | #define SO_SNDBUF 0x1001 |
18 | #define SO_RCVBUF 0x1002 | 18 | #define SO_RCVBUF 0x1002 |
19 | #define SO_SNDBUFFORCE 0x100a | ||
20 | #define SO_RCVBUFFORCE 0x100b | ||
19 | #define SO_SNDLOWAT 0x1003 | 21 | #define SO_SNDLOWAT 0x1003 |
20 | #define SO_RCVLOWAT 0x1004 | 22 | #define SO_RCVLOWAT 0x1004 |
21 | #define SO_SNDTIMEO 0x1005 | 23 | #define SO_SNDTIMEO 0x1005 |
diff --git a/include/asm-ppc/socket.h b/include/asm-ppc/socket.h index 4134376b0f66..296e1a3469d0 100644 --- a/include/asm-ppc/socket.h +++ b/include/asm-ppc/socket.h | |||
@@ -20,6 +20,8 @@ | |||
20 | #define SO_BROADCAST 6 | 20 | #define SO_BROADCAST 6 |
21 | #define SO_SNDBUF 7 | 21 | #define SO_SNDBUF 7 |
22 | #define SO_RCVBUF 8 | 22 | #define SO_RCVBUF 8 |
23 | #define SO_SNDBUFFORCE 32 | ||
24 | #define SO_RCVBUFFORCE 33 | ||
23 | #define SO_KEEPALIVE 9 | 25 | #define SO_KEEPALIVE 9 |
24 | #define SO_OOBINLINE 10 | 26 | #define SO_OOBINLINE 10 |
25 | #define SO_NO_CHECK 11 | 27 | #define SO_NO_CHECK 11 |
diff --git a/include/asm-ppc64/socket.h b/include/asm-ppc64/socket.h index 59e00dfc8b8e..9e1af8eb2d96 100644 --- a/include/asm-ppc64/socket.h +++ b/include/asm-ppc64/socket.h | |||
@@ -21,6 +21,8 @@ | |||
21 | #define SO_BROADCAST 6 | 21 | #define SO_BROADCAST 6 |
22 | #define SO_SNDBUF 7 | 22 | #define SO_SNDBUF 7 |
23 | #define SO_RCVBUF 8 | 23 | #define SO_RCVBUF 8 |
24 | #define SO_SNDBUFFORCE 32 | ||
25 | #define SO_RCVBUFFORCE 33 | ||
24 | #define SO_KEEPALIVE 9 | 26 | #define SO_KEEPALIVE 9 |
25 | #define SO_OOBINLINE 10 | 27 | #define SO_OOBINLINE 10 |
26 | #define SO_NO_CHECK 11 | 28 | #define SO_NO_CHECK 11 |
diff --git a/include/asm-s390/socket.h b/include/asm-s390/socket.h index 0e96eeca4e6b..15a5298c8744 100644 --- a/include/asm-s390/socket.h +++ b/include/asm-s390/socket.h | |||
@@ -22,6 +22,8 @@ | |||
22 | #define SO_BROADCAST 6 | 22 | #define SO_BROADCAST 6 |
23 | #define SO_SNDBUF 7 | 23 | #define SO_SNDBUF 7 |
24 | #define SO_RCVBUF 8 | 24 | #define SO_RCVBUF 8 |
25 | #define SO_SNDBUFFORCE 32 | ||
26 | #define SO_RCVBUFFORCE 33 | ||
25 | #define SO_KEEPALIVE 9 | 27 | #define SO_KEEPALIVE 9 |
26 | #define SO_OOBINLINE 10 | 28 | #define SO_OOBINLINE 10 |
27 | #define SO_NO_CHECK 11 | 29 | #define SO_NO_CHECK 11 |
diff --git a/include/asm-sh/socket.h b/include/asm-sh/socket.h index dde696c3b4c7..553904ff9336 100644 --- a/include/asm-sh/socket.h +++ b/include/asm-sh/socket.h | |||
@@ -14,6 +14,8 @@ | |||
14 | #define SO_BROADCAST 6 | 14 | #define SO_BROADCAST 6 |
15 | #define SO_SNDBUF 7 | 15 | #define SO_SNDBUF 7 |
16 | #define SO_RCVBUF 8 | 16 | #define SO_RCVBUF 8 |
17 | #define SO_RCVBUFFORCE 32 | ||
18 | #define SO_SNDBUFFORCE 33 | ||
17 | #define SO_KEEPALIVE 9 | 19 | #define SO_KEEPALIVE 9 |
18 | #define SO_OOBINLINE 10 | 20 | #define SO_OOBINLINE 10 |
19 | #define SO_NO_CHECK 11 | 21 | #define SO_NO_CHECK 11 |
diff --git a/include/asm-sparc/socket.h b/include/asm-sparc/socket.h index c1154e3ecfdf..09575b608adb 100644 --- a/include/asm-sparc/socket.h +++ b/include/asm-sparc/socket.h | |||
@@ -29,6 +29,8 @@ | |||
29 | 29 | ||
30 | #define SO_SNDBUF 0x1001 | 30 | #define SO_SNDBUF 0x1001 |
31 | #define SO_RCVBUF 0x1002 | 31 | #define SO_RCVBUF 0x1002 |
32 | #define SO_SNDBUFFORCE 0x100a | ||
33 | #define SO_RCVBUFFORCE 0x100b | ||
32 | #define SO_ERROR 0x1007 | 34 | #define SO_ERROR 0x1007 |
33 | #define SO_TYPE 0x1008 | 35 | #define SO_TYPE 0x1008 |
34 | 36 | ||
diff --git a/include/asm-sparc64/socket.h b/include/asm-sparc64/socket.h index 865547a23908..59987dad3359 100644 --- a/include/asm-sparc64/socket.h +++ b/include/asm-sparc64/socket.h | |||
@@ -29,6 +29,8 @@ | |||
29 | 29 | ||
30 | #define SO_SNDBUF 0x1001 | 30 | #define SO_SNDBUF 0x1001 |
31 | #define SO_RCVBUF 0x1002 | 31 | #define SO_RCVBUF 0x1002 |
32 | #define SO_SNDBUFFORCE 0x100a | ||
33 | #define SO_RCVBUFFORCE 0x100b | ||
32 | #define SO_ERROR 0x1007 | 34 | #define SO_ERROR 0x1007 |
33 | #define SO_TYPE 0x1008 | 35 | #define SO_TYPE 0x1008 |
34 | 36 | ||
diff --git a/include/asm-v850/socket.h b/include/asm-v850/socket.h index 213b852af53e..0240d366a0a4 100644 --- a/include/asm-v850/socket.h +++ b/include/asm-v850/socket.h | |||
@@ -14,6 +14,8 @@ | |||
14 | #define SO_BROADCAST 6 | 14 | #define SO_BROADCAST 6 |
15 | #define SO_SNDBUF 7 | 15 | #define SO_SNDBUF 7 |
16 | #define SO_RCVBUF 8 | 16 | #define SO_RCVBUF 8 |
17 | #define SO_SNDBUFFORCE 32 | ||
18 | #define SO_RCVBUFFORCE 33 | ||
17 | #define SO_KEEPALIVE 9 | 19 | #define SO_KEEPALIVE 9 |
18 | #define SO_OOBINLINE 10 | 20 | #define SO_OOBINLINE 10 |
19 | #define SO_NO_CHECK 11 | 21 | #define SO_NO_CHECK 11 |
diff --git a/include/asm-x86_64/checksum.h b/include/asm-x86_64/checksum.h index d01356f01448..989469e8e0b7 100644 --- a/include/asm-x86_64/checksum.h +++ b/include/asm-x86_64/checksum.h | |||
@@ -64,7 +64,7 @@ static inline unsigned short ip_fast_csum(unsigned char *iph, unsigned int ihl) | |||
64 | " adcl $0, %0\n" | 64 | " adcl $0, %0\n" |
65 | " notl %0\n" | 65 | " notl %0\n" |
66 | "2:" | 66 | "2:" |
67 | /* Since the input registers which are loaded with iph and ipl | 67 | /* Since the input registers which are loaded with iph and ihl |
68 | are modified, we must also specify them as outputs, or gcc | 68 | are modified, we must also specify them as outputs, or gcc |
69 | will assume they contain their original values. */ | 69 | will assume they contain their original values. */ |
70 | : "=r" (sum), "=r" (iph), "=r" (ihl) | 70 | : "=r" (sum), "=r" (iph), "=r" (ihl) |
diff --git a/include/asm-x86_64/socket.h b/include/asm-x86_64/socket.h index d9a252ea8210..f2cdbeae5d5b 100644 --- a/include/asm-x86_64/socket.h +++ b/include/asm-x86_64/socket.h | |||
@@ -14,6 +14,8 @@ | |||
14 | #define SO_BROADCAST 6 | 14 | #define SO_BROADCAST 6 |
15 | #define SO_SNDBUF 7 | 15 | #define SO_SNDBUF 7 |
16 | #define SO_RCVBUF 8 | 16 | #define SO_RCVBUF 8 |
17 | #define SO_SNDBUFFORCE 32 | ||
18 | #define SO_RCVBUFFORCE 33 | ||
17 | #define SO_KEEPALIVE 9 | 19 | #define SO_KEEPALIVE 9 |
18 | #define SO_OOBINLINE 10 | 20 | #define SO_OOBINLINE 10 |
19 | #define SO_NO_CHECK 11 | 21 | #define SO_NO_CHECK 11 |
diff --git a/include/asm-xtensa/socket.h b/include/asm-xtensa/socket.h index daccd05a14cd..00f83f3a6d72 100644 --- a/include/asm-xtensa/socket.h +++ b/include/asm-xtensa/socket.h | |||
@@ -24,6 +24,8 @@ | |||
24 | #define SO_BROADCAST 6 | 24 | #define SO_BROADCAST 6 |
25 | #define SO_SNDBUF 7 | 25 | #define SO_SNDBUF 7 |
26 | #define SO_RCVBUF 8 | 26 | #define SO_RCVBUF 8 |
27 | #define SO_SNDBUFFORCE 32 | ||
28 | #define SO_RCVBUFFORCE 33 | ||
27 | #define SO_KEEPALIVE 9 | 29 | #define SO_KEEPALIVE 9 |
28 | #define SO_OOBINLINE 10 | 30 | #define SO_OOBINLINE 10 |
29 | #define SO_NO_CHECK 11 | 31 | #define SO_NO_CHECK 11 |
diff --git a/include/linux/dccp.h b/include/linux/dccp.h new file mode 100644 index 000000000000..007c290f74d4 --- /dev/null +++ b/include/linux/dccp.h | |||
@@ -0,0 +1,456 @@ | |||
1 | #ifndef _LINUX_DCCP_H | ||
2 | #define _LINUX_DCCP_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | #include <asm/byteorder.h> | ||
6 | |||
7 | /* Structure describing an Internet (DCCP) socket address. */ | ||
8 | struct sockaddr_dccp { | ||
9 | __u16 sdccp_family; /* Address family */ | ||
10 | __u16 sdccp_port; /* Port number */ | ||
11 | __u32 sdccp_addr; /* Internet address */ | ||
12 | __u32 sdccp_service; /* Service */ | ||
13 | /* Pad to size of `struct sockaddr': 16 bytes . */ | ||
14 | __u32 sdccp_pad; | ||
15 | }; | ||
16 | |||
17 | /** | ||
18 | * struct dccp_hdr - generic part of DCCP packet header | ||
19 | * | ||
20 | * @dccph_sport - Relevant port on the endpoint that sent this packet | ||
21 | * @dccph_dport - Relevant port on the other endpoint | ||
22 | * @dccph_doff - Data Offset from the start of the DCCP header, in 32-bit words | ||
23 | * @dccph_ccval - Used by the HC-Sender CCID | ||
24 | * @dccph_cscov - Parts of the packet that are covered by the Checksum field | ||
25 | * @dccph_checksum - Internet checksum, depends on dccph_cscov | ||
26 | * @dccph_x - 0 = 24 bit sequence number, 1 = 48 | ||
27 | * @dccph_type - packet type, see DCCP_PKT_ prefixed macros | ||
28 | * @dccph_seq - sequence number high or low order 24 bits, depends on dccph_x | ||
29 | */ | ||
30 | struct dccp_hdr { | ||
31 | __u16 dccph_sport, | ||
32 | dccph_dport; | ||
33 | __u8 dccph_doff; | ||
34 | #if defined(__LITTLE_ENDIAN_BITFIELD) | ||
35 | __u8 dccph_cscov:4, | ||
36 | dccph_ccval:4; | ||
37 | #elif defined(__BIG_ENDIAN_BITFIELD) | ||
38 | __u8 dccph_ccval:4, | ||
39 | dccph_cscov:4; | ||
40 | #else | ||
41 | #error "Adjust your <asm/byteorder.h> defines" | ||
42 | #endif | ||
43 | __u16 dccph_checksum; | ||
44 | #if defined(__LITTLE_ENDIAN_BITFIELD) | ||
45 | __u32 dccph_x:1, | ||
46 | dccph_type:4, | ||
47 | dccph_reserved:3, | ||
48 | dccph_seq:24; | ||
49 | #elif defined(__BIG_ENDIAN_BITFIELD) | ||
50 | __u32 dccph_reserved:3, | ||
51 | dccph_type:4, | ||
52 | dccph_x:1, | ||
53 | dccph_seq:24; | ||
54 | #else | ||
55 | #error "Adjust your <asm/byteorder.h> defines" | ||
56 | #endif | ||
57 | }; | ||
58 | |||
59 | /** | ||
60 | * struct dccp_hdr_ext - the low bits of a 48 bit seq packet | ||
61 | * | ||
62 | * @dccph_seq_low - low 24 bits of a 48 bit seq packet | ||
63 | */ | ||
64 | struct dccp_hdr_ext { | ||
65 | __u32 dccph_seq_low; | ||
66 | }; | ||
67 | |||
68 | /** | ||
69 | * struct dccp_hdr_request - Conection initiation request header | ||
70 | * | ||
71 | * @dccph_req_service - Service to which the client app wants to connect | ||
72 | * @dccph_req_options - list of options (must be a multiple of 32 bits | ||
73 | */ | ||
74 | struct dccp_hdr_request { | ||
75 | __u32 dccph_req_service; | ||
76 | }; | ||
77 | /** | ||
78 | * struct dccp_hdr_ack_bits - acknowledgment bits common to most packets | ||
79 | * | ||
80 | * @dccph_resp_ack_nr_high - 48 bit ack number high order bits, contains GSR | ||
81 | * @dccph_resp_ack_nr_low - 48 bit ack number low order bits, contains GSR | ||
82 | */ | ||
83 | struct dccp_hdr_ack_bits { | ||
84 | __u32 dccph_reserved1:8, | ||
85 | dccph_ack_nr_high:24; | ||
86 | __u32 dccph_ack_nr_low; | ||
87 | }; | ||
88 | /** | ||
89 | * struct dccp_hdr_response - Conection initiation response header | ||
90 | * | ||
91 | * @dccph_resp_ack_nr_high - 48 bit ack number high order bits, contains GSR | ||
92 | * @dccph_resp_ack_nr_low - 48 bit ack number low order bits, contains GSR | ||
93 | * @dccph_resp_service - Echoes the Service Code on a received DCCP-Request | ||
94 | * @dccph_resp_options - list of options (must be a multiple of 32 bits | ||
95 | */ | ||
96 | struct dccp_hdr_response { | ||
97 | struct dccp_hdr_ack_bits dccph_resp_ack; | ||
98 | __u32 dccph_resp_service; | ||
99 | }; | ||
100 | |||
101 | /** | ||
102 | * struct dccp_hdr_reset - Unconditionally shut down a connection | ||
103 | * | ||
104 | * @dccph_reset_service - Echoes the Service Code on a received DCCP-Request | ||
105 | * @dccph_reset_options - list of options (must be a multiple of 32 bits | ||
106 | */ | ||
107 | struct dccp_hdr_reset { | ||
108 | struct dccp_hdr_ack_bits dccph_reset_ack; | ||
109 | __u8 dccph_reset_code, | ||
110 | dccph_reset_data[3]; | ||
111 | }; | ||
112 | |||
113 | enum dccp_pkt_type { | ||
114 | DCCP_PKT_REQUEST = 0, | ||
115 | DCCP_PKT_RESPONSE, | ||
116 | DCCP_PKT_DATA, | ||
117 | DCCP_PKT_ACK, | ||
118 | DCCP_PKT_DATAACK, | ||
119 | DCCP_PKT_CLOSEREQ, | ||
120 | DCCP_PKT_CLOSE, | ||
121 | DCCP_PKT_RESET, | ||
122 | DCCP_PKT_SYNC, | ||
123 | DCCP_PKT_SYNCACK, | ||
124 | DCCP_PKT_INVALID, | ||
125 | }; | ||
126 | |||
127 | #define DCCP_NR_PKT_TYPES DCCP_PKT_INVALID | ||
128 | |||
129 | static inline unsigned int dccp_packet_hdr_len(const __u8 type) | ||
130 | { | ||
131 | if (type == DCCP_PKT_DATA) | ||
132 | return 0; | ||
133 | if (type == DCCP_PKT_DATAACK || | ||
134 | type == DCCP_PKT_ACK || | ||
135 | type == DCCP_PKT_SYNC || | ||
136 | type == DCCP_PKT_SYNCACK || | ||
137 | type == DCCP_PKT_CLOSE || | ||
138 | type == DCCP_PKT_CLOSEREQ) | ||
139 | return sizeof(struct dccp_hdr_ack_bits); | ||
140 | if (type == DCCP_PKT_REQUEST) | ||
141 | return sizeof(struct dccp_hdr_request); | ||
142 | if (type == DCCP_PKT_RESPONSE) | ||
143 | return sizeof(struct dccp_hdr_response); | ||
144 | return sizeof(struct dccp_hdr_reset); | ||
145 | } | ||
146 | enum dccp_reset_codes { | ||
147 | DCCP_RESET_CODE_UNSPECIFIED = 0, | ||
148 | DCCP_RESET_CODE_CLOSED, | ||
149 | DCCP_RESET_CODE_ABORTED, | ||
150 | DCCP_RESET_CODE_NO_CONNECTION, | ||
151 | DCCP_RESET_CODE_PACKET_ERROR, | ||
152 | DCCP_RESET_CODE_OPTION_ERROR, | ||
153 | DCCP_RESET_CODE_MANDATORY_ERROR, | ||
154 | DCCP_RESET_CODE_CONNECTION_REFUSED, | ||
155 | DCCP_RESET_CODE_BAD_SERVICE_CODE, | ||
156 | DCCP_RESET_CODE_TOO_BUSY, | ||
157 | DCCP_RESET_CODE_BAD_INIT_COOKIE, | ||
158 | DCCP_RESET_CODE_AGGRESSION_PENALTY, | ||
159 | }; | ||
160 | |||
161 | /* DCCP options */ | ||
162 | enum { | ||
163 | DCCPO_PADDING = 0, | ||
164 | DCCPO_MANDATORY = 1, | ||
165 | DCCPO_MIN_RESERVED = 3, | ||
166 | DCCPO_MAX_RESERVED = 31, | ||
167 | DCCPO_NDP_COUNT = 37, | ||
168 | DCCPO_ACK_VECTOR_0 = 38, | ||
169 | DCCPO_ACK_VECTOR_1 = 39, | ||
170 | DCCPO_TIMESTAMP = 41, | ||
171 | DCCPO_TIMESTAMP_ECHO = 42, | ||
172 | DCCPO_ELAPSED_TIME = 43, | ||
173 | DCCPO_MAX = 45, | ||
174 | DCCPO_MIN_CCID_SPECIFIC = 128, | ||
175 | DCCPO_MAX_CCID_SPECIFIC = 255, | ||
176 | }; | ||
177 | |||
178 | /* DCCP features */ | ||
179 | enum { | ||
180 | DCCPF_RESERVED = 0, | ||
181 | DCCPF_SEQUENCE_WINDOW = 3, | ||
182 | DCCPF_SEND_ACK_VECTOR = 6, | ||
183 | DCCPF_SEND_NDP_COUNT = 7, | ||
184 | /* 10-127 reserved */ | ||
185 | DCCPF_MIN_CCID_SPECIFIC = 128, | ||
186 | DCCPF_MAX_CCID_SPECIFIC = 255, | ||
187 | }; | ||
188 | |||
189 | /* DCCP socket options */ | ||
190 | #define DCCP_SOCKOPT_PACKET_SIZE 1 | ||
191 | |||
192 | #ifdef __KERNEL__ | ||
193 | |||
194 | #include <linux/in.h> | ||
195 | #include <linux/list.h> | ||
196 | #include <linux/uio.h> | ||
197 | #include <linux/workqueue.h> | ||
198 | |||
199 | #include <net/inet_connection_sock.h> | ||
200 | #include <net/inet_timewait_sock.h> | ||
201 | #include <net/sock.h> | ||
202 | #include <net/tcp_states.h> | ||
203 | #include <net/tcp.h> | ||
204 | |||
205 | enum dccp_state { | ||
206 | DCCP_OPEN = TCP_ESTABLISHED, | ||
207 | DCCP_REQUESTING = TCP_SYN_SENT, | ||
208 | DCCP_PARTOPEN = TCP_FIN_WAIT1, /* FIXME: | ||
209 | This mapping is horrible, but TCP has | ||
210 | no matching state for DCCP_PARTOPEN, | ||
211 | as TCP_SYN_RECV is already used by | ||
212 | DCCP_RESPOND, why don't stop using TCP | ||
213 | mapping of states? OK, now we don't use | ||
214 | sk_stream_sendmsg anymore, so doesn't | ||
215 | seem to exist any reason for us to | ||
216 | do the TCP mapping here */ | ||
217 | DCCP_LISTEN = TCP_LISTEN, | ||
218 | DCCP_RESPOND = TCP_SYN_RECV, | ||
219 | DCCP_CLOSING = TCP_CLOSING, | ||
220 | DCCP_TIME_WAIT = TCP_TIME_WAIT, | ||
221 | DCCP_CLOSED = TCP_CLOSE, | ||
222 | DCCP_MAX_STATES = TCP_MAX_STATES, | ||
223 | }; | ||
224 | |||
225 | #define DCCP_STATE_MASK 0xf | ||
226 | #define DCCP_ACTION_FIN (1<<7) | ||
227 | |||
228 | enum { | ||
229 | DCCPF_OPEN = TCPF_ESTABLISHED, | ||
230 | DCCPF_REQUESTING = TCPF_SYN_SENT, | ||
231 | DCCPF_PARTOPEN = TCPF_FIN_WAIT1, | ||
232 | DCCPF_LISTEN = TCPF_LISTEN, | ||
233 | DCCPF_RESPOND = TCPF_SYN_RECV, | ||
234 | DCCPF_CLOSING = TCPF_CLOSING, | ||
235 | DCCPF_TIME_WAIT = TCPF_TIME_WAIT, | ||
236 | DCCPF_CLOSED = TCPF_CLOSE, | ||
237 | }; | ||
238 | |||
239 | static inline struct dccp_hdr *dccp_hdr(const struct sk_buff *skb) | ||
240 | { | ||
241 | return (struct dccp_hdr *)skb->h.raw; | ||
242 | } | ||
243 | |||
244 | static inline struct dccp_hdr_ext *dccp_hdrx(const struct sk_buff *skb) | ||
245 | { | ||
246 | return (struct dccp_hdr_ext *)(skb->h.raw + sizeof(struct dccp_hdr)); | ||
247 | } | ||
248 | |||
249 | static inline unsigned int __dccp_basic_hdr_len(const struct dccp_hdr *dh) | ||
250 | { | ||
251 | return sizeof(*dh) + (dh->dccph_x ? sizeof(struct dccp_hdr_ext) : 0); | ||
252 | } | ||
253 | |||
254 | static inline unsigned int dccp_basic_hdr_len(const struct sk_buff *skb) | ||
255 | { | ||
256 | const struct dccp_hdr *dh = dccp_hdr(skb); | ||
257 | return __dccp_basic_hdr_len(dh); | ||
258 | } | ||
259 | |||
260 | static inline __u64 dccp_hdr_seq(const struct sk_buff *skb) | ||
261 | { | ||
262 | const struct dccp_hdr *dh = dccp_hdr(skb); | ||
263 | #if defined(__LITTLE_ENDIAN_BITFIELD) | ||
264 | __u64 seq_nr = ntohl(dh->dccph_seq << 8); | ||
265 | #elif defined(__BIG_ENDIAN_BITFIELD) | ||
266 | __u64 seq_nr = ntohl(dh->dccph_seq); | ||
267 | #else | ||
268 | #error "Adjust your <asm/byteorder.h> defines" | ||
269 | #endif | ||
270 | |||
271 | if (dh->dccph_x != 0) | ||
272 | seq_nr = (seq_nr << 32) + ntohl(dccp_hdrx(skb)->dccph_seq_low); | ||
273 | |||
274 | return seq_nr; | ||
275 | } | ||
276 | |||
277 | static inline struct dccp_hdr_request *dccp_hdr_request(struct sk_buff *skb) | ||
278 | { | ||
279 | return (struct dccp_hdr_request *)(skb->h.raw + dccp_basic_hdr_len(skb)); | ||
280 | } | ||
281 | |||
282 | static inline struct dccp_hdr_ack_bits *dccp_hdr_ack_bits(const struct sk_buff *skb) | ||
283 | { | ||
284 | return (struct dccp_hdr_ack_bits *)(skb->h.raw + dccp_basic_hdr_len(skb)); | ||
285 | } | ||
286 | |||
287 | static inline u64 dccp_hdr_ack_seq(const struct sk_buff *skb) | ||
288 | { | ||
289 | const struct dccp_hdr_ack_bits *dhack = dccp_hdr_ack_bits(skb); | ||
290 | #if defined(__LITTLE_ENDIAN_BITFIELD) | ||
291 | return (((u64)ntohl(dhack->dccph_ack_nr_high << 8)) << 32) + ntohl(dhack->dccph_ack_nr_low); | ||
292 | #elif defined(__BIG_ENDIAN_BITFIELD) | ||
293 | return (((u64)ntohl(dhack->dccph_ack_nr_high)) << 32) + ntohl(dhack->dccph_ack_nr_low); | ||
294 | #else | ||
295 | #error "Adjust your <asm/byteorder.h> defines" | ||
296 | #endif | ||
297 | } | ||
298 | |||
299 | static inline struct dccp_hdr_response *dccp_hdr_response(struct sk_buff *skb) | ||
300 | { | ||
301 | return (struct dccp_hdr_response *)(skb->h.raw + dccp_basic_hdr_len(skb)); | ||
302 | } | ||
303 | |||
304 | static inline struct dccp_hdr_reset *dccp_hdr_reset(struct sk_buff *skb) | ||
305 | { | ||
306 | return (struct dccp_hdr_reset *)(skb->h.raw + dccp_basic_hdr_len(skb)); | ||
307 | } | ||
308 | |||
309 | static inline unsigned int __dccp_hdr_len(const struct dccp_hdr *dh) | ||
310 | { | ||
311 | return __dccp_basic_hdr_len(dh) + | ||
312 | dccp_packet_hdr_len(dh->dccph_type); | ||
313 | } | ||
314 | |||
315 | static inline unsigned int dccp_hdr_len(const struct sk_buff *skb) | ||
316 | { | ||
317 | return __dccp_hdr_len(dccp_hdr(skb)); | ||
318 | } | ||
319 | |||
320 | |||
321 | /* initial values for each feature */ | ||
322 | #define DCCPF_INITIAL_SEQUENCE_WINDOW 100 | ||
323 | /* FIXME: for now we're using CCID 3 (TFRC) */ | ||
324 | #define DCCPF_INITIAL_CCID 3 | ||
325 | #define DCCPF_INITIAL_SEND_ACK_VECTOR 0 | ||
326 | /* FIXME: for now we're default to 1 but it should really be 0 */ | ||
327 | #define DCCPF_INITIAL_SEND_NDP_COUNT 1 | ||
328 | |||
329 | #define DCCP_NDP_LIMIT 0xFFFFFF | ||
330 | |||
331 | /** | ||
332 | * struct dccp_options - option values for a DCCP connection | ||
333 | * @dccpo_sequence_window - Sequence Window Feature (section 7.5.2) | ||
334 | * @dccpo_ccid - Congestion Control Id (CCID) (section 10) | ||
335 | * @dccpo_send_ack_vector - Send Ack Vector Feature (section 11.5) | ||
336 | * @dccpo_send_ndp_count - Send NDP Count Feature (7.7.2) | ||
337 | */ | ||
338 | struct dccp_options { | ||
339 | __u64 dccpo_sequence_window; | ||
340 | __u8 dccpo_ccid; | ||
341 | __u8 dccpo_send_ack_vector; | ||
342 | __u8 dccpo_send_ndp_count; | ||
343 | }; | ||
344 | |||
345 | extern void __dccp_options_init(struct dccp_options *dccpo); | ||
346 | extern void dccp_options_init(struct dccp_options *dccpo); | ||
347 | extern int dccp_parse_options(struct sock *sk, struct sk_buff *skb); | ||
348 | |||
349 | struct dccp_request_sock { | ||
350 | struct inet_request_sock dreq_inet_rsk; | ||
351 | __u64 dreq_iss; | ||
352 | __u64 dreq_isr; | ||
353 | __u32 dreq_service; | ||
354 | }; | ||
355 | |||
356 | static inline struct dccp_request_sock *dccp_rsk(const struct request_sock *req) | ||
357 | { | ||
358 | return (struct dccp_request_sock *)req; | ||
359 | } | ||
360 | |||
361 | extern struct inet_timewait_death_row dccp_death_row; | ||
362 | |||
363 | /* Read about the ECN nonce to see why it is 253 */ | ||
364 | #define DCCP_MAX_ACK_VECTOR_LEN 253 | ||
365 | |||
366 | struct dccp_options_received { | ||
367 | u32 dccpor_ndp:24, | ||
368 | dccpor_ack_vector_len:8; | ||
369 | u32 dccpor_ack_vector_idx:10; | ||
370 | /* 22 bits hole, try to pack */ | ||
371 | u32 dccpor_timestamp; | ||
372 | u32 dccpor_timestamp_echo; | ||
373 | u32 dccpor_elapsed_time; | ||
374 | }; | ||
375 | |||
376 | struct ccid; | ||
377 | |||
378 | enum dccp_role { | ||
379 | DCCP_ROLE_UNDEFINED, | ||
380 | DCCP_ROLE_LISTEN, | ||
381 | DCCP_ROLE_CLIENT, | ||
382 | DCCP_ROLE_SERVER, | ||
383 | }; | ||
384 | |||
385 | /** | ||
386 | * struct dccp_sock - DCCP socket state | ||
387 | * | ||
388 | * @dccps_swl - sequence number window low | ||
389 | * @dccps_swh - sequence number window high | ||
390 | * @dccps_awl - acknowledgement number window low | ||
391 | * @dccps_awh - acknowledgement number window high | ||
392 | * @dccps_iss - initial sequence number sent | ||
393 | * @dccps_isr - initial sequence number received | ||
394 | * @dccps_osr - first OPEN sequence number received | ||
395 | * @dccps_gss - greatest sequence number sent | ||
396 | * @dccps_gsr - greatest valid sequence number received | ||
397 | * @dccps_gar - greatest valid ack number received on a non-Sync; initialized to %dccps_iss | ||
398 | * @dccps_timestamp_time - time of latest TIMESTAMP option | ||
399 | * @dccps_timestamp_echo - latest timestamp received on a TIMESTAMP option | ||
400 | * @dccps_ext_header_len - network protocol overhead (IP/IPv6 options) | ||
401 | * @dccps_pmtu_cookie - Last pmtu seen by socket | ||
402 | * @dccps_packet_size - Set thru setsockopt | ||
403 | * @dccps_role - Role of this sock, one of %dccp_role | ||
404 | * @dccps_ndp_count - number of Non Data Packets since last data packet | ||
405 | * @dccps_hc_rx_ackpkts - receiver half connection acked packets | ||
406 | */ | ||
407 | struct dccp_sock { | ||
408 | /* inet_connection_sock has to be the first member of dccp_sock */ | ||
409 | struct inet_connection_sock dccps_inet_connection; | ||
410 | __u64 dccps_swl; | ||
411 | __u64 dccps_swh; | ||
412 | __u64 dccps_awl; | ||
413 | __u64 dccps_awh; | ||
414 | __u64 dccps_iss; | ||
415 | __u64 dccps_isr; | ||
416 | __u64 dccps_osr; | ||
417 | __u64 dccps_gss; | ||
418 | __u64 dccps_gsr; | ||
419 | __u64 dccps_gar; | ||
420 | unsigned long dccps_service; | ||
421 | struct timeval dccps_timestamp_time; | ||
422 | __u32 dccps_timestamp_echo; | ||
423 | __u32 dccps_packet_size; | ||
424 | unsigned long dccps_ndp_count; | ||
425 | __u16 dccps_ext_header_len; | ||
426 | __u32 dccps_pmtu_cookie; | ||
427 | __u32 dccps_mss_cache; | ||
428 | struct dccp_options dccps_options; | ||
429 | struct dccp_ackpkts *dccps_hc_rx_ackpkts; | ||
430 | void *dccps_hc_rx_ccid_private; | ||
431 | void *dccps_hc_tx_ccid_private; | ||
432 | struct ccid *dccps_hc_rx_ccid; | ||
433 | struct ccid *dccps_hc_tx_ccid; | ||
434 | struct dccp_options_received dccps_options_received; | ||
435 | enum dccp_role dccps_role:2; | ||
436 | }; | ||
437 | |||
438 | static inline struct dccp_sock *dccp_sk(const struct sock *sk) | ||
439 | { | ||
440 | return (struct dccp_sock *)sk; | ||
441 | } | ||
442 | |||
443 | static inline const char *dccp_role(const struct sock *sk) | ||
444 | { | ||
445 | switch (dccp_sk(sk)->dccps_role) { | ||
446 | case DCCP_ROLE_UNDEFINED: return "undefined"; | ||
447 | case DCCP_ROLE_LISTEN: return "listen"; | ||
448 | case DCCP_ROLE_SERVER: return "server"; | ||
449 | case DCCP_ROLE_CLIENT: return "client"; | ||
450 | } | ||
451 | return NULL; | ||
452 | } | ||
453 | |||
454 | #endif /* __KERNEL__ */ | ||
455 | |||
456 | #endif /* _LINUX_DCCP_H */ | ||
diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h index d7021c391b2b..ed1440ea4c91 100644 --- a/include/linux/ethtool.h +++ b/include/linux/ethtool.h | |||
@@ -250,6 +250,12 @@ struct ethtool_stats { | |||
250 | u64 data[0]; | 250 | u64 data[0]; |
251 | }; | 251 | }; |
252 | 252 | ||
253 | struct ethtool_perm_addr { | ||
254 | u32 cmd; /* ETHTOOL_GPERMADDR */ | ||
255 | u32 size; | ||
256 | u8 data[0]; | ||
257 | }; | ||
258 | |||
253 | struct net_device; | 259 | struct net_device; |
254 | 260 | ||
255 | /* Some generic methods drivers may use in their ethtool_ops */ | 261 | /* Some generic methods drivers may use in their ethtool_ops */ |
@@ -261,6 +267,8 @@ u32 ethtool_op_get_sg(struct net_device *dev); | |||
261 | int ethtool_op_set_sg(struct net_device *dev, u32 data); | 267 | int ethtool_op_set_sg(struct net_device *dev, u32 data); |
262 | u32 ethtool_op_get_tso(struct net_device *dev); | 268 | u32 ethtool_op_get_tso(struct net_device *dev); |
263 | int ethtool_op_set_tso(struct net_device *dev, u32 data); | 269 | int ethtool_op_set_tso(struct net_device *dev, u32 data); |
270 | int ethtool_op_get_perm_addr(struct net_device *dev, | ||
271 | struct ethtool_perm_addr *addr, u8 *data); | ||
264 | 272 | ||
265 | /** | 273 | /** |
266 | * ðtool_ops - Alter and report network device settings | 274 | * ðtool_ops - Alter and report network device settings |
@@ -294,7 +302,8 @@ int ethtool_op_set_tso(struct net_device *dev, u32 data); | |||
294 | * get_strings: Return a set of strings that describe the requested objects | 302 | * get_strings: Return a set of strings that describe the requested objects |
295 | * phys_id: Identify the device | 303 | * phys_id: Identify the device |
296 | * get_stats: Return statistics about the device | 304 | * get_stats: Return statistics about the device |
297 | * | 305 | * get_perm_addr: Gets the permanent hardware address |
306 | * | ||
298 | * Description: | 307 | * Description: |
299 | * | 308 | * |
300 | * get_settings: | 309 | * get_settings: |
@@ -352,6 +361,7 @@ struct ethtool_ops { | |||
352 | int (*phys_id)(struct net_device *, u32); | 361 | int (*phys_id)(struct net_device *, u32); |
353 | int (*get_stats_count)(struct net_device *); | 362 | int (*get_stats_count)(struct net_device *); |
354 | void (*get_ethtool_stats)(struct net_device *, struct ethtool_stats *, u64 *); | 363 | void (*get_ethtool_stats)(struct net_device *, struct ethtool_stats *, u64 *); |
364 | int (*get_perm_addr)(struct net_device *, struct ethtool_perm_addr *, u8 *); | ||
355 | int (*begin)(struct net_device *); | 365 | int (*begin)(struct net_device *); |
356 | void (*complete)(struct net_device *); | 366 | void (*complete)(struct net_device *); |
357 | }; | 367 | }; |
@@ -389,6 +399,7 @@ struct ethtool_ops { | |||
389 | #define ETHTOOL_GSTATS 0x0000001d /* get NIC-specific statistics */ | 399 | #define ETHTOOL_GSTATS 0x0000001d /* get NIC-specific statistics */ |
390 | #define ETHTOOL_GTSO 0x0000001e /* Get TSO enable (ethtool_value) */ | 400 | #define ETHTOOL_GTSO 0x0000001e /* Get TSO enable (ethtool_value) */ |
391 | #define ETHTOOL_STSO 0x0000001f /* Set TSO enable (ethtool_value) */ | 401 | #define ETHTOOL_STSO 0x0000001f /* Set TSO enable (ethtool_value) */ |
402 | #define ETHTOOL_GPERMADDR 0x00000020 /* Get permanent hardware address */ | ||
392 | 403 | ||
393 | /* compatibility with older code */ | 404 | /* compatibility with older code */ |
394 | #define SPARC_ETH_GSET ETHTOOL_GSET | 405 | #define SPARC_ETH_GSET ETHTOOL_GSET |
diff --git a/include/linux/hippidevice.h b/include/linux/hippidevice.h index 9debe6bbe5f0..bab303dafd6e 100644 --- a/include/linux/hippidevice.h +++ b/include/linux/hippidevice.h | |||
@@ -26,8 +26,12 @@ | |||
26 | #include <linux/if_hippi.h> | 26 | #include <linux/if_hippi.h> |
27 | 27 | ||
28 | #ifdef __KERNEL__ | 28 | #ifdef __KERNEL__ |
29 | extern unsigned short hippi_type_trans(struct sk_buff *skb, | 29 | |
30 | struct net_device *dev); | 30 | struct hippi_cb { |
31 | __u32 ifield; | ||
32 | }; | ||
33 | |||
34 | extern __be16 hippi_type_trans(struct sk_buff *skb, struct net_device *dev); | ||
31 | 35 | ||
32 | extern struct net_device *alloc_hippi_dev(int sizeof_priv); | 36 | extern struct net_device *alloc_hippi_dev(int sizeof_priv); |
33 | #endif | 37 | #endif |
diff --git a/include/linux/if_ether.h b/include/linux/if_ether.h index b5b58e9c054c..fc2d4c8225aa 100644 --- a/include/linux/if_ether.h +++ b/include/linux/if_ether.h | |||
@@ -110,6 +110,8 @@ static inline struct ethhdr *eth_hdr(const struct sk_buff *skb) | |||
110 | { | 110 | { |
111 | return (struct ethhdr *)skb->mac.raw; | 111 | return (struct ethhdr *)skb->mac.raw; |
112 | } | 112 | } |
113 | |||
114 | extern struct ctl_table ether_table[]; | ||
113 | #endif | 115 | #endif |
114 | 116 | ||
115 | #endif /* _LINUX_IF_ETHER_H */ | 117 | #endif /* _LINUX_IF_ETHER_H */ |
diff --git a/include/linux/if_fc.h b/include/linux/if_fc.h index 33330b458b95..376a34ea4723 100644 --- a/include/linux/if_fc.h +++ b/include/linux/if_fc.h | |||
@@ -44,7 +44,7 @@ struct fcllc { | |||
44 | __u8 ssap; /* source SAP */ | 44 | __u8 ssap; /* source SAP */ |
45 | __u8 llc; /* LLC control field */ | 45 | __u8 llc; /* LLC control field */ |
46 | __u8 protid[3]; /* protocol id */ | 46 | __u8 protid[3]; /* protocol id */ |
47 | __u16 ethertype; /* ether type field */ | 47 | __be16 ethertype; /* ether type field */ |
48 | }; | 48 | }; |
49 | 49 | ||
50 | #endif /* _LINUX_IF_FC_H */ | 50 | #endif /* _LINUX_IF_FC_H */ |
diff --git a/include/linux/if_fddi.h b/include/linux/if_fddi.h index a912818e6361..1288a161bc0b 100644 --- a/include/linux/if_fddi.h +++ b/include/linux/if_fddi.h | |||
@@ -85,7 +85,7 @@ struct fddi_snap_hdr | |||
85 | __u8 ssap; /* always 0xAA */ | 85 | __u8 ssap; /* always 0xAA */ |
86 | __u8 ctrl; /* always 0x03 */ | 86 | __u8 ctrl; /* always 0x03 */ |
87 | __u8 oui[FDDI_K_OUI_LEN]; /* organizational universal id */ | 87 | __u8 oui[FDDI_K_OUI_LEN]; /* organizational universal id */ |
88 | __u16 ethertype; /* packet type ID field */ | 88 | __be16 ethertype; /* packet type ID field */ |
89 | } __attribute__ ((packed)); | 89 | } __attribute__ ((packed)); |
90 | 90 | ||
91 | /* Define FDDI LLC frame header */ | 91 | /* Define FDDI LLC frame header */ |
diff --git a/include/linux/if_frad.h b/include/linux/if_frad.h index 3c94b1736570..511999c7eeda 100644 --- a/include/linux/if_frad.h +++ b/include/linux/if_frad.h | |||
@@ -191,10 +191,12 @@ struct frad_local | |||
191 | int buffer; /* current buffer for S508 firmware */ | 191 | int buffer; /* current buffer for S508 firmware */ |
192 | }; | 192 | }; |
193 | 193 | ||
194 | extern void dlci_ioctl_set(int (*hook)(unsigned int, void __user *)); | ||
195 | |||
196 | #endif /* __KERNEL__ */ | 194 | #endif /* __KERNEL__ */ |
197 | 195 | ||
198 | #endif /* CONFIG_DLCI || CONFIG_DLCI_MODULE */ | 196 | #endif /* CONFIG_DLCI || CONFIG_DLCI_MODULE */ |
199 | 197 | ||
198 | #ifdef __KERNEL__ | ||
199 | extern void dlci_ioctl_set(int (*hook)(unsigned int, void __user *)); | ||
200 | #endif | ||
201 | |||
200 | #endif | 202 | #endif |
diff --git a/include/linux/if_hippi.h b/include/linux/if_hippi.h index c8ca72c46f76..94d31ca7d71a 100644 --- a/include/linux/if_hippi.h +++ b/include/linux/if_hippi.h | |||
@@ -102,9 +102,9 @@ struct hippi_fp_hdr | |||
102 | #error "Please fix <asm/byteorder.h>" | 102 | #error "Please fix <asm/byteorder.h>" |
103 | #endif | 103 | #endif |
104 | #else | 104 | #else |
105 | __u32 fixed; | 105 | __be32 fixed; |
106 | #endif | 106 | #endif |
107 | __u32 d2_size; | 107 | __be32 d2_size; |
108 | } __attribute__ ((packed)); | 108 | } __attribute__ ((packed)); |
109 | 109 | ||
110 | struct hippi_le_hdr | 110 | struct hippi_le_hdr |
@@ -144,7 +144,7 @@ struct hippi_snap_hdr | |||
144 | __u8 ssap; /* always 0xAA */ | 144 | __u8 ssap; /* always 0xAA */ |
145 | __u8 ctrl; /* always 0x03 */ | 145 | __u8 ctrl; /* always 0x03 */ |
146 | __u8 oui[HIPPI_OUI_LEN]; /* organizational universal id (zero)*/ | 146 | __u8 oui[HIPPI_OUI_LEN]; /* organizational universal id (zero)*/ |
147 | __u16 ethertype; /* packet type ID field */ | 147 | __be16 ethertype; /* packet type ID field */ |
148 | } __attribute__ ((packed)); | 148 | } __attribute__ ((packed)); |
149 | 149 | ||
150 | struct hippi_hdr | 150 | struct hippi_hdr |
diff --git a/include/linux/if_tr.h b/include/linux/if_tr.h index 3fba9e2f5427..5502f597cf0e 100644 --- a/include/linux/if_tr.h +++ b/include/linux/if_tr.h | |||
@@ -43,12 +43,16 @@ struct trh_hdr { | |||
43 | }; | 43 | }; |
44 | 44 | ||
45 | #ifdef __KERNEL__ | 45 | #ifdef __KERNEL__ |
46 | #include <linux/config.h> | ||
46 | #include <linux/skbuff.h> | 47 | #include <linux/skbuff.h> |
47 | 48 | ||
48 | static inline struct trh_hdr *tr_hdr(const struct sk_buff *skb) | 49 | static inline struct trh_hdr *tr_hdr(const struct sk_buff *skb) |
49 | { | 50 | { |
50 | return (struct trh_hdr *)skb->mac.raw; | 51 | return (struct trh_hdr *)skb->mac.raw; |
51 | } | 52 | } |
53 | #ifdef CONFIG_SYSCTL | ||
54 | extern struct ctl_table tr_table[]; | ||
55 | #endif | ||
52 | #endif | 56 | #endif |
53 | 57 | ||
54 | /* This is an Token-Ring LLC structure */ | 58 | /* This is an Token-Ring LLC structure */ |
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index 62a9d89dfbe2..17d0c0d40b0e 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h | |||
@@ -155,7 +155,6 @@ static inline int __vlan_hwaccel_rx(struct sk_buff *skb, | |||
155 | { | 155 | { |
156 | struct net_device_stats *stats; | 156 | struct net_device_stats *stats; |
157 | 157 | ||
158 | skb->real_dev = skb->dev; | ||
159 | skb->dev = grp->vlan_devices[vlan_tag & VLAN_VID_MASK]; | 158 | skb->dev = grp->vlan_devices[vlan_tag & VLAN_VID_MASK]; |
160 | if (skb->dev == NULL) { | 159 | if (skb->dev == NULL) { |
161 | dev_kfree_skb_any(skb); | 160 | dev_kfree_skb_any(skb); |
diff --git a/include/linux/igmp.h b/include/linux/igmp.h index 0c31ef0b5bad..28f4f3b36950 100644 --- a/include/linux/igmp.h +++ b/include/linux/igmp.h | |||
@@ -129,6 +129,9 @@ struct igmpv3_query { | |||
129 | #include <linux/skbuff.h> | 129 | #include <linux/skbuff.h> |
130 | #include <linux/in.h> | 130 | #include <linux/in.h> |
131 | 131 | ||
132 | extern int sysctl_igmp_max_memberships; | ||
133 | extern int sysctl_igmp_max_msf; | ||
134 | |||
132 | struct ip_sf_socklist | 135 | struct ip_sf_socklist |
133 | { | 136 | { |
134 | unsigned int sl_max; | 137 | unsigned int sl_max; |
diff --git a/include/linux/in.h b/include/linux/in.h index fb88c66d748d..ba355384016a 100644 --- a/include/linux/in.h +++ b/include/linux/in.h | |||
@@ -32,6 +32,7 @@ enum { | |||
32 | IPPROTO_PUP = 12, /* PUP protocol */ | 32 | IPPROTO_PUP = 12, /* PUP protocol */ |
33 | IPPROTO_UDP = 17, /* User Datagram Protocol */ | 33 | IPPROTO_UDP = 17, /* User Datagram Protocol */ |
34 | IPPROTO_IDP = 22, /* XNS IDP protocol */ | 34 | IPPROTO_IDP = 22, /* XNS IDP protocol */ |
35 | IPPROTO_DCCP = 33, /* Datagram Congestion Control Protocol */ | ||
35 | IPPROTO_RSVP = 46, /* RSVP protocol */ | 36 | IPPROTO_RSVP = 46, /* RSVP protocol */ |
36 | IPPROTO_GRE = 47, /* Cisco GRE tunnels (rfc 1701,1702) */ | 37 | IPPROTO_GRE = 47, /* Cisco GRE tunnels (rfc 1701,1702) */ |
37 | 38 | ||
diff --git a/include/linux/inet_diag.h b/include/linux/inet_diag.h new file mode 100644 index 000000000000..a4606e5810e5 --- /dev/null +++ b/include/linux/inet_diag.h | |||
@@ -0,0 +1,138 @@ | |||
1 | #ifndef _INET_DIAG_H_ | ||
2 | #define _INET_DIAG_H_ 1 | ||
3 | |||
4 | /* Just some random number */ | ||
5 | #define TCPDIAG_GETSOCK 18 | ||
6 | #define DCCPDIAG_GETSOCK 19 | ||
7 | |||
8 | #define INET_DIAG_GETSOCK_MAX 24 | ||
9 | |||
10 | /* Socket identity */ | ||
11 | struct inet_diag_sockid { | ||
12 | __u16 idiag_sport; | ||
13 | __u16 idiag_dport; | ||
14 | __u32 idiag_src[4]; | ||
15 | __u32 idiag_dst[4]; | ||
16 | __u32 idiag_if; | ||
17 | __u32 idiag_cookie[2]; | ||
18 | #define INET_DIAG_NOCOOKIE (~0U) | ||
19 | }; | ||
20 | |||
21 | /* Request structure */ | ||
22 | |||
23 | struct inet_diag_req { | ||
24 | __u8 idiag_family; /* Family of addresses. */ | ||
25 | __u8 idiag_src_len; | ||
26 | __u8 idiag_dst_len; | ||
27 | __u8 idiag_ext; /* Query extended information */ | ||
28 | |||
29 | struct inet_diag_sockid id; | ||
30 | |||
31 | __u32 idiag_states; /* States to dump */ | ||
32 | __u32 idiag_dbs; /* Tables to dump (NI) */ | ||
33 | }; | ||
34 | |||
35 | enum { | ||
36 | INET_DIAG_REQ_NONE, | ||
37 | INET_DIAG_REQ_BYTECODE, | ||
38 | }; | ||
39 | |||
40 | #define INET_DIAG_REQ_MAX INET_DIAG_REQ_BYTECODE | ||
41 | |||
42 | /* Bytecode is sequence of 4 byte commands followed by variable arguments. | ||
43 | * All the commands identified by "code" are conditional jumps forward: | ||
44 | * to offset cc+"yes" or to offset cc+"no". "yes" is supposed to be | ||
45 | * length of the command and its arguments. | ||
46 | */ | ||
47 | |||
48 | struct inet_diag_bc_op { | ||
49 | unsigned char code; | ||
50 | unsigned char yes; | ||
51 | unsigned short no; | ||
52 | }; | ||
53 | |||
54 | enum { | ||
55 | INET_DIAG_BC_NOP, | ||
56 | INET_DIAG_BC_JMP, | ||
57 | INET_DIAG_BC_S_GE, | ||
58 | INET_DIAG_BC_S_LE, | ||
59 | INET_DIAG_BC_D_GE, | ||
60 | INET_DIAG_BC_D_LE, | ||
61 | INET_DIAG_BC_AUTO, | ||
62 | INET_DIAG_BC_S_COND, | ||
63 | INET_DIAG_BC_D_COND, | ||
64 | }; | ||
65 | |||
66 | struct inet_diag_hostcond { | ||
67 | __u8 family; | ||
68 | __u8 prefix_len; | ||
69 | int port; | ||
70 | __u32 addr[0]; | ||
71 | }; | ||
72 | |||
73 | /* Base info structure. It contains socket identity (addrs/ports/cookie) | ||
74 | * and, alas, the information shown by netstat. */ | ||
75 | struct inet_diag_msg { | ||
76 | __u8 idiag_family; | ||
77 | __u8 idiag_state; | ||
78 | __u8 idiag_timer; | ||
79 | __u8 idiag_retrans; | ||
80 | |||
81 | struct inet_diag_sockid id; | ||
82 | |||
83 | __u32 idiag_expires; | ||
84 | __u32 idiag_rqueue; | ||
85 | __u32 idiag_wqueue; | ||
86 | __u32 idiag_uid; | ||
87 | __u32 idiag_inode; | ||
88 | }; | ||
89 | |||
90 | /* Extensions */ | ||
91 | |||
92 | enum { | ||
93 | INET_DIAG_NONE, | ||
94 | INET_DIAG_MEMINFO, | ||
95 | INET_DIAG_INFO, | ||
96 | INET_DIAG_VEGASINFO, | ||
97 | INET_DIAG_CONG, | ||
98 | }; | ||
99 | |||
100 | #define INET_DIAG_MAX INET_DIAG_CONG | ||
101 | |||
102 | |||
103 | /* INET_DIAG_MEM */ | ||
104 | |||
105 | struct inet_diag_meminfo { | ||
106 | __u32 idiag_rmem; | ||
107 | __u32 idiag_wmem; | ||
108 | __u32 idiag_fmem; | ||
109 | __u32 idiag_tmem; | ||
110 | }; | ||
111 | |||
112 | /* INET_DIAG_VEGASINFO */ | ||
113 | |||
114 | struct tcpvegas_info { | ||
115 | __u32 tcpv_enabled; | ||
116 | __u32 tcpv_rttcnt; | ||
117 | __u32 tcpv_rtt; | ||
118 | __u32 tcpv_minrtt; | ||
119 | }; | ||
120 | |||
121 | #ifdef __KERNEL__ | ||
122 | struct sock; | ||
123 | struct inet_hashinfo; | ||
124 | |||
125 | struct inet_diag_handler { | ||
126 | struct inet_hashinfo *idiag_hashinfo; | ||
127 | void (*idiag_get_info)(struct sock *sk, | ||
128 | struct inet_diag_msg *r, | ||
129 | void *info); | ||
130 | __u16 idiag_info_size; | ||
131 | __u16 idiag_type; | ||
132 | }; | ||
133 | |||
134 | extern int inet_diag_register(const struct inet_diag_handler *handler); | ||
135 | extern void inet_diag_unregister(const struct inet_diag_handler *handler); | ||
136 | #endif /* __KERNEL__ */ | ||
137 | |||
138 | #endif /* _INET_DIAG_H_ */ | ||
diff --git a/include/linux/ip.h b/include/linux/ip.h index 31e7cedd9f84..33e8a19a1a0f 100644 --- a/include/linux/ip.h +++ b/include/linux/ip.h | |||
@@ -196,6 +196,8 @@ static inline void inet_sk_copy_descendant(struct sock *sk_to, | |||
196 | #endif | 196 | #endif |
197 | #endif | 197 | #endif |
198 | 198 | ||
199 | extern int inet_sk_rebuild_header(struct sock *sk); | ||
200 | |||
199 | struct iphdr { | 201 | struct iphdr { |
200 | #if defined(__LITTLE_ENDIAN_BITFIELD) | 202 | #if defined(__LITTLE_ENDIAN_BITFIELD) |
201 | __u8 ihl:4, | 203 | __u8 ihl:4, |
diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index 6fcd6a0ade24..3c7dbc6a0a70 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h | |||
@@ -193,6 +193,11 @@ struct inet6_skb_parm { | |||
193 | 193 | ||
194 | #define IP6CB(skb) ((struct inet6_skb_parm*)((skb)->cb)) | 194 | #define IP6CB(skb) ((struct inet6_skb_parm*)((skb)->cb)) |
195 | 195 | ||
196 | static inline int inet6_iif(const struct sk_buff *skb) | ||
197 | { | ||
198 | return IP6CB(skb)->iif; | ||
199 | } | ||
200 | |||
196 | struct tcp6_request_sock { | 201 | struct tcp6_request_sock { |
197 | struct tcp_request_sock req; | 202 | struct tcp_request_sock req; |
198 | struct in6_addr loc_addr; | 203 | struct in6_addr loc_addr; |
@@ -308,6 +313,36 @@ static inline void inet_sk_copy_descendant(struct sock *sk_to, | |||
308 | 313 | ||
309 | #define __ipv6_only_sock(sk) (inet6_sk(sk)->ipv6only) | 314 | #define __ipv6_only_sock(sk) (inet6_sk(sk)->ipv6only) |
310 | #define ipv6_only_sock(sk) ((sk)->sk_family == PF_INET6 && __ipv6_only_sock(sk)) | 315 | #define ipv6_only_sock(sk) ((sk)->sk_family == PF_INET6 && __ipv6_only_sock(sk)) |
316 | |||
317 | #include <linux/tcp.h> | ||
318 | |||
319 | struct tcp6_timewait_sock { | ||
320 | struct tcp_timewait_sock tw_v6_sk; | ||
321 | struct in6_addr tw_v6_daddr; | ||
322 | struct in6_addr tw_v6_rcv_saddr; | ||
323 | }; | ||
324 | |||
325 | static inline struct tcp6_timewait_sock *tcp6_twsk(const struct sock *sk) | ||
326 | { | ||
327 | return (struct tcp6_timewait_sock *)sk; | ||
328 | } | ||
329 | |||
330 | static inline struct in6_addr *__tcp_v6_rcv_saddr(const struct sock *sk) | ||
331 | { | ||
332 | return likely(sk->sk_state != TCP_TIME_WAIT) ? | ||
333 | &inet6_sk(sk)->rcv_saddr : &tcp6_twsk(sk)->tw_v6_rcv_saddr; | ||
334 | } | ||
335 | |||
336 | static inline struct in6_addr *tcp_v6_rcv_saddr(const struct sock *sk) | ||
337 | { | ||
338 | return sk->sk_family == AF_INET6 ? __tcp_v6_rcv_saddr(sk) : NULL; | ||
339 | } | ||
340 | |||
341 | static inline int inet_v6_ipv6only(const struct sock *sk) | ||
342 | { | ||
343 | return likely(sk->sk_state != TCP_TIME_WAIT) ? | ||
344 | ipv6_only_sock(sk) : inet_twsk(sk)->tw_ipv6only; | ||
345 | } | ||
311 | #else | 346 | #else |
312 | #define __ipv6_only_sock(sk) 0 | 347 | #define __ipv6_only_sock(sk) 0 |
313 | #define ipv6_only_sock(sk) 0 | 348 | #define ipv6_only_sock(sk) 0 |
@@ -322,8 +357,19 @@ static inline struct raw6_sock *raw6_sk(const struct sock *sk) | |||
322 | return NULL; | 357 | return NULL; |
323 | } | 358 | } |
324 | 359 | ||
325 | #endif | 360 | #define __tcp_v6_rcv_saddr(__sk) NULL |
361 | #define tcp_v6_rcv_saddr(__sk) NULL | ||
362 | #define tcp_twsk_ipv6only(__sk) 0 | ||
363 | #define inet_v6_ipv6only(__sk) 0 | ||
364 | #endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */ | ||
326 | 365 | ||
327 | #endif | 366 | #define INET6_MATCH(__sk, __saddr, __daddr, __ports, __dif) \ |
367 | (((*((__u32 *)&(inet_sk(__sk)->dport))) == (__ports)) && \ | ||
368 | ((__sk)->sk_family == AF_INET6) && \ | ||
369 | ipv6_addr_equal(&inet6_sk(__sk)->daddr, (__saddr)) && \ | ||
370 | ipv6_addr_equal(&inet6_sk(__sk)->rcv_saddr, (__daddr)) && \ | ||
371 | (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif)))) | ||
328 | 372 | ||
329 | #endif | 373 | #endif /* __KERNEL__ */ |
374 | |||
375 | #endif /* _IPV6_H */ | ||
diff --git a/include/linux/list.h b/include/linux/list.h index aab2db21b013..e6ec59682274 100644 --- a/include/linux/list.h +++ b/include/linux/list.h | |||
@@ -419,6 +419,20 @@ static inline void list_splice_init(struct list_head *list, | |||
419 | pos = n, n = list_entry(n->member.next, typeof(*n), member)) | 419 | pos = n, n = list_entry(n->member.next, typeof(*n), member)) |
420 | 420 | ||
421 | /** | 421 | /** |
422 | * list_for_each_entry_safe_continue - iterate over list of given type | ||
423 | * continuing after existing point safe against removal of list entry | ||
424 | * @pos: the type * to use as a loop counter. | ||
425 | * @n: another type * to use as temporary storage | ||
426 | * @head: the head for your list. | ||
427 | * @member: the name of the list_struct within the struct. | ||
428 | */ | ||
429 | #define list_for_each_entry_safe_continue(pos, n, head, member) \ | ||
430 | for (pos = list_entry(pos->member.next, typeof(*pos), member), \ | ||
431 | n = list_entry(pos->member.next, typeof(*pos), member); \ | ||
432 | &pos->member != (head); \ | ||
433 | pos = n, n = list_entry(n->member.next, typeof(*n), member)) | ||
434 | |||
435 | /** | ||
422 | * list_for_each_rcu - iterate over an rcu-protected list | 436 | * list_for_each_rcu - iterate over an rcu-protected list |
423 | * @pos: the &struct list_head to use as a loop counter. | 437 | * @pos: the &struct list_head to use as a loop counter. |
424 | * @head: the head for your list. | 438 | * @head: the head for your list. |
@@ -620,6 +634,57 @@ static inline void hlist_add_after(struct hlist_node *n, | |||
620 | next->next->pprev = &next->next; | 634 | next->next->pprev = &next->next; |
621 | } | 635 | } |
622 | 636 | ||
637 | /** | ||
638 | * hlist_add_before_rcu - adds the specified element to the specified hlist | ||
639 | * before the specified node while permitting racing traversals. | ||
640 | * @n: the new element to add to the hash list. | ||
641 | * @next: the existing element to add the new element before. | ||
642 | * | ||
643 | * The caller must take whatever precautions are necessary | ||
644 | * (such as holding appropriate locks) to avoid racing | ||
645 | * with another list-mutation primitive, such as hlist_add_head_rcu() | ||
646 | * or hlist_del_rcu(), running on this same list. | ||
647 | * However, it is perfectly legal to run concurrently with | ||
648 | * the _rcu list-traversal primitives, such as | ||
649 | * hlist_for_each_rcu(), used to prevent memory-consistency | ||
650 | * problems on Alpha CPUs. | ||
651 | */ | ||
652 | static inline void hlist_add_before_rcu(struct hlist_node *n, | ||
653 | struct hlist_node *next) | ||
654 | { | ||
655 | n->pprev = next->pprev; | ||
656 | n->next = next; | ||
657 | smp_wmb(); | ||
658 | next->pprev = &n->next; | ||
659 | *(n->pprev) = n; | ||
660 | } | ||
661 | |||
662 | /** | ||
663 | * hlist_add_after_rcu - adds the specified element to the specified hlist | ||
664 | * after the specified node while permitting racing traversals. | ||
665 | * @prev: the existing element to add the new element after. | ||
666 | * @n: the new element to add to the hash list. | ||
667 | * | ||
668 | * The caller must take whatever precautions are necessary | ||
669 | * (such as holding appropriate locks) to avoid racing | ||
670 | * with another list-mutation primitive, such as hlist_add_head_rcu() | ||
671 | * or hlist_del_rcu(), running on this same list. | ||
672 | * However, it is perfectly legal to run concurrently with | ||
673 | * the _rcu list-traversal primitives, such as | ||
674 | * hlist_for_each_rcu(), used to prevent memory-consistency | ||
675 | * problems on Alpha CPUs. | ||
676 | */ | ||
677 | static inline void hlist_add_after_rcu(struct hlist_node *prev, | ||
678 | struct hlist_node *n) | ||
679 | { | ||
680 | n->next = prev->next; | ||
681 | n->pprev = &prev->next; | ||
682 | smp_wmb(); | ||
683 | prev->next = n; | ||
684 | if (n->next) | ||
685 | n->next->pprev = &n->next; | ||
686 | } | ||
687 | |||
623 | #define hlist_entry(ptr, type, member) container_of(ptr,type,member) | 688 | #define hlist_entry(ptr, type, member) container_of(ptr,type,member) |
624 | 689 | ||
625 | #define hlist_for_each(pos, head) \ | 690 | #define hlist_for_each(pos, head) \ |
diff --git a/include/linux/net.h b/include/linux/net.h index 20cb226b2268..4e981585a89a 100644 --- a/include/linux/net.h +++ b/include/linux/net.h | |||
@@ -84,6 +84,7 @@ enum sock_type { | |||
84 | SOCK_RAW = 3, | 84 | SOCK_RAW = 3, |
85 | SOCK_RDM = 4, | 85 | SOCK_RDM = 4, |
86 | SOCK_SEQPACKET = 5, | 86 | SOCK_SEQPACKET = 5, |
87 | SOCK_DCCP = 6, | ||
87 | SOCK_PACKET = 10, | 88 | SOCK_PACKET = 10, |
88 | }; | 89 | }; |
89 | 90 | ||
@@ -282,5 +283,15 @@ static struct proto_ops name##_ops = { \ | |||
282 | #define MODULE_ALIAS_NETPROTO(proto) \ | 283 | #define MODULE_ALIAS_NETPROTO(proto) \ |
283 | MODULE_ALIAS("net-pf-" __stringify(proto)) | 284 | MODULE_ALIAS("net-pf-" __stringify(proto)) |
284 | 285 | ||
286 | #define MODULE_ALIAS_NET_PF_PROTO(pf, proto) \ | ||
287 | MODULE_ALIAS("net-pf-" __stringify(pf) "-proto-" __stringify(proto)) | ||
288 | |||
289 | #ifdef CONFIG_SYSCTL | ||
290 | #include <linux/sysctl.h> | ||
291 | extern ctl_table net_table[]; | ||
292 | extern int net_msg_cost; | ||
293 | extern int net_msg_burst; | ||
294 | #endif | ||
295 | |||
285 | #endif /* __KERNEL__ */ | 296 | #endif /* __KERNEL__ */ |
286 | #endif /* _LINUX_NET_H */ | 297 | #endif /* _LINUX_NET_H */ |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 3a0ed7f9e801..7c717907896d 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -244,6 +244,7 @@ struct netdev_boot_setup { | |||
244 | }; | 244 | }; |
245 | #define NETDEV_BOOT_SETUP_MAX 8 | 245 | #define NETDEV_BOOT_SETUP_MAX 8 |
246 | 246 | ||
247 | extern int __init netdev_boot_setup(char *str); | ||
247 | 248 | ||
248 | /* | 249 | /* |
249 | * The DEVICE structure. | 250 | * The DEVICE structure. |
@@ -336,6 +337,7 @@ struct net_device | |||
336 | /* Interface address info. */ | 337 | /* Interface address info. */ |
337 | unsigned char broadcast[MAX_ADDR_LEN]; /* hw bcast add */ | 338 | unsigned char broadcast[MAX_ADDR_LEN]; /* hw bcast add */ |
338 | unsigned char dev_addr[MAX_ADDR_LEN]; /* hw address */ | 339 | unsigned char dev_addr[MAX_ADDR_LEN]; /* hw address */ |
340 | unsigned char perm_addr[MAX_ADDR_LEN]; /* permanent hw address */ | ||
339 | unsigned char addr_len; /* hardware address length */ | 341 | unsigned char addr_len; /* hardware address length */ |
340 | unsigned short dev_id; /* for shared network cards */ | 342 | unsigned short dev_id; /* for shared network cards */ |
341 | 343 | ||
@@ -497,10 +499,12 @@ static inline void *netdev_priv(struct net_device *dev) | |||
497 | #define SET_NETDEV_DEV(net, pdev) ((net)->class_dev.dev = (pdev)) | 499 | #define SET_NETDEV_DEV(net, pdev) ((net)->class_dev.dev = (pdev)) |
498 | 500 | ||
499 | struct packet_type { | 501 | struct packet_type { |
500 | __be16 type; /* This is really htons(ether_type). */ | 502 | __be16 type; /* This is really htons(ether_type). */ |
501 | struct net_device *dev; /* NULL is wildcarded here */ | 503 | struct net_device *dev; /* NULL is wildcarded here */ |
502 | int (*func) (struct sk_buff *, struct net_device *, | 504 | int (*func) (struct sk_buff *, |
503 | struct packet_type *); | 505 | struct net_device *, |
506 | struct packet_type *, | ||
507 | struct net_device *); | ||
504 | void *af_packet_priv; | 508 | void *af_packet_priv; |
505 | struct list_head list; | 509 | struct list_head list; |
506 | }; | 510 | }; |
@@ -671,6 +675,7 @@ extern void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev); | |||
671 | extern void dev_init(void); | 675 | extern void dev_init(void); |
672 | 676 | ||
673 | extern int netdev_nit; | 677 | extern int netdev_nit; |
678 | extern int netdev_budget; | ||
674 | 679 | ||
675 | /* Called by rtnetlink.c:rtnl_unlock() */ | 680 | /* Called by rtnetlink.c:rtnl_unlock() */ |
676 | extern void netdev_run_todo(void); | 681 | extern void netdev_run_todo(void); |
@@ -697,19 +702,9 @@ static inline int netif_carrier_ok(const struct net_device *dev) | |||
697 | 702 | ||
698 | extern void __netdev_watchdog_up(struct net_device *dev); | 703 | extern void __netdev_watchdog_up(struct net_device *dev); |
699 | 704 | ||
700 | static inline void netif_carrier_on(struct net_device *dev) | 705 | extern void netif_carrier_on(struct net_device *dev); |
701 | { | ||
702 | if (test_and_clear_bit(__LINK_STATE_NOCARRIER, &dev->state)) | ||
703 | linkwatch_fire_event(dev); | ||
704 | if (netif_running(dev)) | ||
705 | __netdev_watchdog_up(dev); | ||
706 | } | ||
707 | 706 | ||
708 | static inline void netif_carrier_off(struct net_device *dev) | 707 | extern void netif_carrier_off(struct net_device *dev); |
709 | { | ||
710 | if (!test_and_set_bit(__LINK_STATE_NOCARRIER, &dev->state)) | ||
711 | linkwatch_fire_event(dev); | ||
712 | } | ||
713 | 708 | ||
714 | /* Hot-plugging. */ | 709 | /* Hot-plugging. */ |
715 | static inline int netif_device_present(struct net_device *dev) | 710 | static inline int netif_device_present(struct net_device *dev) |
@@ -916,6 +911,14 @@ extern int skb_checksum_help(struct sk_buff *skb, int inward); | |||
916 | extern void net_enable_timestamp(void); | 911 | extern void net_enable_timestamp(void); |
917 | extern void net_disable_timestamp(void); | 912 | extern void net_disable_timestamp(void); |
918 | 913 | ||
914 | #ifdef CONFIG_PROC_FS | ||
915 | extern void *dev_seq_start(struct seq_file *seq, loff_t *pos); | ||
916 | extern void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos); | ||
917 | extern void dev_seq_stop(struct seq_file *seq, void *v); | ||
918 | #endif | ||
919 | |||
920 | extern void linkwatch_run_queue(void); | ||
921 | |||
919 | #endif /* __KERNEL__ */ | 922 | #endif /* __KERNEL__ */ |
920 | 923 | ||
921 | #endif /* _LINUX_DEV_H */ | 924 | #endif /* _LINUX_DEV_H */ |
diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h index 2e2045482cb1..be365e70ee99 100644 --- a/include/linux/netfilter.h +++ b/include/linux/netfilter.h | |||
@@ -21,10 +21,23 @@ | |||
21 | #define NF_STOP 5 | 21 | #define NF_STOP 5 |
22 | #define NF_MAX_VERDICT NF_STOP | 22 | #define NF_MAX_VERDICT NF_STOP |
23 | 23 | ||
24 | /* we overload the higher bits for encoding auxiliary data such as the queue | ||
25 | * number. Not nice, but better than additional function arguments. */ | ||
26 | #define NF_VERDICT_MASK 0x0000ffff | ||
27 | #define NF_VERDICT_BITS 16 | ||
28 | |||
29 | #define NF_VERDICT_QMASK 0xffff0000 | ||
30 | #define NF_VERDICT_QBITS 16 | ||
31 | |||
32 | #define NF_QUEUE_NR(x) (((x << NF_VERDICT_QBITS) & NF_VERDICT_QMASK) | NF_QUEUE) | ||
33 | |||
34 | /* only for userspace compatibility */ | ||
35 | #ifndef __KERNEL__ | ||
24 | /* Generic cache responses from hook functions. | 36 | /* Generic cache responses from hook functions. |
25 | <= 0x2000 is used for protocol-flags. */ | 37 | <= 0x2000 is used for protocol-flags. */ |
26 | #define NFC_UNKNOWN 0x4000 | 38 | #define NFC_UNKNOWN 0x4000 |
27 | #define NFC_ALTERED 0x8000 | 39 | #define NFC_ALTERED 0x8000 |
40 | #endif | ||
28 | 41 | ||
29 | #ifdef __KERNEL__ | 42 | #ifdef __KERNEL__ |
30 | #include <linux/config.h> | 43 | #include <linux/config.h> |
@@ -101,15 +114,51 @@ void nf_unregister_sockopt(struct nf_sockopt_ops *reg); | |||
101 | 114 | ||
102 | extern struct list_head nf_hooks[NPROTO][NF_MAX_HOOKS]; | 115 | extern struct list_head nf_hooks[NPROTO][NF_MAX_HOOKS]; |
103 | 116 | ||
104 | typedef void nf_logfn(unsigned int hooknum, | 117 | /* those NF_LOG_* defines and struct nf_loginfo are legacy definitios that will |
118 | * disappear once iptables is replaced with pkttables. Please DO NOT use them | ||
119 | * for any new code! */ | ||
120 | #define NF_LOG_TCPSEQ 0x01 /* Log TCP sequence numbers */ | ||
121 | #define NF_LOG_TCPOPT 0x02 /* Log TCP options */ | ||
122 | #define NF_LOG_IPOPT 0x04 /* Log IP options */ | ||
123 | #define NF_LOG_UID 0x08 /* Log UID owning local socket */ | ||
124 | #define NF_LOG_MASK 0x0f | ||
125 | |||
126 | #define NF_LOG_TYPE_LOG 0x01 | ||
127 | #define NF_LOG_TYPE_ULOG 0x02 | ||
128 | |||
129 | struct nf_loginfo { | ||
130 | u_int8_t type; | ||
131 | union { | ||
132 | struct { | ||
133 | u_int32_t copy_len; | ||
134 | u_int16_t group; | ||
135 | u_int16_t qthreshold; | ||
136 | } ulog; | ||
137 | struct { | ||
138 | u_int8_t level; | ||
139 | u_int8_t logflags; | ||
140 | } log; | ||
141 | } u; | ||
142 | }; | ||
143 | |||
144 | typedef void nf_logfn(unsigned int pf, | ||
145 | unsigned int hooknum, | ||
105 | const struct sk_buff *skb, | 146 | const struct sk_buff *skb, |
106 | const struct net_device *in, | 147 | const struct net_device *in, |
107 | const struct net_device *out, | 148 | const struct net_device *out, |
149 | const struct nf_loginfo *li, | ||
108 | const char *prefix); | 150 | const char *prefix); |
109 | 151 | ||
152 | struct nf_logger { | ||
153 | struct module *me; | ||
154 | nf_logfn *logfn; | ||
155 | char *name; | ||
156 | }; | ||
157 | |||
110 | /* Function to register/unregister log function. */ | 158 | /* Function to register/unregister log function. */ |
111 | int nf_log_register(int pf, nf_logfn *logfn); | 159 | int nf_log_register(int pf, struct nf_logger *logger); |
112 | void nf_log_unregister(int pf, nf_logfn *logfn); | 160 | int nf_log_unregister_pf(int pf); |
161 | void nf_log_unregister_logger(struct nf_logger *logger); | ||
113 | 162 | ||
114 | /* Calls the registered backend logging function */ | 163 | /* Calls the registered backend logging function */ |
115 | void nf_log_packet(int pf, | 164 | void nf_log_packet(int pf, |
@@ -117,6 +166,7 @@ void nf_log_packet(int pf, | |||
117 | const struct sk_buff *skb, | 166 | const struct sk_buff *skb, |
118 | const struct net_device *in, | 167 | const struct net_device *in, |
119 | const struct net_device *out, | 168 | const struct net_device *out, |
169 | struct nf_loginfo *li, | ||
120 | const char *fmt, ...); | 170 | const char *fmt, ...); |
121 | 171 | ||
122 | /* Activate hook; either okfn or kfree_skb called, unless a hook | 172 | /* Activate hook; either okfn or kfree_skb called, unless a hook |
@@ -175,11 +225,16 @@ int nf_getsockopt(struct sock *sk, int pf, int optval, char __user *opt, | |||
175 | int *len); | 225 | int *len); |
176 | 226 | ||
177 | /* Packet queuing */ | 227 | /* Packet queuing */ |
178 | typedef int (*nf_queue_outfn_t)(struct sk_buff *skb, | 228 | struct nf_queue_handler { |
179 | struct nf_info *info, void *data); | 229 | int (*outfn)(struct sk_buff *skb, struct nf_info *info, |
230 | unsigned int queuenum, void *data); | ||
231 | void *data; | ||
232 | char *name; | ||
233 | }; | ||
180 | extern int nf_register_queue_handler(int pf, | 234 | extern int nf_register_queue_handler(int pf, |
181 | nf_queue_outfn_t outfn, void *data); | 235 | struct nf_queue_handler *qh); |
182 | extern int nf_unregister_queue_handler(int pf); | 236 | extern int nf_unregister_queue_handler(int pf); |
237 | extern void nf_unregister_queue_handlers(struct nf_queue_handler *qh); | ||
183 | extern void nf_reinject(struct sk_buff *skb, | 238 | extern void nf_reinject(struct sk_buff *skb, |
184 | struct nf_info *info, | 239 | struct nf_info *info, |
185 | unsigned int verdict); | 240 | unsigned int verdict); |
@@ -190,6 +245,27 @@ extern void nf_ct_attach(struct sk_buff *, struct sk_buff *); | |||
190 | /* FIXME: Before cache is ever used, this must be implemented for real. */ | 245 | /* FIXME: Before cache is ever used, this must be implemented for real. */ |
191 | extern void nf_invalidate_cache(int pf); | 246 | extern void nf_invalidate_cache(int pf); |
192 | 247 | ||
248 | /* Call this before modifying an existing packet: ensures it is | ||
249 | modifiable and linear to the point you care about (writable_len). | ||
250 | Returns true or false. */ | ||
251 | extern int skb_make_writable(struct sk_buff **pskb, unsigned int writable_len); | ||
252 | |||
253 | struct nf_queue_rerouter { | ||
254 | void (*save)(const struct sk_buff *skb, struct nf_info *info); | ||
255 | int (*reroute)(struct sk_buff **skb, const struct nf_info *info); | ||
256 | int rer_size; | ||
257 | }; | ||
258 | |||
259 | #define nf_info_reroute(x) ((void *)x + sizeof(struct nf_info)) | ||
260 | |||
261 | extern int nf_register_queue_rerouter(int pf, struct nf_queue_rerouter *rer); | ||
262 | extern int nf_unregister_queue_rerouter(int pf); | ||
263 | |||
264 | #ifdef CONFIG_PROC_FS | ||
265 | #include <linux/proc_fs.h> | ||
266 | extern struct proc_dir_entry *proc_net_netfilter; | ||
267 | #endif | ||
268 | |||
193 | #else /* !CONFIG_NETFILTER */ | 269 | #else /* !CONFIG_NETFILTER */ |
194 | #define NF_HOOK(pf, hook, skb, indev, outdev, okfn) (okfn)(skb) | 270 | #define NF_HOOK(pf, hook, skb, indev, outdev, okfn) (okfn)(skb) |
195 | static inline void nf_ct_attach(struct sk_buff *new, struct sk_buff *skb) {} | 271 | static inline void nf_ct_attach(struct sk_buff *new, struct sk_buff *skb) {} |
diff --git a/include/linux/netfilter/nfnetlink.h b/include/linux/netfilter/nfnetlink.h new file mode 100644 index 000000000000..1d5b10ae2399 --- /dev/null +++ b/include/linux/netfilter/nfnetlink.h | |||
@@ -0,0 +1,169 @@ | |||
1 | #ifndef _NFNETLINK_H | ||
2 | #define _NFNETLINK_H | ||
3 | #include <linux/types.h> | ||
4 | |||
5 | #ifndef __KERNEL__ | ||
6 | /* nfnetlink groups: Up to 32 maximum - backwards compatibility for userspace */ | ||
7 | #define NF_NETLINK_CONNTRACK_NEW 0x00000001 | ||
8 | #define NF_NETLINK_CONNTRACK_UPDATE 0x00000002 | ||
9 | #define NF_NETLINK_CONNTRACK_DESTROY 0x00000004 | ||
10 | #define NF_NETLINK_CONNTRACK_EXP_NEW 0x00000008 | ||
11 | #define NF_NETLINK_CONNTRACK_EXP_UPDATE 0x00000010 | ||
12 | #define NF_NETLINK_CONNTRACK_EXP_DESTROY 0x00000020 | ||
13 | #endif | ||
14 | |||
15 | enum nfnetlink_groups { | ||
16 | NFNLGRP_NONE, | ||
17 | #define NFNLGRP_NONE NFNLGRP_NONE | ||
18 | NFNLGRP_CONNTRACK_NEW, | ||
19 | #define NFNLGRP_CONNTRACK_NEW NFNLGRP_CONNTRACK_NEW | ||
20 | NFNLGRP_CONNTRACK_UPDATE, | ||
21 | #define NFNLGRP_CONNTRACK_UPDATE NFNLGRP_CONNTRACK_UPDATE | ||
22 | NFNLGRP_CONNTRACK_DESTROY, | ||
23 | #define NFNLGRP_CONNTRACK_DESTROY NFNLGRP_CONNTRACK_DESTROY | ||
24 | NFNLGRP_CONNTRACK_EXP_NEW, | ||
25 | #define NFNLGRP_CONNTRACK_EXP_NEW NFNLGRP_CONNTRACK_EXP_NEW | ||
26 | NFNLGRP_CONNTRACK_EXP_UPDATE, | ||
27 | #define NFNLGRP_CONNTRACK_EXP_UPDATE NFNLGRP_CONNTRACK_EXP_UPDATE | ||
28 | NFNLGRP_CONNTRACK_EXP_DESTROY, | ||
29 | #define NFNLGRP_CONNTRACK_EXP_DESTROY NFNLGRP_CONNTRACK_EXP_DESTROY | ||
30 | __NFNLGRP_MAX, | ||
31 | }; | ||
32 | #define NFNLGRP_MAX (__NFNLGRP_MAX - 1) | ||
33 | |||
34 | /* Generic structure for encapsulation optional netfilter information. | ||
35 | * It is reminiscent of sockaddr, but with sa_family replaced | ||
36 | * with attribute type. | ||
37 | * ! This should someday be put somewhere generic as now rtnetlink and | ||
38 | * ! nfnetlink use the same attributes methods. - J. Schulist. | ||
39 | */ | ||
40 | |||
41 | struct nfattr | ||
42 | { | ||
43 | u_int16_t nfa_len; | ||
44 | u_int16_t nfa_type; | ||
45 | } __attribute__ ((packed)); | ||
46 | |||
47 | /* FIXME: Shamelessly copy and pasted from rtnetlink.h, it's time | ||
48 | * to put this in a generic file */ | ||
49 | |||
50 | #define NFA_ALIGNTO 4 | ||
51 | #define NFA_ALIGN(len) (((len) + NFA_ALIGNTO - 1) & ~(NFA_ALIGNTO - 1)) | ||
52 | #define NFA_OK(nfa,len) ((len) > 0 && (nfa)->nfa_len >= sizeof(struct nfattr) \ | ||
53 | && (nfa)->nfa_len <= (len)) | ||
54 | #define NFA_NEXT(nfa,attrlen) ((attrlen) -= NFA_ALIGN((nfa)->nfa_len), \ | ||
55 | (struct nfattr *)(((char *)(nfa)) + NFA_ALIGN((nfa)->nfa_len))) | ||
56 | #define NFA_LENGTH(len) (NFA_ALIGN(sizeof(struct nfattr)) + (len)) | ||
57 | #define NFA_SPACE(len) NFA_ALIGN(NFA_LENGTH(len)) | ||
58 | #define NFA_DATA(nfa) ((void *)(((char *)(nfa)) + NFA_LENGTH(0))) | ||
59 | #define NFA_PAYLOAD(nfa) ((int)((nfa)->nfa_len) - NFA_LENGTH(0)) | ||
60 | #define NFA_NEST(skb, type) \ | ||
61 | ({ struct nfattr *__start = (struct nfattr *) (skb)->tail; \ | ||
62 | NFA_PUT(skb, type, 0, NULL); \ | ||
63 | __start; }) | ||
64 | #define NFA_NEST_END(skb, start) \ | ||
65 | ({ (start)->nfa_len = ((skb)->tail - (unsigned char *) (start)); \ | ||
66 | (skb)->len; }) | ||
67 | #define NFA_NEST_CANCEL(skb, start) \ | ||
68 | ({ if (start) \ | ||
69 | skb_trim(skb, (unsigned char *) (start) - (skb)->data); \ | ||
70 | -1; }) | ||
71 | |||
72 | /* General form of address family dependent message. | ||
73 | */ | ||
74 | struct nfgenmsg { | ||
75 | u_int8_t nfgen_family; /* AF_xxx */ | ||
76 | u_int8_t version; /* nfnetlink version */ | ||
77 | u_int16_t res_id; /* resource id */ | ||
78 | } __attribute__ ((packed)); | ||
79 | |||
80 | #define NFNETLINK_V0 0 | ||
81 | |||
82 | #define NFM_NFA(n) ((struct nfattr *)(((char *)(n)) \ | ||
83 | + NLMSG_ALIGN(sizeof(struct nfgenmsg)))) | ||
84 | #define NFM_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct nfgenmsg)) | ||
85 | |||
86 | /* netfilter netlink message types are split in two pieces: | ||
87 | * 8 bit subsystem, 8bit operation. | ||
88 | */ | ||
89 | |||
90 | #define NFNL_SUBSYS_ID(x) ((x & 0xff00) >> 8) | ||
91 | #define NFNL_MSG_TYPE(x) (x & 0x00ff) | ||
92 | |||
93 | /* No enum here, otherwise __stringify() trick of MODULE_ALIAS_NFNL_SUBSYS() | ||
94 | * won't work anymore */ | ||
95 | #define NFNL_SUBSYS_NONE 0 | ||
96 | #define NFNL_SUBSYS_CTNETLINK 1 | ||
97 | #define NFNL_SUBSYS_CTNETLINK_EXP 2 | ||
98 | #define NFNL_SUBSYS_QUEUE 3 | ||
99 | #define NFNL_SUBSYS_ULOG 4 | ||
100 | #define NFNL_SUBSYS_COUNT 5 | ||
101 | |||
102 | #ifdef __KERNEL__ | ||
103 | |||
104 | #include <linux/netlink.h> | ||
105 | #include <linux/capability.h> | ||
106 | |||
107 | struct nfnl_callback | ||
108 | { | ||
109 | int (*call)(struct sock *nl, struct sk_buff *skb, | ||
110 | struct nlmsghdr *nlh, struct nfattr *cda[], int *errp); | ||
111 | kernel_cap_t cap_required; /* capabilities required for this msg */ | ||
112 | u_int16_t attr_count; /* number of nfattr's */ | ||
113 | }; | ||
114 | |||
115 | struct nfnetlink_subsystem | ||
116 | { | ||
117 | const char *name; | ||
118 | __u8 subsys_id; /* nfnetlink subsystem ID */ | ||
119 | __u8 cb_count; /* number of callbacks */ | ||
120 | struct nfnl_callback *cb; /* callback for individual types */ | ||
121 | }; | ||
122 | |||
123 | extern void __nfa_fill(struct sk_buff *skb, int attrtype, | ||
124 | int attrlen, const void *data); | ||
125 | #define NFA_PUT(skb, attrtype, attrlen, data) \ | ||
126 | ({ if (skb_tailroom(skb) < (int)NFA_SPACE(attrlen)) goto nfattr_failure; \ | ||
127 | __nfa_fill(skb, attrtype, attrlen, data); }) | ||
128 | |||
129 | extern struct semaphore nfnl_sem; | ||
130 | |||
131 | #define nfnl_shlock() down(&nfnl_sem) | ||
132 | #define nfnl_shlock_nowait() down_trylock(&nfnl_sem) | ||
133 | |||
134 | #define nfnl_shunlock() do { up(&nfnl_sem); \ | ||
135 | if(nfnl && nfnl->sk_receive_queue.qlen) \ | ||
136 | nfnl->sk_data_ready(nfnl, 0); \ | ||
137 | } while(0) | ||
138 | |||
139 | extern void nfnl_lock(void); | ||
140 | extern void nfnl_unlock(void); | ||
141 | |||
142 | extern int nfnetlink_subsys_register(struct nfnetlink_subsystem *n); | ||
143 | extern int nfnetlink_subsys_unregister(struct nfnetlink_subsystem *n); | ||
144 | |||
145 | extern int nfattr_parse(struct nfattr *tb[], int maxattr, | ||
146 | struct nfattr *nfa, int len); | ||
147 | |||
148 | #define nfattr_parse_nested(tb, max, nfa) \ | ||
149 | nfattr_parse((tb), (max), NFA_DATA((nfa)), NFA_PAYLOAD((nfa))) | ||
150 | |||
151 | #define nfattr_bad_size(tb, max, cta_min) \ | ||
152 | ({ int __i, __res = 0; \ | ||
153 | for (__i=0; __i<max; __i++) \ | ||
154 | if (tb[__i] && NFA_PAYLOAD(tb[__i]) < cta_min[__i]){ \ | ||
155 | __res = 1; \ | ||
156 | break; \ | ||
157 | } \ | ||
158 | __res; \ | ||
159 | }) | ||
160 | |||
161 | extern int nfnetlink_send(struct sk_buff *skb, u32 pid, unsigned group, | ||
162 | int echo); | ||
163 | extern int nfnetlink_unicast(struct sk_buff *skb, u_int32_t pid, int flags); | ||
164 | |||
165 | #define MODULE_ALIAS_NFNL_SUBSYS(subsys) \ | ||
166 | MODULE_ALIAS("nfnetlink-subsys-" __stringify(subsys)) | ||
167 | |||
168 | #endif /* __KERNEL__ */ | ||
169 | #endif /* _NFNETLINK_H */ | ||
diff --git a/include/linux/netfilter/nfnetlink_conntrack.h b/include/linux/netfilter/nfnetlink_conntrack.h new file mode 100644 index 000000000000..5c55751c78e4 --- /dev/null +++ b/include/linux/netfilter/nfnetlink_conntrack.h | |||
@@ -0,0 +1,124 @@ | |||
1 | #ifndef _IPCONNTRACK_NETLINK_H | ||
2 | #define _IPCONNTRACK_NETLINK_H | ||
3 | #include <linux/netfilter/nfnetlink.h> | ||
4 | |||
5 | enum cntl_msg_types { | ||
6 | IPCTNL_MSG_CT_NEW, | ||
7 | IPCTNL_MSG_CT_GET, | ||
8 | IPCTNL_MSG_CT_DELETE, | ||
9 | IPCTNL_MSG_CT_GET_CTRZERO, | ||
10 | |||
11 | IPCTNL_MSG_MAX | ||
12 | }; | ||
13 | |||
14 | enum ctnl_exp_msg_types { | ||
15 | IPCTNL_MSG_EXP_NEW, | ||
16 | IPCTNL_MSG_EXP_GET, | ||
17 | IPCTNL_MSG_EXP_DELETE, | ||
18 | |||
19 | IPCTNL_MSG_EXP_MAX | ||
20 | }; | ||
21 | |||
22 | |||
23 | enum ctattr_type { | ||
24 | CTA_UNSPEC, | ||
25 | CTA_TUPLE_ORIG, | ||
26 | CTA_TUPLE_REPLY, | ||
27 | CTA_STATUS, | ||
28 | CTA_PROTOINFO, | ||
29 | CTA_HELP, | ||
30 | CTA_NAT, | ||
31 | CTA_TIMEOUT, | ||
32 | CTA_MARK, | ||
33 | CTA_COUNTERS_ORIG, | ||
34 | CTA_COUNTERS_REPLY, | ||
35 | CTA_USE, | ||
36 | CTA_ID, | ||
37 | __CTA_MAX | ||
38 | }; | ||
39 | #define CTA_MAX (__CTA_MAX - 1) | ||
40 | |||
41 | enum ctattr_tuple { | ||
42 | CTA_TUPLE_UNSPEC, | ||
43 | CTA_TUPLE_IP, | ||
44 | CTA_TUPLE_PROTO, | ||
45 | __CTA_TUPLE_MAX | ||
46 | }; | ||
47 | #define CTA_TUPLE_MAX (__CTA_TUPLE_MAX - 1) | ||
48 | |||
49 | enum ctattr_ip { | ||
50 | CTA_IP_UNSPEC, | ||
51 | CTA_IP_V4_SRC, | ||
52 | CTA_IP_V4_DST, | ||
53 | CTA_IP_V6_SRC, | ||
54 | CTA_IP_V6_DST, | ||
55 | __CTA_IP_MAX | ||
56 | }; | ||
57 | #define CTA_IP_MAX (__CTA_IP_MAX - 1) | ||
58 | |||
59 | enum ctattr_l4proto { | ||
60 | CTA_PROTO_UNSPEC, | ||
61 | CTA_PROTO_NUM, | ||
62 | CTA_PROTO_SRC_PORT, | ||
63 | CTA_PROTO_DST_PORT, | ||
64 | CTA_PROTO_ICMP_ID, | ||
65 | CTA_PROTO_ICMP_TYPE, | ||
66 | CTA_PROTO_ICMP_CODE, | ||
67 | __CTA_PROTO_MAX | ||
68 | }; | ||
69 | #define CTA_PROTO_MAX (__CTA_PROTO_MAX - 1) | ||
70 | |||
71 | enum ctattr_protoinfo { | ||
72 | CTA_PROTOINFO_UNSPEC, | ||
73 | CTA_PROTOINFO_TCP_STATE, | ||
74 | __CTA_PROTOINFO_MAX | ||
75 | }; | ||
76 | #define CTA_PROTOINFO_MAX (__CTA_PROTOINFO_MAX - 1) | ||
77 | |||
78 | enum ctattr_counters { | ||
79 | CTA_COUNTERS_UNSPEC, | ||
80 | CTA_COUNTERS_PACKETS, | ||
81 | CTA_COUNTERS_BYTES, | ||
82 | __CTA_COUNTERS_MAX | ||
83 | }; | ||
84 | #define CTA_COUNTERS_MAX (__CTA_COUNTERS_MAX - 1) | ||
85 | |||
86 | enum ctattr_nat { | ||
87 | CTA_NAT_UNSPEC, | ||
88 | CTA_NAT_MINIP, | ||
89 | CTA_NAT_MAXIP, | ||
90 | CTA_NAT_PROTO, | ||
91 | __CTA_NAT_MAX | ||
92 | }; | ||
93 | #define CTA_NAT_MAX (__CTA_NAT_MAX - 1) | ||
94 | |||
95 | enum ctattr_protonat { | ||
96 | CTA_PROTONAT_UNSPEC, | ||
97 | CTA_PROTONAT_PORT_MIN, | ||
98 | CTA_PROTONAT_PORT_MAX, | ||
99 | __CTA_PROTONAT_MAX | ||
100 | }; | ||
101 | #define CTA_PROTONAT_MAX (__CTA_PROTONAT_MAX - 1) | ||
102 | |||
103 | enum ctattr_expect { | ||
104 | CTA_EXPECT_UNSPEC, | ||
105 | CTA_EXPECT_MASTER, | ||
106 | CTA_EXPECT_TUPLE, | ||
107 | CTA_EXPECT_MASK, | ||
108 | CTA_EXPECT_TIMEOUT, | ||
109 | CTA_EXPECT_ID, | ||
110 | CTA_EXPECT_HELP_NAME, | ||
111 | __CTA_EXPECT_MAX | ||
112 | }; | ||
113 | #define CTA_EXPECT_MAX (__CTA_EXPECT_MAX - 1) | ||
114 | |||
115 | enum ctattr_help { | ||
116 | CTA_HELP_UNSPEC, | ||
117 | CTA_HELP_NAME, | ||
118 | __CTA_HELP_MAX | ||
119 | }; | ||
120 | #define CTA_HELP_MAX (__CTA_HELP_MAX - 1) | ||
121 | |||
122 | #define CTA_HELP_MAXNAMESIZE 32 | ||
123 | |||
124 | #endif /* _IPCONNTRACK_NETLINK_H */ | ||
diff --git a/include/linux/netfilter/nfnetlink_log.h b/include/linux/netfilter/nfnetlink_log.h new file mode 100644 index 000000000000..b04b03880595 --- /dev/null +++ b/include/linux/netfilter/nfnetlink_log.h | |||
@@ -0,0 +1,88 @@ | |||
1 | #ifndef _NFNETLINK_LOG_H | ||
2 | #define _NFNETLINK_LOG_H | ||
3 | |||
4 | /* This file describes the netlink messages (i.e. 'protocol packets'), | ||
5 | * and not any kind of function definitions. It is shared between kernel and | ||
6 | * userspace. Don't put kernel specific stuff in here */ | ||
7 | |||
8 | #include <linux/types.h> | ||
9 | #include <linux/netfilter/nfnetlink.h> | ||
10 | |||
11 | enum nfulnl_msg_types { | ||
12 | NFULNL_MSG_PACKET, /* packet from kernel to userspace */ | ||
13 | NFULNL_MSG_CONFIG, /* connect to a particular queue */ | ||
14 | |||
15 | NFULNL_MSG_MAX | ||
16 | }; | ||
17 | |||
18 | struct nfulnl_msg_packet_hdr { | ||
19 | u_int16_t hw_protocol; /* hw protocol (network order) */ | ||
20 | u_int8_t hook; /* netfilter hook */ | ||
21 | u_int8_t _pad; | ||
22 | } __attribute__ ((packed)); | ||
23 | |||
24 | struct nfulnl_msg_packet_hw { | ||
25 | u_int16_t hw_addrlen; | ||
26 | u_int16_t _pad; | ||
27 | u_int8_t hw_addr[8]; | ||
28 | } __attribute__ ((packed)); | ||
29 | |||
30 | struct nfulnl_msg_packet_timestamp { | ||
31 | aligned_u64 sec; | ||
32 | aligned_u64 usec; | ||
33 | } __attribute__ ((packed)); | ||
34 | |||
35 | #define NFULNL_PREFIXLEN 30 /* just like old log target */ | ||
36 | |||
37 | enum nfulnl_attr_type { | ||
38 | NFULA_UNSPEC, | ||
39 | NFULA_PACKET_HDR, | ||
40 | NFULA_MARK, /* u_int32_t nfmark */ | ||
41 | NFULA_TIMESTAMP, /* nfulnl_msg_packet_timestamp */ | ||
42 | NFULA_IFINDEX_INDEV, /* u_int32_t ifindex */ | ||
43 | NFULA_IFINDEX_OUTDEV, /* u_int32_t ifindex */ | ||
44 | NFULA_IFINDEX_PHYSINDEV, /* u_int32_t ifindex */ | ||
45 | NFULA_IFINDEX_PHYSOUTDEV, /* u_int32_t ifindex */ | ||
46 | NFULA_HWADDR, /* nfulnl_msg_packet_hw */ | ||
47 | NFULA_PAYLOAD, /* opaque data payload */ | ||
48 | NFULA_PREFIX, /* string prefix */ | ||
49 | NFULA_UID, /* user id of socket */ | ||
50 | |||
51 | __NFULA_MAX | ||
52 | }; | ||
53 | #define NFULA_MAX (__NFULA_MAX - 1) | ||
54 | |||
55 | enum nfulnl_msg_config_cmds { | ||
56 | NFULNL_CFG_CMD_NONE, | ||
57 | NFULNL_CFG_CMD_BIND, | ||
58 | NFULNL_CFG_CMD_UNBIND, | ||
59 | NFULNL_CFG_CMD_PF_BIND, | ||
60 | NFULNL_CFG_CMD_PF_UNBIND, | ||
61 | }; | ||
62 | |||
63 | struct nfulnl_msg_config_cmd { | ||
64 | u_int8_t command; /* nfulnl_msg_config_cmds */ | ||
65 | } __attribute__ ((packed)); | ||
66 | |||
67 | struct nfulnl_msg_config_mode { | ||
68 | u_int32_t copy_range; | ||
69 | u_int8_t copy_mode; | ||
70 | u_int8_t _pad; | ||
71 | } __attribute__ ((packed)); | ||
72 | |||
73 | enum nfulnl_attr_config { | ||
74 | NFULA_CFG_UNSPEC, | ||
75 | NFULA_CFG_CMD, /* nfulnl_msg_config_cmd */ | ||
76 | NFULA_CFG_MODE, /* nfulnl_msg_config_mode */ | ||
77 | NFULA_CFG_NLBUFSIZ, /* u_int32_t buffer size */ | ||
78 | NFULA_CFG_TIMEOUT, /* u_int32_t in 1/100 s */ | ||
79 | NFULA_CFG_QTHRESH, /* u_int32_t */ | ||
80 | __NFULA_CFG_MAX | ||
81 | }; | ||
82 | #define NFULA_CFG_MAX (__NFULA_CFG_MAX -1) | ||
83 | |||
84 | #define NFULNL_COPY_NONE 0x00 | ||
85 | #define NFULNL_COPY_META 0x01 | ||
86 | #define NFULNL_COPY_PACKET 0x02 | ||
87 | |||
88 | #endif /* _NFNETLINK_LOG_H */ | ||
diff --git a/include/linux/netfilter/nfnetlink_queue.h b/include/linux/netfilter/nfnetlink_queue.h new file mode 100644 index 000000000000..9e774373244c --- /dev/null +++ b/include/linux/netfilter/nfnetlink_queue.h | |||
@@ -0,0 +1,89 @@ | |||
1 | #ifndef _NFNETLINK_QUEUE_H | ||
2 | #define _NFNETLINK_QUEUE_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | #include <linux/netfilter/nfnetlink.h> | ||
6 | |||
7 | enum nfqnl_msg_types { | ||
8 | NFQNL_MSG_PACKET, /* packet from kernel to userspace */ | ||
9 | NFQNL_MSG_VERDICT, /* verdict from userspace to kernel */ | ||
10 | NFQNL_MSG_CONFIG, /* connect to a particular queue */ | ||
11 | |||
12 | NFQNL_MSG_MAX | ||
13 | }; | ||
14 | |||
15 | struct nfqnl_msg_packet_hdr { | ||
16 | u_int32_t packet_id; /* unique ID of packet in queue */ | ||
17 | u_int16_t hw_protocol; /* hw protocol (network order) */ | ||
18 | u_int8_t hook; /* netfilter hook */ | ||
19 | } __attribute__ ((packed)); | ||
20 | |||
21 | struct nfqnl_msg_packet_hw { | ||
22 | u_int16_t hw_addrlen; | ||
23 | u_int16_t _pad; | ||
24 | u_int8_t hw_addr[8]; | ||
25 | } __attribute__ ((packed)); | ||
26 | |||
27 | struct nfqnl_msg_packet_timestamp { | ||
28 | aligned_u64 sec; | ||
29 | aligned_u64 usec; | ||
30 | } __attribute__ ((packed)); | ||
31 | |||
32 | enum nfqnl_attr_type { | ||
33 | NFQA_UNSPEC, | ||
34 | NFQA_PACKET_HDR, | ||
35 | NFQA_VERDICT_HDR, /* nfqnl_msg_verdict_hrd */ | ||
36 | NFQA_MARK, /* u_int32_t nfmark */ | ||
37 | NFQA_TIMESTAMP, /* nfqnl_msg_packet_timestamp */ | ||
38 | NFQA_IFINDEX_INDEV, /* u_int32_t ifindex */ | ||
39 | NFQA_IFINDEX_OUTDEV, /* u_int32_t ifindex */ | ||
40 | NFQA_IFINDEX_PHYSINDEV, /* u_int32_t ifindex */ | ||
41 | NFQA_IFINDEX_PHYSOUTDEV, /* u_int32_t ifindex */ | ||
42 | NFQA_HWADDR, /* nfqnl_msg_packet_hw */ | ||
43 | NFQA_PAYLOAD, /* opaque data payload */ | ||
44 | |||
45 | __NFQA_MAX | ||
46 | }; | ||
47 | #define NFQA_MAX (__NFQA_MAX - 1) | ||
48 | |||
49 | struct nfqnl_msg_verdict_hdr { | ||
50 | u_int32_t verdict; | ||
51 | u_int32_t id; | ||
52 | } __attribute__ ((packed)); | ||
53 | |||
54 | |||
55 | enum nfqnl_msg_config_cmds { | ||
56 | NFQNL_CFG_CMD_NONE, | ||
57 | NFQNL_CFG_CMD_BIND, | ||
58 | NFQNL_CFG_CMD_UNBIND, | ||
59 | NFQNL_CFG_CMD_PF_BIND, | ||
60 | NFQNL_CFG_CMD_PF_UNBIND, | ||
61 | }; | ||
62 | |||
63 | struct nfqnl_msg_config_cmd { | ||
64 | u_int8_t command; /* nfqnl_msg_config_cmds */ | ||
65 | u_int8_t _pad; | ||
66 | u_int16_t pf; /* AF_xxx for PF_[UN]BIND */ | ||
67 | } __attribute__ ((packed)); | ||
68 | |||
69 | enum nfqnl_config_mode { | ||
70 | NFQNL_COPY_NONE, | ||
71 | NFQNL_COPY_META, | ||
72 | NFQNL_COPY_PACKET, | ||
73 | }; | ||
74 | |||
75 | struct nfqnl_msg_config_params { | ||
76 | u_int32_t copy_range; | ||
77 | u_int8_t copy_mode; /* enum nfqnl_config_mode */ | ||
78 | } __attribute__ ((packed)); | ||
79 | |||
80 | |||
81 | enum nfqnl_attr_config { | ||
82 | NFQA_CFG_UNSPEC, | ||
83 | NFQA_CFG_CMD, /* nfqnl_msg_config_cmd */ | ||
84 | NFQA_CFG_PARAMS, /* nfqnl_msg_config_params */ | ||
85 | __NFQA_CFG_MAX | ||
86 | }; | ||
87 | #define NFQA_CFG_MAX (__NFQA_CFG_MAX-1) | ||
88 | |||
89 | #endif /* _NFNETLINK_QUEUE_H */ | ||
diff --git a/include/linux/netfilter_decnet.h b/include/linux/netfilter_decnet.h index 3064eec9cb8e..6f425369ee29 100644 --- a/include/linux/netfilter_decnet.h +++ b/include/linux/netfilter_decnet.h | |||
@@ -9,6 +9,8 @@ | |||
9 | 9 | ||
10 | #include <linux/netfilter.h> | 10 | #include <linux/netfilter.h> |
11 | 11 | ||
12 | /* only for userspace compatibility */ | ||
13 | #ifndef __KERNEL__ | ||
12 | /* IP Cache bits. */ | 14 | /* IP Cache bits. */ |
13 | /* Src IP address. */ | 15 | /* Src IP address. */ |
14 | #define NFC_DN_SRC 0x0001 | 16 | #define NFC_DN_SRC 0x0001 |
@@ -18,6 +20,7 @@ | |||
18 | #define NFC_DN_IF_IN 0x0004 | 20 | #define NFC_DN_IF_IN 0x0004 |
19 | /* Output device. */ | 21 | /* Output device. */ |
20 | #define NFC_DN_IF_OUT 0x0008 | 22 | #define NFC_DN_IF_OUT 0x0008 |
23 | #endif /* ! __KERNEL__ */ | ||
21 | 24 | ||
22 | /* DECnet Hooks */ | 25 | /* DECnet Hooks */ |
23 | /* After promisc drops, checksum checks. */ | 26 | /* After promisc drops, checksum checks. */ |
@@ -53,7 +56,21 @@ struct nf_dn_rtmsg { | |||
53 | 56 | ||
54 | #define NFDN_RTMSG(r) ((unsigned char *)(r) + NLMSG_ALIGN(sizeof(struct nf_dn_rtmsg))) | 57 | #define NFDN_RTMSG(r) ((unsigned char *)(r) + NLMSG_ALIGN(sizeof(struct nf_dn_rtmsg))) |
55 | 58 | ||
59 | #ifndef __KERNEL__ | ||
60 | /* backwards compatibility for userspace */ | ||
56 | #define DNRMG_L1_GROUP 0x01 | 61 | #define DNRMG_L1_GROUP 0x01 |
57 | #define DNRMG_L2_GROUP 0x02 | 62 | #define DNRMG_L2_GROUP 0x02 |
63 | #endif | ||
64 | |||
65 | enum { | ||
66 | DNRNG_NLGRP_NONE, | ||
67 | #define DNRNG_NLGRP_NONE DNRNG_NLGRP_NONE | ||
68 | DNRNG_NLGRP_L1, | ||
69 | #define DNRNG_NLGRP_L1 DNRNG_NLGRP_L1 | ||
70 | DNRNG_NLGRP_L2, | ||
71 | #define DNRNG_NLGRP_L2 DNRNG_NLGRP_L2 | ||
72 | __DNRNG_NLGRP_MAX | ||
73 | }; | ||
74 | #define DNRNG_NLGRP_MAX (__DNRNG_NLGRP_MAX - 1) | ||
58 | 75 | ||
59 | #endif /*__LINUX_DECNET_NETFILTER_H*/ | 76 | #endif /*__LINUX_DECNET_NETFILTER_H*/ |
diff --git a/include/linux/netfilter_ipv4.h b/include/linux/netfilter_ipv4.h index 3ebc36afae1a..fdc4a9527343 100644 --- a/include/linux/netfilter_ipv4.h +++ b/include/linux/netfilter_ipv4.h | |||
@@ -8,6 +8,8 @@ | |||
8 | #include <linux/config.h> | 8 | #include <linux/config.h> |
9 | #include <linux/netfilter.h> | 9 | #include <linux/netfilter.h> |
10 | 10 | ||
11 | /* only for userspace compatibility */ | ||
12 | #ifndef __KERNEL__ | ||
11 | /* IP Cache bits. */ | 13 | /* IP Cache bits. */ |
12 | /* Src IP address. */ | 14 | /* Src IP address. */ |
13 | #define NFC_IP_SRC 0x0001 | 15 | #define NFC_IP_SRC 0x0001 |
@@ -35,6 +37,7 @@ | |||
35 | #define NFC_IP_DST_PT 0x0400 | 37 | #define NFC_IP_DST_PT 0x0400 |
36 | /* Something else about the proto */ | 38 | /* Something else about the proto */ |
37 | #define NFC_IP_PROTO_UNKNOWN 0x2000 | 39 | #define NFC_IP_PROTO_UNKNOWN 0x2000 |
40 | #endif /* ! __KERNEL__ */ | ||
38 | 41 | ||
39 | /* IP Hooks */ | 42 | /* IP Hooks */ |
40 | /* After promisc drops, checksum checks. */ | 43 | /* After promisc drops, checksum checks. */ |
@@ -77,11 +80,6 @@ enum nf_ip_hook_priorities { | |||
77 | #ifdef __KERNEL__ | 80 | #ifdef __KERNEL__ |
78 | extern int ip_route_me_harder(struct sk_buff **pskb); | 81 | extern int ip_route_me_harder(struct sk_buff **pskb); |
79 | 82 | ||
80 | /* Call this before modifying an existing IP packet: ensures it is | ||
81 | modifiable and linear to the point you care about (writable_len). | ||
82 | Returns true or false. */ | ||
83 | extern int skb_ip_make_writable(struct sk_buff **pskb, | ||
84 | unsigned int writable_len); | ||
85 | #endif /*__KERNEL__*/ | 83 | #endif /*__KERNEL__*/ |
86 | 84 | ||
87 | #endif /*__LINUX_IP_NETFILTER_H*/ | 85 | #endif /*__LINUX_IP_NETFILTER_H*/ |
diff --git a/include/linux/netfilter_ipv4/ip_conntrack.h b/include/linux/netfilter_ipv4/ip_conntrack.h index 08fe5f7d14a0..088742befe49 100644 --- a/include/linux/netfilter_ipv4/ip_conntrack.h +++ b/include/linux/netfilter_ipv4/ip_conntrack.h | |||
@@ -65,6 +65,63 @@ enum ip_conntrack_status { | |||
65 | 65 | ||
66 | /* Both together */ | 66 | /* Both together */ |
67 | IPS_NAT_DONE_MASK = (IPS_DST_NAT_DONE | IPS_SRC_NAT_DONE), | 67 | IPS_NAT_DONE_MASK = (IPS_DST_NAT_DONE | IPS_SRC_NAT_DONE), |
68 | |||
69 | /* Connection is dying (removed from lists), can not be unset. */ | ||
70 | IPS_DYING_BIT = 9, | ||
71 | IPS_DYING = (1 << IPS_DYING_BIT), | ||
72 | }; | ||
73 | |||
74 | /* Connection tracking event bits */ | ||
75 | enum ip_conntrack_events | ||
76 | { | ||
77 | /* New conntrack */ | ||
78 | IPCT_NEW_BIT = 0, | ||
79 | IPCT_NEW = (1 << IPCT_NEW_BIT), | ||
80 | |||
81 | /* Expected connection */ | ||
82 | IPCT_RELATED_BIT = 1, | ||
83 | IPCT_RELATED = (1 << IPCT_RELATED_BIT), | ||
84 | |||
85 | /* Destroyed conntrack */ | ||
86 | IPCT_DESTROY_BIT = 2, | ||
87 | IPCT_DESTROY = (1 << IPCT_DESTROY_BIT), | ||
88 | |||
89 | /* Timer has been refreshed */ | ||
90 | IPCT_REFRESH_BIT = 3, | ||
91 | IPCT_REFRESH = (1 << IPCT_REFRESH_BIT), | ||
92 | |||
93 | /* Status has changed */ | ||
94 | IPCT_STATUS_BIT = 4, | ||
95 | IPCT_STATUS = (1 << IPCT_STATUS_BIT), | ||
96 | |||
97 | /* Update of protocol info */ | ||
98 | IPCT_PROTOINFO_BIT = 5, | ||
99 | IPCT_PROTOINFO = (1 << IPCT_PROTOINFO_BIT), | ||
100 | |||
101 | /* Volatile protocol info */ | ||
102 | IPCT_PROTOINFO_VOLATILE_BIT = 6, | ||
103 | IPCT_PROTOINFO_VOLATILE = (1 << IPCT_PROTOINFO_VOLATILE_BIT), | ||
104 | |||
105 | /* New helper for conntrack */ | ||
106 | IPCT_HELPER_BIT = 7, | ||
107 | IPCT_HELPER = (1 << IPCT_HELPER_BIT), | ||
108 | |||
109 | /* Update of helper info */ | ||
110 | IPCT_HELPINFO_BIT = 8, | ||
111 | IPCT_HELPINFO = (1 << IPCT_HELPINFO_BIT), | ||
112 | |||
113 | /* Volatile helper info */ | ||
114 | IPCT_HELPINFO_VOLATILE_BIT = 9, | ||
115 | IPCT_HELPINFO_VOLATILE = (1 << IPCT_HELPINFO_VOLATILE_BIT), | ||
116 | |||
117 | /* NAT info */ | ||
118 | IPCT_NATINFO_BIT = 10, | ||
119 | IPCT_NATINFO = (1 << IPCT_NATINFO_BIT), | ||
120 | }; | ||
121 | |||
122 | enum ip_conntrack_expect_events { | ||
123 | IPEXP_NEW_BIT = 0, | ||
124 | IPEXP_NEW = (1 << IPEXP_NEW_BIT), | ||
68 | }; | 125 | }; |
69 | 126 | ||
70 | #ifdef __KERNEL__ | 127 | #ifdef __KERNEL__ |
@@ -152,6 +209,9 @@ struct ip_conntrack | |||
152 | /* Current number of expected connections */ | 209 | /* Current number of expected connections */ |
153 | unsigned int expecting; | 210 | unsigned int expecting; |
154 | 211 | ||
212 | /* Unique ID that identifies this conntrack*/ | ||
213 | unsigned int id; | ||
214 | |||
155 | /* Helper, if any. */ | 215 | /* Helper, if any. */ |
156 | struct ip_conntrack_helper *helper; | 216 | struct ip_conntrack_helper *helper; |
157 | 217 | ||
@@ -171,7 +231,7 @@ struct ip_conntrack | |||
171 | #endif /* CONFIG_IP_NF_NAT_NEEDED */ | 231 | #endif /* CONFIG_IP_NF_NAT_NEEDED */ |
172 | 232 | ||
173 | #if defined(CONFIG_IP_NF_CONNTRACK_MARK) | 233 | #if defined(CONFIG_IP_NF_CONNTRACK_MARK) |
174 | unsigned long mark; | 234 | u_int32_t mark; |
175 | #endif | 235 | #endif |
176 | 236 | ||
177 | /* Traversed often, so hopefully in different cacheline to top */ | 237 | /* Traversed often, so hopefully in different cacheline to top */ |
@@ -200,6 +260,9 @@ struct ip_conntrack_expect | |||
200 | /* Usage count. */ | 260 | /* Usage count. */ |
201 | atomic_t use; | 261 | atomic_t use; |
202 | 262 | ||
263 | /* Unique ID */ | ||
264 | unsigned int id; | ||
265 | |||
203 | #ifdef CONFIG_IP_NF_NAT_NEEDED | 266 | #ifdef CONFIG_IP_NF_NAT_NEEDED |
204 | /* This is the original per-proto part, used to map the | 267 | /* This is the original per-proto part, used to map the |
205 | * expected connection the way the recipient expects. */ | 268 | * expected connection the way the recipient expects. */ |
@@ -239,7 +302,12 @@ ip_conntrack_get(const struct sk_buff *skb, enum ip_conntrack_info *ctinfo) | |||
239 | } | 302 | } |
240 | 303 | ||
241 | /* decrement reference count on a conntrack */ | 304 | /* decrement reference count on a conntrack */ |
242 | extern void ip_conntrack_put(struct ip_conntrack *ct); | 305 | static inline void |
306 | ip_conntrack_put(struct ip_conntrack *ct) | ||
307 | { | ||
308 | IP_NF_ASSERT(ct); | ||
309 | nf_conntrack_put(&ct->ct_general); | ||
310 | } | ||
243 | 311 | ||
244 | /* call to create an explicit dependency on ip_conntrack. */ | 312 | /* call to create an explicit dependency on ip_conntrack. */ |
245 | extern void need_ip_conntrack(void); | 313 | extern void need_ip_conntrack(void); |
@@ -274,12 +342,50 @@ extern void | |||
274 | ip_ct_iterate_cleanup(int (*iter)(struct ip_conntrack *i, void *data), | 342 | ip_ct_iterate_cleanup(int (*iter)(struct ip_conntrack *i, void *data), |
275 | void *data); | 343 | void *data); |
276 | 344 | ||
345 | extern struct ip_conntrack_helper * | ||
346 | __ip_conntrack_helper_find_byname(const char *); | ||
347 | extern struct ip_conntrack_helper * | ||
348 | ip_conntrack_helper_find_get(const struct ip_conntrack_tuple *tuple); | ||
349 | extern void ip_conntrack_helper_put(struct ip_conntrack_helper *helper); | ||
350 | |||
351 | extern struct ip_conntrack_protocol * | ||
352 | __ip_conntrack_proto_find(u_int8_t protocol); | ||
353 | extern struct ip_conntrack_protocol * | ||
354 | ip_conntrack_proto_find_get(u_int8_t protocol); | ||
355 | extern void ip_conntrack_proto_put(struct ip_conntrack_protocol *proto); | ||
356 | |||
357 | extern void ip_ct_remove_expectations(struct ip_conntrack *ct); | ||
358 | |||
359 | extern struct ip_conntrack *ip_conntrack_alloc(struct ip_conntrack_tuple *, | ||
360 | struct ip_conntrack_tuple *); | ||
361 | |||
362 | extern void ip_conntrack_free(struct ip_conntrack *ct); | ||
363 | |||
364 | extern void ip_conntrack_hash_insert(struct ip_conntrack *ct); | ||
365 | |||
366 | extern struct ip_conntrack_expect * | ||
367 | __ip_conntrack_expect_find(const struct ip_conntrack_tuple *tuple); | ||
368 | |||
369 | extern struct ip_conntrack_expect * | ||
370 | ip_conntrack_expect_find_get(const struct ip_conntrack_tuple *tuple); | ||
371 | |||
372 | extern struct ip_conntrack_tuple_hash * | ||
373 | __ip_conntrack_find(const struct ip_conntrack_tuple *tuple, | ||
374 | const struct ip_conntrack *ignored_conntrack); | ||
375 | |||
376 | extern void ip_conntrack_flush(void); | ||
377 | |||
277 | /* It's confirmed if it is, or has been in the hash table. */ | 378 | /* It's confirmed if it is, or has been in the hash table. */ |
278 | static inline int is_confirmed(struct ip_conntrack *ct) | 379 | static inline int is_confirmed(struct ip_conntrack *ct) |
279 | { | 380 | { |
280 | return test_bit(IPS_CONFIRMED_BIT, &ct->status); | 381 | return test_bit(IPS_CONFIRMED_BIT, &ct->status); |
281 | } | 382 | } |
282 | 383 | ||
384 | static inline int is_dying(struct ip_conntrack *ct) | ||
385 | { | ||
386 | return test_bit(IPS_DYING_BIT, &ct->status); | ||
387 | } | ||
388 | |||
283 | extern unsigned int ip_conntrack_htable_size; | 389 | extern unsigned int ip_conntrack_htable_size; |
284 | 390 | ||
285 | struct ip_conntrack_stat | 391 | struct ip_conntrack_stat |
@@ -303,6 +409,85 @@ struct ip_conntrack_stat | |||
303 | 409 | ||
304 | #define CONNTRACK_STAT_INC(count) (__get_cpu_var(ip_conntrack_stat).count++) | 410 | #define CONNTRACK_STAT_INC(count) (__get_cpu_var(ip_conntrack_stat).count++) |
305 | 411 | ||
412 | #ifdef CONFIG_IP_NF_CONNTRACK_EVENTS | ||
413 | #include <linux/notifier.h> | ||
414 | #include <linux/interrupt.h> | ||
415 | |||
416 | struct ip_conntrack_ecache { | ||
417 | struct ip_conntrack *ct; | ||
418 | unsigned int events; | ||
419 | }; | ||
420 | DECLARE_PER_CPU(struct ip_conntrack_ecache, ip_conntrack_ecache); | ||
421 | |||
422 | #define CONNTRACK_ECACHE(x) (__get_cpu_var(ip_conntrack_ecache).x) | ||
423 | |||
424 | extern struct notifier_block *ip_conntrack_chain; | ||
425 | extern struct notifier_block *ip_conntrack_expect_chain; | ||
426 | |||
427 | static inline int ip_conntrack_register_notifier(struct notifier_block *nb) | ||
428 | { | ||
429 | return notifier_chain_register(&ip_conntrack_chain, nb); | ||
430 | } | ||
431 | |||
432 | static inline int ip_conntrack_unregister_notifier(struct notifier_block *nb) | ||
433 | { | ||
434 | return notifier_chain_unregister(&ip_conntrack_chain, nb); | ||
435 | } | ||
436 | |||
437 | static inline int | ||
438 | ip_conntrack_expect_register_notifier(struct notifier_block *nb) | ||
439 | { | ||
440 | return notifier_chain_register(&ip_conntrack_expect_chain, nb); | ||
441 | } | ||
442 | |||
443 | static inline int | ||
444 | ip_conntrack_expect_unregister_notifier(struct notifier_block *nb) | ||
445 | { | ||
446 | return notifier_chain_unregister(&ip_conntrack_expect_chain, nb); | ||
447 | } | ||
448 | |||
449 | extern void ip_ct_deliver_cached_events(const struct ip_conntrack *ct); | ||
450 | extern void __ip_ct_event_cache_init(struct ip_conntrack *ct); | ||
451 | |||
452 | static inline void | ||
453 | ip_conntrack_event_cache(enum ip_conntrack_events event, | ||
454 | const struct sk_buff *skb) | ||
455 | { | ||
456 | struct ip_conntrack *ct = (struct ip_conntrack *)skb->nfct; | ||
457 | struct ip_conntrack_ecache *ecache; | ||
458 | |||
459 | local_bh_disable(); | ||
460 | ecache = &__get_cpu_var(ip_conntrack_ecache); | ||
461 | if (ct != ecache->ct) | ||
462 | __ip_ct_event_cache_init(ct); | ||
463 | ecache->events |= event; | ||
464 | local_bh_enable(); | ||
465 | } | ||
466 | |||
467 | static inline void ip_conntrack_event(enum ip_conntrack_events event, | ||
468 | struct ip_conntrack *ct) | ||
469 | { | ||
470 | if (is_confirmed(ct) && !is_dying(ct)) | ||
471 | notifier_call_chain(&ip_conntrack_chain, event, ct); | ||
472 | } | ||
473 | |||
474 | static inline void | ||
475 | ip_conntrack_expect_event(enum ip_conntrack_expect_events event, | ||
476 | struct ip_conntrack_expect *exp) | ||
477 | { | ||
478 | notifier_call_chain(&ip_conntrack_expect_chain, event, exp); | ||
479 | } | ||
480 | #else /* CONFIG_IP_NF_CONNTRACK_EVENTS */ | ||
481 | static inline void ip_conntrack_event_cache(enum ip_conntrack_events event, | ||
482 | const struct sk_buff *skb) {} | ||
483 | static inline void ip_conntrack_event(enum ip_conntrack_events event, | ||
484 | struct ip_conntrack *ct) {} | ||
485 | static inline void ip_ct_deliver_cached_events(const struct ip_conntrack *ct) {} | ||
486 | static inline void | ||
487 | ip_conntrack_expect_event(enum ip_conntrack_expect_events event, | ||
488 | struct ip_conntrack_expect *exp) {} | ||
489 | #endif /* CONFIG_IP_NF_CONNTRACK_EVENTS */ | ||
490 | |||
306 | #ifdef CONFIG_IP_NF_NAT_NEEDED | 491 | #ifdef CONFIG_IP_NF_NAT_NEEDED |
307 | static inline int ip_nat_initialized(struct ip_conntrack *conntrack, | 492 | static inline int ip_nat_initialized(struct ip_conntrack *conntrack, |
308 | enum ip_nat_manip_type manip) | 493 | enum ip_nat_manip_type manip) |
diff --git a/include/linux/netfilter_ipv4/ip_conntrack_core.h b/include/linux/netfilter_ipv4/ip_conntrack_core.h index 694aec9b4784..dc4d2a0575de 100644 --- a/include/linux/netfilter_ipv4/ip_conntrack_core.h +++ b/include/linux/netfilter_ipv4/ip_conntrack_core.h | |||
@@ -2,6 +2,9 @@ | |||
2 | #define _IP_CONNTRACK_CORE_H | 2 | #define _IP_CONNTRACK_CORE_H |
3 | #include <linux/netfilter.h> | 3 | #include <linux/netfilter.h> |
4 | 4 | ||
5 | #define MAX_IP_CT_PROTO 256 | ||
6 | extern struct ip_conntrack_protocol *ip_ct_protos[MAX_IP_CT_PROTO]; | ||
7 | |||
5 | /* This header is used to share core functionality between the | 8 | /* This header is used to share core functionality between the |
6 | standalone connection tracking module, and the compatibility layer's use | 9 | standalone connection tracking module, and the compatibility layer's use |
7 | of connection tracking. */ | 10 | of connection tracking. */ |
@@ -38,12 +41,19 @@ extern int __ip_conntrack_confirm(struct sk_buff **pskb); | |||
38 | /* Confirm a connection: returns NF_DROP if packet must be dropped. */ | 41 | /* Confirm a connection: returns NF_DROP if packet must be dropped. */ |
39 | static inline int ip_conntrack_confirm(struct sk_buff **pskb) | 42 | static inline int ip_conntrack_confirm(struct sk_buff **pskb) |
40 | { | 43 | { |
41 | if ((*pskb)->nfct | 44 | struct ip_conntrack *ct = (struct ip_conntrack *)(*pskb)->nfct; |
42 | && !is_confirmed((struct ip_conntrack *)(*pskb)->nfct)) | 45 | int ret = NF_ACCEPT; |
43 | return __ip_conntrack_confirm(pskb); | 46 | |
44 | return NF_ACCEPT; | 47 | if (ct) { |
48 | if (!is_confirmed(ct)) | ||
49 | ret = __ip_conntrack_confirm(pskb); | ||
50 | ip_ct_deliver_cached_events(ct); | ||
51 | } | ||
52 | return ret; | ||
45 | } | 53 | } |
46 | 54 | ||
55 | extern void __ip_ct_expect_unlink_destroy(struct ip_conntrack_expect *exp); | ||
56 | |||
47 | extern struct list_head *ip_conntrack_hash; | 57 | extern struct list_head *ip_conntrack_hash; |
48 | extern struct list_head ip_conntrack_expect_list; | 58 | extern struct list_head ip_conntrack_expect_list; |
49 | extern rwlock_t ip_conntrack_lock; | 59 | extern rwlock_t ip_conntrack_lock; |
diff --git a/include/linux/netfilter_ipv4/ip_conntrack_helper.h b/include/linux/netfilter_ipv4/ip_conntrack_helper.h index 3692daa93dec..8d69279ccfe4 100644 --- a/include/linux/netfilter_ipv4/ip_conntrack_helper.h +++ b/include/linux/netfilter_ipv4/ip_conntrack_helper.h | |||
@@ -24,6 +24,8 @@ struct ip_conntrack_helper | |||
24 | int (*help)(struct sk_buff **pskb, | 24 | int (*help)(struct sk_buff **pskb, |
25 | struct ip_conntrack *ct, | 25 | struct ip_conntrack *ct, |
26 | enum ip_conntrack_info conntrackinfo); | 26 | enum ip_conntrack_info conntrackinfo); |
27 | |||
28 | int (*to_nfattr)(struct sk_buff *skb, const struct ip_conntrack *ct); | ||
27 | }; | 29 | }; |
28 | 30 | ||
29 | extern int ip_conntrack_helper_register(struct ip_conntrack_helper *); | 31 | extern int ip_conntrack_helper_register(struct ip_conntrack_helper *); |
diff --git a/include/linux/netfilter_ipv4/ip_conntrack_protocol.h b/include/linux/netfilter_ipv4/ip_conntrack_protocol.h index e20b57c5e1b7..b6b99be8632a 100644 --- a/include/linux/netfilter_ipv4/ip_conntrack_protocol.h +++ b/include/linux/netfilter_ipv4/ip_conntrack_protocol.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #ifndef _IP_CONNTRACK_PROTOCOL_H | 2 | #ifndef _IP_CONNTRACK_PROTOCOL_H |
3 | #define _IP_CONNTRACK_PROTOCOL_H | 3 | #define _IP_CONNTRACK_PROTOCOL_H |
4 | #include <linux/netfilter_ipv4/ip_conntrack.h> | 4 | #include <linux/netfilter_ipv4/ip_conntrack.h> |
5 | #include <linux/netfilter/nfnetlink_conntrack.h> | ||
5 | 6 | ||
6 | struct seq_file; | 7 | struct seq_file; |
7 | 8 | ||
@@ -47,22 +48,22 @@ struct ip_conntrack_protocol | |||
47 | int (*error)(struct sk_buff *skb, enum ip_conntrack_info *ctinfo, | 48 | int (*error)(struct sk_buff *skb, enum ip_conntrack_info *ctinfo, |
48 | unsigned int hooknum); | 49 | unsigned int hooknum); |
49 | 50 | ||
51 | /* convert protoinfo to nfnetink attributes */ | ||
52 | int (*to_nfattr)(struct sk_buff *skb, struct nfattr *nfa, | ||
53 | const struct ip_conntrack *ct); | ||
54 | |||
55 | int (*tuple_to_nfattr)(struct sk_buff *skb, | ||
56 | const struct ip_conntrack_tuple *t); | ||
57 | int (*nfattr_to_tuple)(struct nfattr *tb[], | ||
58 | struct ip_conntrack_tuple *t); | ||
59 | |||
50 | /* Module (if any) which this is connected to. */ | 60 | /* Module (if any) which this is connected to. */ |
51 | struct module *me; | 61 | struct module *me; |
52 | }; | 62 | }; |
53 | 63 | ||
54 | #define MAX_IP_CT_PROTO 256 | ||
55 | extern struct ip_conntrack_protocol *ip_ct_protos[MAX_IP_CT_PROTO]; | ||
56 | |||
57 | /* Protocol registration. */ | 64 | /* Protocol registration. */ |
58 | extern int ip_conntrack_protocol_register(struct ip_conntrack_protocol *proto); | 65 | extern int ip_conntrack_protocol_register(struct ip_conntrack_protocol *proto); |
59 | extern void ip_conntrack_protocol_unregister(struct ip_conntrack_protocol *proto); | 66 | extern void ip_conntrack_protocol_unregister(struct ip_conntrack_protocol *proto); |
60 | |||
61 | static inline struct ip_conntrack_protocol *ip_ct_find_proto(u_int8_t protocol) | ||
62 | { | ||
63 | return ip_ct_protos[protocol]; | ||
64 | } | ||
65 | |||
66 | /* Existing built-in protocols */ | 67 | /* Existing built-in protocols */ |
67 | extern struct ip_conntrack_protocol ip_conntrack_protocol_tcp; | 68 | extern struct ip_conntrack_protocol ip_conntrack_protocol_tcp; |
68 | extern struct ip_conntrack_protocol ip_conntrack_protocol_udp; | 69 | extern struct ip_conntrack_protocol ip_conntrack_protocol_udp; |
@@ -73,6 +74,11 @@ extern int ip_conntrack_protocol_tcp_init(void); | |||
73 | /* Log invalid packets */ | 74 | /* Log invalid packets */ |
74 | extern unsigned int ip_ct_log_invalid; | 75 | extern unsigned int ip_ct_log_invalid; |
75 | 76 | ||
77 | extern int ip_ct_port_tuple_to_nfattr(struct sk_buff *, | ||
78 | const struct ip_conntrack_tuple *); | ||
79 | extern int ip_ct_port_nfattr_to_tuple(struct nfattr *tb[], | ||
80 | struct ip_conntrack_tuple *); | ||
81 | |||
76 | #ifdef CONFIG_SYSCTL | 82 | #ifdef CONFIG_SYSCTL |
77 | #ifdef DEBUG_INVALID_PACKETS | 83 | #ifdef DEBUG_INVALID_PACKETS |
78 | #define LOG_INVALID(proto) \ | 84 | #define LOG_INVALID(proto) \ |
diff --git a/include/linux/netfilter_ipv4/ip_logging.h b/include/linux/netfilter_ipv4/ip_logging.h deleted file mode 100644 index 0c5c52cb6589..000000000000 --- a/include/linux/netfilter_ipv4/ip_logging.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* IPv4 macros for the internal logging interface. */ | ||
2 | #ifndef __IP_LOGGING_H | ||
3 | #define __IP_LOGGING_H | ||
4 | |||
5 | #ifdef __KERNEL__ | ||
6 | #include <linux/socket.h> | ||
7 | #include <linux/netfilter_logging.h> | ||
8 | |||
9 | #define nf_log_ip_packet(pskb,hooknum,in,out,fmt,args...) \ | ||
10 | nf_log_packet(AF_INET,pskb,hooknum,in,out,fmt,##args) | ||
11 | |||
12 | #define nf_log_ip(pfh,len,fmt,args...) \ | ||
13 | nf_log(AF_INET,pfh,len,fmt,##args) | ||
14 | |||
15 | #define nf_ip_log_register(logging) nf_log_register(AF_INET,logging) | ||
16 | #define nf_ip_log_unregister(logging) nf_log_unregister(AF_INET,logging) | ||
17 | |||
18 | #endif /*__KERNEL__*/ | ||
19 | |||
20 | #endif /*__IP_LOGGING_H*/ | ||
diff --git a/include/linux/netfilter_ipv4/ip_nat_protocol.h b/include/linux/netfilter_ipv4/ip_nat_protocol.h index 129708c22386..ef63aa991a06 100644 --- a/include/linux/netfilter_ipv4/ip_nat_protocol.h +++ b/include/linux/netfilter_ipv4/ip_nat_protocol.h | |||
@@ -4,6 +4,9 @@ | |||
4 | #include <linux/init.h> | 4 | #include <linux/init.h> |
5 | #include <linux/list.h> | 5 | #include <linux/list.h> |
6 | 6 | ||
7 | #include <linux/netfilter_ipv4/ip_nat.h> | ||
8 | #include <linux/netfilter/nfnetlink_conntrack.h> | ||
9 | |||
7 | struct iphdr; | 10 | struct iphdr; |
8 | struct ip_nat_range; | 11 | struct ip_nat_range; |
9 | 12 | ||
@@ -15,6 +18,8 @@ struct ip_nat_protocol | |||
15 | /* Protocol number. */ | 18 | /* Protocol number. */ |
16 | unsigned int protonum; | 19 | unsigned int protonum; |
17 | 20 | ||
21 | struct module *me; | ||
22 | |||
18 | /* Translate a packet to the target according to manip type. | 23 | /* Translate a packet to the target according to manip type. |
19 | Return true if succeeded. */ | 24 | Return true if succeeded. */ |
20 | int (*manip_pkt)(struct sk_buff **pskb, | 25 | int (*manip_pkt)(struct sk_buff **pskb, |
@@ -43,19 +48,20 @@ struct ip_nat_protocol | |||
43 | 48 | ||
44 | unsigned int (*print_range)(char *buffer, | 49 | unsigned int (*print_range)(char *buffer, |
45 | const struct ip_nat_range *range); | 50 | const struct ip_nat_range *range); |
46 | }; | ||
47 | 51 | ||
48 | #define MAX_IP_NAT_PROTO 256 | 52 | int (*range_to_nfattr)(struct sk_buff *skb, |
49 | extern struct ip_nat_protocol *ip_nat_protos[MAX_IP_NAT_PROTO]; | 53 | const struct ip_nat_range *range); |
54 | |||
55 | int (*nfattr_to_range)(struct nfattr *tb[], | ||
56 | struct ip_nat_range *range); | ||
57 | }; | ||
50 | 58 | ||
51 | /* Protocol registration. */ | 59 | /* Protocol registration. */ |
52 | extern int ip_nat_protocol_register(struct ip_nat_protocol *proto); | 60 | extern int ip_nat_protocol_register(struct ip_nat_protocol *proto); |
53 | extern void ip_nat_protocol_unregister(struct ip_nat_protocol *proto); | 61 | extern void ip_nat_protocol_unregister(struct ip_nat_protocol *proto); |
54 | 62 | ||
55 | static inline struct ip_nat_protocol *ip_nat_find_proto(u_int8_t protocol) | 63 | extern struct ip_nat_protocol *ip_nat_proto_find_get(u_int8_t protocol); |
56 | { | 64 | extern void ip_nat_proto_put(struct ip_nat_protocol *proto); |
57 | return ip_nat_protos[protocol]; | ||
58 | } | ||
59 | 65 | ||
60 | /* Built-in protocols. */ | 66 | /* Built-in protocols. */ |
61 | extern struct ip_nat_protocol ip_nat_protocol_tcp; | 67 | extern struct ip_nat_protocol ip_nat_protocol_tcp; |
@@ -67,4 +73,9 @@ extern int init_protocols(void) __init; | |||
67 | extern void cleanup_protocols(void); | 73 | extern void cleanup_protocols(void); |
68 | extern struct ip_nat_protocol *find_nat_proto(u_int16_t protonum); | 74 | extern struct ip_nat_protocol *find_nat_proto(u_int16_t protonum); |
69 | 75 | ||
76 | extern int ip_nat_port_range_to_nfattr(struct sk_buff *skb, | ||
77 | const struct ip_nat_range *range); | ||
78 | extern int ip_nat_port_nfattr_to_range(struct nfattr *tb[], | ||
79 | struct ip_nat_range *range); | ||
80 | |||
70 | #endif /*_IP_NAT_PROTO_H*/ | 81 | #endif /*_IP_NAT_PROTO_H*/ |
diff --git a/include/linux/netfilter_ipv4/ip_tables.h b/include/linux/netfilter_ipv4/ip_tables.h index 12ce47808e7d..d19d65cf4530 100644 --- a/include/linux/netfilter_ipv4/ip_tables.h +++ b/include/linux/netfilter_ipv4/ip_tables.h | |||
@@ -109,7 +109,8 @@ struct ipt_counters | |||
109 | 109 | ||
110 | /* Values for "flag" field in struct ipt_ip (general ip structure). */ | 110 | /* Values for "flag" field in struct ipt_ip (general ip structure). */ |
111 | #define IPT_F_FRAG 0x01 /* Set if rule is a fragment rule */ | 111 | #define IPT_F_FRAG 0x01 /* Set if rule is a fragment rule */ |
112 | #define IPT_F_MASK 0x01 /* All possible flag bits mask. */ | 112 | #define IPT_F_GOTO 0x02 /* Set if jump is a goto */ |
113 | #define IPT_F_MASK 0x03 /* All possible flag bits mask. */ | ||
113 | 114 | ||
114 | /* Values for "inv" field in struct ipt_ip. */ | 115 | /* Values for "inv" field in struct ipt_ip. */ |
115 | #define IPT_INV_VIA_IN 0x01 /* Invert the sense of IN IFACE. */ | 116 | #define IPT_INV_VIA_IN 0x01 /* Invert the sense of IN IFACE. */ |
diff --git a/include/linux/netfilter_ipv4/ipt_LOG.h b/include/linux/netfilter_ipv4/ipt_LOG.h index d25f782e57d1..22d16177319b 100644 --- a/include/linux/netfilter_ipv4/ipt_LOG.h +++ b/include/linux/netfilter_ipv4/ipt_LOG.h | |||
@@ -1,6 +1,7 @@ | |||
1 | #ifndef _IPT_LOG_H | 1 | #ifndef _IPT_LOG_H |
2 | #define _IPT_LOG_H | 2 | #define _IPT_LOG_H |
3 | 3 | ||
4 | /* make sure not to change this without changing netfilter.h:NF_LOG_* (!) */ | ||
4 | #define IPT_LOG_TCPSEQ 0x01 /* Log TCP sequence numbers */ | 5 | #define IPT_LOG_TCPSEQ 0x01 /* Log TCP sequence numbers */ |
5 | #define IPT_LOG_TCPOPT 0x02 /* Log TCP options */ | 6 | #define IPT_LOG_TCPOPT 0x02 /* Log TCP options */ |
6 | #define IPT_LOG_IPOPT 0x04 /* Log IP options */ | 7 | #define IPT_LOG_IPOPT 0x04 /* Log IP options */ |
diff --git a/include/linux/netfilter_ipv4/ipt_NFQUEUE.h b/include/linux/netfilter_ipv4/ipt_NFQUEUE.h new file mode 100644 index 000000000000..b5b2943b0c66 --- /dev/null +++ b/include/linux/netfilter_ipv4/ipt_NFQUEUE.h | |||
@@ -0,0 +1,16 @@ | |||
1 | /* iptables module for using NFQUEUE mechanism | ||
2 | * | ||
3 | * (C) 2005 Harald Welte <laforge@netfilter.org> | ||
4 | * | ||
5 | * This software is distributed under GNU GPL v2, 1991 | ||
6 | * | ||
7 | */ | ||
8 | #ifndef _IPT_NFQ_TARGET_H | ||
9 | #define _IPT_NFQ_TARGET_H | ||
10 | |||
11 | /* target info */ | ||
12 | struct ipt_NFQ_info { | ||
13 | u_int16_t queuenum; | ||
14 | }; | ||
15 | |||
16 | #endif /* _IPT_DSCP_TARGET_H */ | ||
diff --git a/include/linux/netfilter_ipv4/ipt_TTL.h b/include/linux/netfilter_ipv4/ipt_TTL.h new file mode 100644 index 000000000000..ee6611edc112 --- /dev/null +++ b/include/linux/netfilter_ipv4/ipt_TTL.h | |||
@@ -0,0 +1,21 @@ | |||
1 | /* TTL modification module for IP tables | ||
2 | * (C) 2000 by Harald Welte <laforge@netfilter.org> */ | ||
3 | |||
4 | #ifndef _IPT_TTL_H | ||
5 | #define _IPT_TTL_H | ||
6 | |||
7 | enum { | ||
8 | IPT_TTL_SET = 0, | ||
9 | IPT_TTL_INC, | ||
10 | IPT_TTL_DEC | ||
11 | }; | ||
12 | |||
13 | #define IPT_TTL_MAXMODE IPT_TTL_DEC | ||
14 | |||
15 | struct ipt_TTL_info { | ||
16 | u_int8_t mode; | ||
17 | u_int8_t ttl; | ||
18 | }; | ||
19 | |||
20 | |||
21 | #endif | ||
diff --git a/include/linux/netfilter_ipv4/ipt_connbytes.h b/include/linux/netfilter_ipv4/ipt_connbytes.h new file mode 100644 index 000000000000..9e5532f8d8ac --- /dev/null +++ b/include/linux/netfilter_ipv4/ipt_connbytes.h | |||
@@ -0,0 +1,25 @@ | |||
1 | #ifndef _IPT_CONNBYTES_H | ||
2 | #define _IPT_CONNBYTES_H | ||
3 | |||
4 | enum ipt_connbytes_what { | ||
5 | IPT_CONNBYTES_PKTS, | ||
6 | IPT_CONNBYTES_BYTES, | ||
7 | IPT_CONNBYTES_AVGPKT, | ||
8 | }; | ||
9 | |||
10 | enum ipt_connbytes_direction { | ||
11 | IPT_CONNBYTES_DIR_ORIGINAL, | ||
12 | IPT_CONNBYTES_DIR_REPLY, | ||
13 | IPT_CONNBYTES_DIR_BOTH, | ||
14 | }; | ||
15 | |||
16 | struct ipt_connbytes_info | ||
17 | { | ||
18 | struct { | ||
19 | aligned_u64 from; /* count to be matched */ | ||
20 | aligned_u64 to; /* count to be matched */ | ||
21 | } count; | ||
22 | u_int8_t what; /* ipt_connbytes_what */ | ||
23 | u_int8_t direction; /* ipt_connbytes_direction */ | ||
24 | }; | ||
25 | #endif | ||
diff --git a/include/linux/netfilter_ipv4/ipt_dccp.h b/include/linux/netfilter_ipv4/ipt_dccp.h new file mode 100644 index 000000000000..3cb3a522e62b --- /dev/null +++ b/include/linux/netfilter_ipv4/ipt_dccp.h | |||
@@ -0,0 +1,23 @@ | |||
1 | #ifndef _IPT_DCCP_H_ | ||
2 | #define _IPT_DCCP_H_ | ||
3 | |||
4 | #define IPT_DCCP_SRC_PORTS 0x01 | ||
5 | #define IPT_DCCP_DEST_PORTS 0x02 | ||
6 | #define IPT_DCCP_TYPE 0x04 | ||
7 | #define IPT_DCCP_OPTION 0x08 | ||
8 | |||
9 | #define IPT_DCCP_VALID_FLAGS 0x0f | ||
10 | |||
11 | struct ipt_dccp_info { | ||
12 | u_int16_t dpts[2]; /* Min, Max */ | ||
13 | u_int16_t spts[2]; /* Min, Max */ | ||
14 | |||
15 | u_int16_t flags; | ||
16 | u_int16_t invflags; | ||
17 | |||
18 | u_int16_t typemask; | ||
19 | u_int8_t option; | ||
20 | }; | ||
21 | |||
22 | #endif /* _IPT_DCCP_H_ */ | ||
23 | |||
diff --git a/include/linux/netfilter_ipv4/ipt_string.h b/include/linux/netfilter_ipv4/ipt_string.h new file mode 100644 index 000000000000..a265f6e44eab --- /dev/null +++ b/include/linux/netfilter_ipv4/ipt_string.h | |||
@@ -0,0 +1,18 @@ | |||
1 | #ifndef _IPT_STRING_H | ||
2 | #define _IPT_STRING_H | ||
3 | |||
4 | #define IPT_STRING_MAX_PATTERN_SIZE 128 | ||
5 | #define IPT_STRING_MAX_ALGO_NAME_SIZE 16 | ||
6 | |||
7 | struct ipt_string_info | ||
8 | { | ||
9 | u_int16_t from_offset; | ||
10 | u_int16_t to_offset; | ||
11 | char algo[IPT_STRING_MAX_ALGO_NAME_SIZE]; | ||
12 | char pattern[IPT_STRING_MAX_PATTERN_SIZE]; | ||
13 | u_int8_t patlen; | ||
14 | u_int8_t invert; | ||
15 | struct ts_config __attribute__((aligned(8))) *config; | ||
16 | }; | ||
17 | |||
18 | #endif /*_IPT_STRING_H*/ | ||
diff --git a/include/linux/netfilter_ipv6.h b/include/linux/netfilter_ipv6.h index bee7a5ec7c66..edcc2c6eb5c7 100644 --- a/include/linux/netfilter_ipv6.h +++ b/include/linux/netfilter_ipv6.h | |||
@@ -10,6 +10,8 @@ | |||
10 | 10 | ||
11 | #include <linux/netfilter.h> | 11 | #include <linux/netfilter.h> |
12 | 12 | ||
13 | /* only for userspace compatibility */ | ||
14 | #ifndef __KERNEL__ | ||
13 | /* IP Cache bits. */ | 15 | /* IP Cache bits. */ |
14 | /* Src IP address. */ | 16 | /* Src IP address. */ |
15 | #define NFC_IP6_SRC 0x0001 | 17 | #define NFC_IP6_SRC 0x0001 |
@@ -38,6 +40,7 @@ | |||
38 | #define NFC_IP6_DST_PT 0x0400 | 40 | #define NFC_IP6_DST_PT 0x0400 |
39 | /* Something else about the proto */ | 41 | /* Something else about the proto */ |
40 | #define NFC_IP6_PROTO_UNKNOWN 0x2000 | 42 | #define NFC_IP6_PROTO_UNKNOWN 0x2000 |
43 | #endif /* ! __KERNEL__ */ | ||
41 | 44 | ||
42 | 45 | ||
43 | /* IP6 Hooks */ | 46 | /* IP6 Hooks */ |
@@ -68,4 +71,7 @@ enum nf_ip6_hook_priorities { | |||
68 | NF_IP6_PRI_LAST = INT_MAX, | 71 | NF_IP6_PRI_LAST = INT_MAX, |
69 | }; | 72 | }; |
70 | 73 | ||
74 | extern int ipv6_netfilter_init(void); | ||
75 | extern void ipv6_netfilter_fini(void); | ||
76 | |||
71 | #endif /*__LINUX_IP6_NETFILTER_H*/ | 77 | #endif /*__LINUX_IP6_NETFILTER_H*/ |
diff --git a/include/linux/netfilter_ipv6/ip6_logging.h b/include/linux/netfilter_ipv6/ip6_logging.h deleted file mode 100644 index a0b2ee3043aa..000000000000 --- a/include/linux/netfilter_ipv6/ip6_logging.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* IPv6 macros for the nternal logging interface. */ | ||
2 | #ifndef __IP6_LOGGING_H | ||
3 | #define __IP6_LOGGING_H | ||
4 | |||
5 | #ifdef __KERNEL__ | ||
6 | #include <linux/socket.h> | ||
7 | #include <linux/netfilter_logging.h> | ||
8 | |||
9 | #define nf_log_ip6_packet(pskb,hooknum,in,out,fmt,args...) \ | ||
10 | nf_log_packet(AF_INET6,pskb,hooknum,in,out,fmt,##args) | ||
11 | |||
12 | #define nf_log_ip6(pfh,len,fmt,args...) \ | ||
13 | nf_log(AF_INET6,pfh,len,fmt,##args) | ||
14 | |||
15 | #define nf_ip6_log_register(logging) nf_log_register(AF_INET6,logging) | ||
16 | #define nf_ip6_log_unregister(logging) nf_log_unregister(AF_INET6,logging) | ||
17 | |||
18 | #endif /*__KERNEL__*/ | ||
19 | |||
20 | #endif /*__IP6_LOGGING_H*/ | ||
diff --git a/include/linux/netfilter_ipv6/ip6_tables.h b/include/linux/netfilter_ipv6/ip6_tables.h index f1ce3b009853..58c72a52dc65 100644 --- a/include/linux/netfilter_ipv6/ip6_tables.h +++ b/include/linux/netfilter_ipv6/ip6_tables.h | |||
@@ -111,7 +111,8 @@ struct ip6t_counters | |||
111 | #define IP6T_F_PROTO 0x01 /* Set if rule cares about upper | 111 | #define IP6T_F_PROTO 0x01 /* Set if rule cares about upper |
112 | protocols */ | 112 | protocols */ |
113 | #define IP6T_F_TOS 0x02 /* Match the TOS. */ | 113 | #define IP6T_F_TOS 0x02 /* Match the TOS. */ |
114 | #define IP6T_F_MASK 0x03 /* All possible flag bits mask. */ | 114 | #define IP6T_F_GOTO 0x04 /* Set if jump is a goto */ |
115 | #define IP6T_F_MASK 0x07 /* All possible flag bits mask. */ | ||
115 | 116 | ||
116 | /* Values for "inv" field in struct ip6t_ip6. */ | 117 | /* Values for "inv" field in struct ip6t_ip6. */ |
117 | #define IP6T_INV_VIA_IN 0x01 /* Invert the sense of IN IFACE. */ | 118 | #define IP6T_INV_VIA_IN 0x01 /* Invert the sense of IN IFACE. */ |
diff --git a/include/linux/netfilter_ipv6/ip6t_HL.h b/include/linux/netfilter_ipv6/ip6t_HL.h new file mode 100644 index 000000000000..afb7813d45ab --- /dev/null +++ b/include/linux/netfilter_ipv6/ip6t_HL.h | |||
@@ -0,0 +1,22 @@ | |||
1 | /* Hop Limit modification module for ip6tables | ||
2 | * Maciej Soltysiak <solt@dns.toxicfilms.tv> | ||
3 | * Based on HW's TTL module */ | ||
4 | |||
5 | #ifndef _IP6T_HL_H | ||
6 | #define _IP6T_HL_H | ||
7 | |||
8 | enum { | ||
9 | IP6T_HL_SET = 0, | ||
10 | IP6T_HL_INC, | ||
11 | IP6T_HL_DEC | ||
12 | }; | ||
13 | |||
14 | #define IP6T_HL_MAXMODE IP6T_HL_DEC | ||
15 | |||
16 | struct ip6t_HL_info { | ||
17 | u_int8_t mode; | ||
18 | u_int8_t hop_limit; | ||
19 | }; | ||
20 | |||
21 | |||
22 | #endif | ||
diff --git a/include/linux/netfilter_ipv6/ip6t_LOG.h b/include/linux/netfilter_ipv6/ip6t_LOG.h index 42996a43bb39..9008ff5c40ae 100644 --- a/include/linux/netfilter_ipv6/ip6t_LOG.h +++ b/include/linux/netfilter_ipv6/ip6t_LOG.h | |||
@@ -1,6 +1,7 @@ | |||
1 | #ifndef _IP6T_LOG_H | 1 | #ifndef _IP6T_LOG_H |
2 | #define _IP6T_LOG_H | 2 | #define _IP6T_LOG_H |
3 | 3 | ||
4 | /* make sure not to change this without changing netfilter.h:NF_LOG_* (!) */ | ||
4 | #define IP6T_LOG_TCPSEQ 0x01 /* Log TCP sequence numbers */ | 5 | #define IP6T_LOG_TCPSEQ 0x01 /* Log TCP sequence numbers */ |
5 | #define IP6T_LOG_TCPOPT 0x02 /* Log TCP options */ | 6 | #define IP6T_LOG_TCPOPT 0x02 /* Log TCP options */ |
6 | #define IP6T_LOG_IPOPT 0x04 /* Log IP options */ | 7 | #define IP6T_LOG_IPOPT 0x04 /* Log IP options */ |
diff --git a/include/linux/netfilter_ipv6/ip6t_REJECT.h b/include/linux/netfilter_ipv6/ip6t_REJECT.h new file mode 100644 index 000000000000..6be6504162bb --- /dev/null +++ b/include/linux/netfilter_ipv6/ip6t_REJECT.h | |||
@@ -0,0 +1,18 @@ | |||
1 | #ifndef _IP6T_REJECT_H | ||
2 | #define _IP6T_REJECT_H | ||
3 | |||
4 | enum ip6t_reject_with { | ||
5 | IP6T_ICMP6_NO_ROUTE, | ||
6 | IP6T_ICMP6_ADM_PROHIBITED, | ||
7 | IP6T_ICMP6_NOT_NEIGHBOUR, | ||
8 | IP6T_ICMP6_ADDR_UNREACH, | ||
9 | IP6T_ICMP6_PORT_UNREACH, | ||
10 | IP6T_ICMP6_ECHOREPLY, | ||
11 | IP6T_TCP_RESET | ||
12 | }; | ||
13 | |||
14 | struct ip6t_reject_info { | ||
15 | u_int32_t with; /* reject type */ | ||
16 | }; | ||
17 | |||
18 | #endif /*_IP6T_REJECT_H*/ | ||
diff --git a/include/linux/netlink.h b/include/linux/netlink.h index 6552b71bfa73..167518668936 100644 --- a/include/linux/netlink.h +++ b/include/linux/netlink.h | |||
@@ -8,7 +8,7 @@ | |||
8 | #define NETLINK_W1 1 /* 1-wire subsystem */ | 8 | #define NETLINK_W1 1 /* 1-wire subsystem */ |
9 | #define NETLINK_USERSOCK 2 /* Reserved for user mode socket protocols */ | 9 | #define NETLINK_USERSOCK 2 /* Reserved for user mode socket protocols */ |
10 | #define NETLINK_FIREWALL 3 /* Firewalling hook */ | 10 | #define NETLINK_FIREWALL 3 /* Firewalling hook */ |
11 | #define NETLINK_TCPDIAG 4 /* TCP socket monitoring */ | 11 | #define NETLINK_INET_DIAG 4 /* INET socket monitoring */ |
12 | #define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */ | 12 | #define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */ |
13 | #define NETLINK_XFRM 6 /* ipsec */ | 13 | #define NETLINK_XFRM 6 /* ipsec */ |
14 | #define NETLINK_SELINUX 7 /* SELinux event notifications */ | 14 | #define NETLINK_SELINUX 7 /* SELinux event notifications */ |
@@ -90,6 +90,15 @@ struct nlmsgerr | |||
90 | struct nlmsghdr msg; | 90 | struct nlmsghdr msg; |
91 | }; | 91 | }; |
92 | 92 | ||
93 | #define NETLINK_ADD_MEMBERSHIP 1 | ||
94 | #define NETLINK_DROP_MEMBERSHIP 2 | ||
95 | #define NETLINK_PKTINFO 3 | ||
96 | |||
97 | struct nl_pktinfo | ||
98 | { | ||
99 | __u32 group; | ||
100 | }; | ||
101 | |||
93 | #define NET_MAJOR 36 /* Major 36 is reserved for networking */ | 102 | #define NET_MAJOR 36 /* Major 36 is reserved for networking */ |
94 | 103 | ||
95 | enum { | 104 | enum { |
@@ -106,9 +115,8 @@ struct netlink_skb_parms | |||
106 | { | 115 | { |
107 | struct ucred creds; /* Skb credentials */ | 116 | struct ucred creds; /* Skb credentials */ |
108 | __u32 pid; | 117 | __u32 pid; |
109 | __u32 groups; | ||
110 | __u32 dst_pid; | 118 | __u32 dst_pid; |
111 | __u32 dst_groups; | 119 | __u32 dst_group; |
112 | kernel_cap_t eff_cap; | 120 | kernel_cap_t eff_cap; |
113 | __u32 loginuid; /* Login (audit) uid */ | 121 | __u32 loginuid; /* Login (audit) uid */ |
114 | }; | 122 | }; |
@@ -117,11 +125,11 @@ struct netlink_skb_parms | |||
117 | #define NETLINK_CREDS(skb) (&NETLINK_CB((skb)).creds) | 125 | #define NETLINK_CREDS(skb) (&NETLINK_CB((skb)).creds) |
118 | 126 | ||
119 | 127 | ||
120 | extern struct sock *netlink_kernel_create(int unit, void (*input)(struct sock *sk, int len)); | 128 | extern struct sock *netlink_kernel_create(int unit, unsigned int groups, void (*input)(struct sock *sk, int len), struct module *module); |
121 | extern void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err); | 129 | extern void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err); |
122 | extern int netlink_unicast(struct sock *ssk, struct sk_buff *skb, __u32 pid, int nonblock); | 130 | extern int netlink_unicast(struct sock *ssk, struct sk_buff *skb, __u32 pid, int nonblock); |
123 | extern int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, __u32 pid, | 131 | extern int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, __u32 pid, |
124 | __u32 group, int allocation); | 132 | __u32 group, unsigned int __nocast allocation); |
125 | extern void netlink_set_err(struct sock *ssk, __u32 pid, __u32 group, int code); | 133 | extern void netlink_set_err(struct sock *ssk, __u32 pid, __u32 group, int code); |
126 | extern int netlink_register_notifier(struct notifier_block *nb); | 134 | extern int netlink_register_notifier(struct notifier_block *nb); |
127 | extern int netlink_unregister_notifier(struct notifier_block *nb); | 135 | extern int netlink_unregister_notifier(struct notifier_block *nb); |
diff --git a/include/linux/random.h b/include/linux/random.h index cc6703449916..7b2adb3322d5 100644 --- a/include/linux/random.h +++ b/include/linux/random.h | |||
@@ -59,6 +59,8 @@ extern __u32 secure_tcp_sequence_number(__u32 saddr, __u32 daddr, | |||
59 | __u16 sport, __u16 dport); | 59 | __u16 sport, __u16 dport); |
60 | extern __u32 secure_tcpv6_sequence_number(__u32 *saddr, __u32 *daddr, | 60 | extern __u32 secure_tcpv6_sequence_number(__u32 *saddr, __u32 *daddr, |
61 | __u16 sport, __u16 dport); | 61 | __u16 sport, __u16 dport); |
62 | extern u64 secure_dccp_sequence_number(__u32 saddr, __u32 daddr, | ||
63 | __u16 sport, __u16 dport); | ||
62 | 64 | ||
63 | #ifndef MODULE | 65 | #ifndef MODULE |
64 | extern struct file_operations random_fops, urandom_fops; | 66 | extern struct file_operations random_fops, urandom_fops; |
diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h index 657c05ab8f9e..c231e9a08f0b 100644 --- a/include/linux/rtnetlink.h +++ b/include/linux/rtnetlink.h | |||
@@ -826,9 +826,8 @@ enum | |||
826 | #define TCA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcmsg)))) | 826 | #define TCA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcmsg)))) |
827 | #define TCA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcmsg)) | 827 | #define TCA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcmsg)) |
828 | 828 | ||
829 | 829 | #ifndef __KERNEL__ | |
830 | /* RTnetlink multicast groups */ | 830 | /* RTnetlink multicast groups - backwards compatibility for userspace */ |
831 | |||
832 | #define RTMGRP_LINK 1 | 831 | #define RTMGRP_LINK 1 |
833 | #define RTMGRP_NOTIFY 2 | 832 | #define RTMGRP_NOTIFY 2 |
834 | #define RTMGRP_NEIGH 4 | 833 | #define RTMGRP_NEIGH 4 |
@@ -847,6 +846,43 @@ enum | |||
847 | #define RTMGRP_DECnet_ROUTE 0x4000 | 846 | #define RTMGRP_DECnet_ROUTE 0x4000 |
848 | 847 | ||
849 | #define RTMGRP_IPV6_PREFIX 0x20000 | 848 | #define RTMGRP_IPV6_PREFIX 0x20000 |
849 | #endif | ||
850 | |||
851 | /* RTnetlink multicast groups */ | ||
852 | enum rtnetlink_groups { | ||
853 | RTNLGRP_NONE, | ||
854 | #define RTNLGRP_NONE RTNLGRP_NONE | ||
855 | RTNLGRP_LINK, | ||
856 | #define RTNLGRP_LINK RTNLGRP_LINK | ||
857 | RTNLGRP_NOTIFY, | ||
858 | #define RTNLGRP_NOTIFY RTNLGRP_NOTIFY | ||
859 | RTNLGRP_NEIGH, | ||
860 | #define RTNLGRP_NEIGH RTNLGRP_NEIGH | ||
861 | RTNLGRP_TC, | ||
862 | #define RTNLGRP_TC RTNLGRP_TC | ||
863 | RTNLGRP_IPV4_IFADDR, | ||
864 | #define RTNLGRP_IPV4_IFADDR RTNLGRP_IPV4_IFADDR | ||
865 | RTNLGRP_IPV4_MROUTE, | ||
866 | #define RTNLGRP_IPV4_MROUTE RTNLGRP_IPV4_MROUTE | ||
867 | RTNLGRP_IPV4_ROUTE, | ||
868 | #define RTNLGRP_IPV4_ROUTE RTNLGRP_IPV4_ROUTE | ||
869 | RTNLGRP_IPV6_IFADDR, | ||
870 | #define RTNLGRP_IPV6_IFADDR RTNLGRP_IPV6_IFADDR | ||
871 | RTNLGRP_IPV6_MROUTE, | ||
872 | #define RTNLGRP_IPV6_MROUTE RTNLGRP_IPV6_MROUTE | ||
873 | RTNLGRP_IPV6_ROUTE, | ||
874 | #define RTNLGRP_IPV6_ROUTE RTNLGRP_IPV6_ROUTE | ||
875 | RTNLGRP_IPV6_IFINFO, | ||
876 | #define RTNLGRP_IPV6_IFINFO RTNLGRP_IPV6_IFINFO | ||
877 | RTNLGRP_DECnet_IFADDR, | ||
878 | #define RTNLGRP_DECnet_IFADDR RTNLGRP_DECnet_IFADDR | ||
879 | RTNLGRP_DECnet_ROUTE, | ||
880 | #define RTNLGRP_DECnet_ROUTE RTNLGRP_DECnet_ROUTE | ||
881 | RTNLGRP_IPV6_PREFIX, | ||
882 | #define RTNLGRP_IPV6_PREFIX RTNLGRP_IPV6_PREFIX | ||
883 | __RTNLGRP_MAX | ||
884 | }; | ||
885 | #define RTNLGRP_MAX (__RTNLGRP_MAX - 1) | ||
850 | 886 | ||
851 | /* TC action piece */ | 887 | /* TC action piece */ |
852 | struct tcamsg | 888 | struct tcamsg |
diff --git a/include/linux/security.h b/include/linux/security.h index b42095a68b1c..7aab6ab7c57f 100644 --- a/include/linux/security.h +++ b/include/linux/security.h | |||
@@ -2727,7 +2727,8 @@ static inline int security_socket_getpeersec(struct socket *sock, char __user *o | |||
2727 | return security_ops->socket_getpeersec(sock, optval, optlen, len); | 2727 | return security_ops->socket_getpeersec(sock, optval, optlen, len); |
2728 | } | 2728 | } |
2729 | 2729 | ||
2730 | static inline int security_sk_alloc(struct sock *sk, int family, int priority) | 2730 | static inline int security_sk_alloc(struct sock *sk, int family, |
2731 | unsigned int __nocast priority) | ||
2731 | { | 2732 | { |
2732 | return security_ops->sk_alloc_security(sk, family, priority); | 2733 | return security_ops->sk_alloc_security(sk, family, priority); |
2733 | } | 2734 | } |
@@ -2844,7 +2845,8 @@ static inline int security_socket_getpeersec(struct socket *sock, char __user *o | |||
2844 | return -ENOPROTOOPT; | 2845 | return -ENOPROTOOPT; |
2845 | } | 2846 | } |
2846 | 2847 | ||
2847 | static inline int security_sk_alloc(struct sock *sk, int family, int priority) | 2848 | static inline int security_sk_alloc(struct sock *sk, int family, |
2849 | unsigned int __nocast priority) | ||
2848 | { | 2850 | { |
2849 | return 0; | 2851 | return 0; |
2850 | } | 2852 | } |
diff --git a/include/linux/selinux_netlink.h b/include/linux/selinux_netlink.h index 957e6ebca4e6..bbf489decd84 100644 --- a/include/linux/selinux_netlink.h +++ b/include/linux/selinux_netlink.h | |||
@@ -20,10 +20,21 @@ enum { | |||
20 | SELNL_MSG_MAX | 20 | SELNL_MSG_MAX |
21 | }; | 21 | }; |
22 | 22 | ||
23 | /* Multicast groups */ | 23 | #ifndef __KERNEL__ |
24 | /* Multicast groups - backwards compatiblility for userspace */ | ||
24 | #define SELNL_GRP_NONE 0x00000000 | 25 | #define SELNL_GRP_NONE 0x00000000 |
25 | #define SELNL_GRP_AVC 0x00000001 /* AVC notifications */ | 26 | #define SELNL_GRP_AVC 0x00000001 /* AVC notifications */ |
26 | #define SELNL_GRP_ALL 0xffffffff | 27 | #define SELNL_GRP_ALL 0xffffffff |
28 | #endif | ||
29 | |||
30 | enum selinux_nlgroups { | ||
31 | SELNLGRP_NONE, | ||
32 | #define SELNLGRP_NONE SELNLGRP_NONE | ||
33 | SELNLGRP_AVC, | ||
34 | #define SELNLGRP_AVC SELNLGRP_AVC | ||
35 | __SELNLGRP_MAX | ||
36 | }; | ||
37 | #define SELNLGRP_MAX (__SELNLGRP_MAX - 1) | ||
27 | 38 | ||
28 | /* Message structures */ | 39 | /* Message structures */ |
29 | struct selnl_msg_setenforce { | 40 | struct selnl_msg_setenforce { |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 948527e42a60..42edce6abe23 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -155,16 +155,29 @@ struct skb_shared_info { | |||
155 | #define SKB_DATAREF_SHIFT 16 | 155 | #define SKB_DATAREF_SHIFT 16 |
156 | #define SKB_DATAREF_MASK ((1 << SKB_DATAREF_SHIFT) - 1) | 156 | #define SKB_DATAREF_MASK ((1 << SKB_DATAREF_SHIFT) - 1) |
157 | 157 | ||
158 | extern struct timeval skb_tv_base; | ||
159 | |||
160 | struct skb_timeval { | ||
161 | u32 off_sec; | ||
162 | u32 off_usec; | ||
163 | }; | ||
164 | |||
165 | |||
166 | enum { | ||
167 | SKB_FCLONE_UNAVAILABLE, | ||
168 | SKB_FCLONE_ORIG, | ||
169 | SKB_FCLONE_CLONE, | ||
170 | }; | ||
171 | |||
158 | /** | 172 | /** |
159 | * struct sk_buff - socket buffer | 173 | * struct sk_buff - socket buffer |
160 | * @next: Next buffer in list | 174 | * @next: Next buffer in list |
161 | * @prev: Previous buffer in list | 175 | * @prev: Previous buffer in list |
162 | * @list: List we are on | 176 | * @list: List we are on |
163 | * @sk: Socket we are owned by | 177 | * @sk: Socket we are owned by |
164 | * @stamp: Time we arrived | 178 | * @tstamp: Time we arrived stored as offset to skb_tv_base |
165 | * @dev: Device we arrived on/are leaving by | 179 | * @dev: Device we arrived on/are leaving by |
166 | * @input_dev: Device we arrived on | 180 | * @input_dev: Device we arrived on |
167 | * @real_dev: The real device we are using | ||
168 | * @h: Transport layer header | 181 | * @h: Transport layer header |
169 | * @nh: Network layer header | 182 | * @nh: Network layer header |
170 | * @mac: Link layer header | 183 | * @mac: Link layer header |
@@ -190,14 +203,11 @@ struct skb_shared_info { | |||
190 | * @end: End pointer | 203 | * @end: End pointer |
191 | * @destructor: Destruct function | 204 | * @destructor: Destruct function |
192 | * @nfmark: Can be used for communication between hooks | 205 | * @nfmark: Can be used for communication between hooks |
193 | * @nfcache: Cache info | ||
194 | * @nfct: Associated connection, if any | 206 | * @nfct: Associated connection, if any |
195 | * @nfctinfo: Relationship of this skb to the connection | 207 | * @nfctinfo: Relationship of this skb to the connection |
196 | * @nf_bridge: Saved data about a bridged frame - see br_netfilter.c | 208 | * @nf_bridge: Saved data about a bridged frame - see br_netfilter.c |
197 | * @private: Data which is private to the HIPPI implementation | ||
198 | * @tc_index: Traffic control index | 209 | * @tc_index: Traffic control index |
199 | * @tc_verd: traffic control verdict | 210 | * @tc_verd: traffic control verdict |
200 | * @tc_classid: traffic control classid | ||
201 | */ | 211 | */ |
202 | 212 | ||
203 | struct sk_buff { | 213 | struct sk_buff { |
@@ -205,12 +215,10 @@ struct sk_buff { | |||
205 | struct sk_buff *next; | 215 | struct sk_buff *next; |
206 | struct sk_buff *prev; | 216 | struct sk_buff *prev; |
207 | 217 | ||
208 | struct sk_buff_head *list; | ||
209 | struct sock *sk; | 218 | struct sock *sk; |
210 | struct timeval stamp; | 219 | struct skb_timeval tstamp; |
211 | struct net_device *dev; | 220 | struct net_device *dev; |
212 | struct net_device *input_dev; | 221 | struct net_device *input_dev; |
213 | struct net_device *real_dev; | ||
214 | 222 | ||
215 | union { | 223 | union { |
216 | struct tcphdr *th; | 224 | struct tcphdr *th; |
@@ -252,33 +260,28 @@ struct sk_buff { | |||
252 | __u8 local_df:1, | 260 | __u8 local_df:1, |
253 | cloned:1, | 261 | cloned:1, |
254 | ip_summed:2, | 262 | ip_summed:2, |
255 | nohdr:1; | 263 | nohdr:1, |
256 | /* 3 bits spare */ | 264 | nfctinfo:3; |
257 | __u8 pkt_type; | 265 | __u8 pkt_type:3, |
266 | fclone:2; | ||
258 | __be16 protocol; | 267 | __be16 protocol; |
259 | 268 | ||
260 | void (*destructor)(struct sk_buff *skb); | 269 | void (*destructor)(struct sk_buff *skb); |
261 | #ifdef CONFIG_NETFILTER | 270 | #ifdef CONFIG_NETFILTER |
262 | unsigned long nfmark; | 271 | __u32 nfmark; |
263 | __u32 nfcache; | ||
264 | __u32 nfctinfo; | ||
265 | struct nf_conntrack *nfct; | 272 | struct nf_conntrack *nfct; |
273 | #if defined(CONFIG_IP_VS) || defined(CONFIG_IP_VS_MODULE) | ||
274 | __u8 ipvs_property:1; | ||
275 | #endif | ||
266 | #ifdef CONFIG_BRIDGE_NETFILTER | 276 | #ifdef CONFIG_BRIDGE_NETFILTER |
267 | struct nf_bridge_info *nf_bridge; | 277 | struct nf_bridge_info *nf_bridge; |
268 | #endif | 278 | #endif |
269 | #endif /* CONFIG_NETFILTER */ | 279 | #endif /* CONFIG_NETFILTER */ |
270 | #if defined(CONFIG_HIPPI) | ||
271 | union { | ||
272 | __u32 ifield; | ||
273 | } private; | ||
274 | #endif | ||
275 | #ifdef CONFIG_NET_SCHED | 280 | #ifdef CONFIG_NET_SCHED |
276 | __u32 tc_index; /* traffic control index */ | 281 | __u16 tc_index; /* traffic control index */ |
277 | #ifdef CONFIG_NET_CLS_ACT | 282 | #ifdef CONFIG_NET_CLS_ACT |
278 | __u32 tc_verd; /* traffic control verdict */ | 283 | __u16 tc_verd; /* traffic control verdict */ |
279 | __u32 tc_classid; /* traffic control classid */ | ||
280 | #endif | 284 | #endif |
281 | |||
282 | #endif | 285 | #endif |
283 | 286 | ||
284 | 287 | ||
@@ -300,8 +303,20 @@ struct sk_buff { | |||
300 | #include <asm/system.h> | 303 | #include <asm/system.h> |
301 | 304 | ||
302 | extern void __kfree_skb(struct sk_buff *skb); | 305 | extern void __kfree_skb(struct sk_buff *skb); |
303 | extern struct sk_buff *alloc_skb(unsigned int size, | 306 | extern struct sk_buff *__alloc_skb(unsigned int size, |
304 | unsigned int __nocast priority); | 307 | unsigned int __nocast priority, int fclone); |
308 | static inline struct sk_buff *alloc_skb(unsigned int size, | ||
309 | unsigned int __nocast priority) | ||
310 | { | ||
311 | return __alloc_skb(size, priority, 0); | ||
312 | } | ||
313 | |||
314 | static inline struct sk_buff *alloc_skb_fclone(unsigned int size, | ||
315 | unsigned int __nocast priority) | ||
316 | { | ||
317 | return __alloc_skb(size, priority, 1); | ||
318 | } | ||
319 | |||
305 | extern struct sk_buff *alloc_skb_from_cache(kmem_cache_t *cp, | 320 | extern struct sk_buff *alloc_skb_from_cache(kmem_cache_t *cp, |
306 | unsigned int size, | 321 | unsigned int size, |
307 | unsigned int __nocast priority); | 322 | unsigned int __nocast priority); |
@@ -597,7 +612,6 @@ static inline void __skb_queue_head(struct sk_buff_head *list, | |||
597 | { | 612 | { |
598 | struct sk_buff *prev, *next; | 613 | struct sk_buff *prev, *next; |
599 | 614 | ||
600 | newsk->list = list; | ||
601 | list->qlen++; | 615 | list->qlen++; |
602 | prev = (struct sk_buff *)list; | 616 | prev = (struct sk_buff *)list; |
603 | next = prev->next; | 617 | next = prev->next; |
@@ -622,7 +636,6 @@ static inline void __skb_queue_tail(struct sk_buff_head *list, | |||
622 | { | 636 | { |
623 | struct sk_buff *prev, *next; | 637 | struct sk_buff *prev, *next; |
624 | 638 | ||
625 | newsk->list = list; | ||
626 | list->qlen++; | 639 | list->qlen++; |
627 | next = (struct sk_buff *)list; | 640 | next = (struct sk_buff *)list; |
628 | prev = next->prev; | 641 | prev = next->prev; |
@@ -655,7 +668,6 @@ static inline struct sk_buff *__skb_dequeue(struct sk_buff_head *list) | |||
655 | next->prev = prev; | 668 | next->prev = prev; |
656 | prev->next = next; | 669 | prev->next = next; |
657 | result->next = result->prev = NULL; | 670 | result->next = result->prev = NULL; |
658 | result->list = NULL; | ||
659 | } | 671 | } |
660 | return result; | 672 | return result; |
661 | } | 673 | } |
@@ -664,7 +676,7 @@ static inline struct sk_buff *__skb_dequeue(struct sk_buff_head *list) | |||
664 | /* | 676 | /* |
665 | * Insert a packet on a list. | 677 | * Insert a packet on a list. |
666 | */ | 678 | */ |
667 | extern void skb_insert(struct sk_buff *old, struct sk_buff *newsk); | 679 | extern void skb_insert(struct sk_buff *old, struct sk_buff *newsk, struct sk_buff_head *list); |
668 | static inline void __skb_insert(struct sk_buff *newsk, | 680 | static inline void __skb_insert(struct sk_buff *newsk, |
669 | struct sk_buff *prev, struct sk_buff *next, | 681 | struct sk_buff *prev, struct sk_buff *next, |
670 | struct sk_buff_head *list) | 682 | struct sk_buff_head *list) |
@@ -672,24 +684,23 @@ static inline void __skb_insert(struct sk_buff *newsk, | |||
672 | newsk->next = next; | 684 | newsk->next = next; |
673 | newsk->prev = prev; | 685 | newsk->prev = prev; |
674 | next->prev = prev->next = newsk; | 686 | next->prev = prev->next = newsk; |
675 | newsk->list = list; | ||
676 | list->qlen++; | 687 | list->qlen++; |
677 | } | 688 | } |
678 | 689 | ||
679 | /* | 690 | /* |
680 | * Place a packet after a given packet in a list. | 691 | * Place a packet after a given packet in a list. |
681 | */ | 692 | */ |
682 | extern void skb_append(struct sk_buff *old, struct sk_buff *newsk); | 693 | extern void skb_append(struct sk_buff *old, struct sk_buff *newsk, struct sk_buff_head *list); |
683 | static inline void __skb_append(struct sk_buff *old, struct sk_buff *newsk) | 694 | static inline void __skb_append(struct sk_buff *old, struct sk_buff *newsk, struct sk_buff_head *list) |
684 | { | 695 | { |
685 | __skb_insert(newsk, old, old->next, old->list); | 696 | __skb_insert(newsk, old, old->next, list); |
686 | } | 697 | } |
687 | 698 | ||
688 | /* | 699 | /* |
689 | * remove sk_buff from list. _Must_ be called atomically, and with | 700 | * remove sk_buff from list. _Must_ be called atomically, and with |
690 | * the list known.. | 701 | * the list known.. |
691 | */ | 702 | */ |
692 | extern void skb_unlink(struct sk_buff *skb); | 703 | extern void skb_unlink(struct sk_buff *skb, struct sk_buff_head *list); |
693 | static inline void __skb_unlink(struct sk_buff *skb, struct sk_buff_head *list) | 704 | static inline void __skb_unlink(struct sk_buff *skb, struct sk_buff_head *list) |
694 | { | 705 | { |
695 | struct sk_buff *next, *prev; | 706 | struct sk_buff *next, *prev; |
@@ -698,7 +709,6 @@ static inline void __skb_unlink(struct sk_buff *skb, struct sk_buff_head *list) | |||
698 | next = skb->next; | 709 | next = skb->next; |
699 | prev = skb->prev; | 710 | prev = skb->prev; |
700 | skb->next = skb->prev = NULL; | 711 | skb->next = skb->prev = NULL; |
701 | skb->list = NULL; | ||
702 | next->prev = prev; | 712 | next->prev = prev; |
703 | prev->next = next; | 713 | prev->next = next; |
704 | } | 714 | } |
@@ -1213,6 +1223,8 @@ extern void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to); | |||
1213 | extern void skb_split(struct sk_buff *skb, | 1223 | extern void skb_split(struct sk_buff *skb, |
1214 | struct sk_buff *skb1, const u32 len); | 1224 | struct sk_buff *skb1, const u32 len); |
1215 | 1225 | ||
1226 | extern void skb_release_data(struct sk_buff *skb); | ||
1227 | |||
1216 | static inline void *skb_header_pointer(const struct sk_buff *skb, int offset, | 1228 | static inline void *skb_header_pointer(const struct sk_buff *skb, int offset, |
1217 | int len, void *buffer) | 1229 | int len, void *buffer) |
1218 | { | 1230 | { |
@@ -1230,6 +1242,42 @@ static inline void *skb_header_pointer(const struct sk_buff *skb, int offset, | |||
1230 | extern void skb_init(void); | 1242 | extern void skb_init(void); |
1231 | extern void skb_add_mtu(int mtu); | 1243 | extern void skb_add_mtu(int mtu); |
1232 | 1244 | ||
1245 | /** | ||
1246 | * skb_get_timestamp - get timestamp from a skb | ||
1247 | * @skb: skb to get stamp from | ||
1248 | * @stamp: pointer to struct timeval to store stamp in | ||
1249 | * | ||
1250 | * Timestamps are stored in the skb as offsets to a base timestamp. | ||
1251 | * This function converts the offset back to a struct timeval and stores | ||
1252 | * it in stamp. | ||
1253 | */ | ||
1254 | static inline void skb_get_timestamp(struct sk_buff *skb, struct timeval *stamp) | ||
1255 | { | ||
1256 | stamp->tv_sec = skb->tstamp.off_sec; | ||
1257 | stamp->tv_usec = skb->tstamp.off_usec; | ||
1258 | if (skb->tstamp.off_sec) { | ||
1259 | stamp->tv_sec += skb_tv_base.tv_sec; | ||
1260 | stamp->tv_usec += skb_tv_base.tv_usec; | ||
1261 | } | ||
1262 | } | ||
1263 | |||
1264 | /** | ||
1265 | * skb_set_timestamp - set timestamp of a skb | ||
1266 | * @skb: skb to set stamp of | ||
1267 | * @stamp: pointer to struct timeval to get stamp from | ||
1268 | * | ||
1269 | * Timestamps are stored in the skb as offsets to a base timestamp. | ||
1270 | * This function converts a struct timeval to an offset and stores | ||
1271 | * it in the skb. | ||
1272 | */ | ||
1273 | static inline void skb_set_timestamp(struct sk_buff *skb, struct timeval *stamp) | ||
1274 | { | ||
1275 | skb->tstamp.off_sec = stamp->tv_sec - skb_tv_base.tv_sec; | ||
1276 | skb->tstamp.off_usec = stamp->tv_usec - skb_tv_base.tv_usec; | ||
1277 | } | ||
1278 | |||
1279 | extern void __net_timestamp(struct sk_buff *skb); | ||
1280 | |||
1233 | #ifdef CONFIG_NETFILTER | 1281 | #ifdef CONFIG_NETFILTER |
1234 | static inline void nf_conntrack_put(struct nf_conntrack *nfct) | 1282 | static inline void nf_conntrack_put(struct nf_conntrack *nfct) |
1235 | { | 1283 | { |
diff --git a/include/linux/socket.h b/include/linux/socket.h index a5c7d96e4d2e..1739c2d5b95b 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h | |||
@@ -26,6 +26,13 @@ struct __kernel_sockaddr_storage { | |||
26 | #include <linux/types.h> /* pid_t */ | 26 | #include <linux/types.h> /* pid_t */ |
27 | #include <linux/compiler.h> /* __user */ | 27 | #include <linux/compiler.h> /* __user */ |
28 | 28 | ||
29 | extern int sysctl_somaxconn; | ||
30 | extern void sock_init(void); | ||
31 | #ifdef CONFIG_PROC_FS | ||
32 | struct seq_file; | ||
33 | extern void socket_seq_show(struct seq_file *seq); | ||
34 | #endif | ||
35 | |||
29 | typedef unsigned short sa_family_t; | 36 | typedef unsigned short sa_family_t; |
30 | 37 | ||
31 | /* | 38 | /* |
@@ -271,6 +278,8 @@ struct ucred { | |||
271 | #define SOL_IRDA 266 | 278 | #define SOL_IRDA 266 |
272 | #define SOL_NETBEUI 267 | 279 | #define SOL_NETBEUI 267 |
273 | #define SOL_LLC 268 | 280 | #define SOL_LLC 268 |
281 | #define SOL_DCCP 269 | ||
282 | #define SOL_NETLINK 270 | ||
274 | 283 | ||
275 | /* IPX options */ | 284 | /* IPX options */ |
276 | #define IPX_TYPE 1 | 285 | #define IPX_TYPE 1 |
diff --git a/include/linux/tcp.h b/include/linux/tcp.h index e4fd82e42104..ac4ca44c75ca 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h | |||
@@ -55,24 +55,6 @@ struct tcphdr { | |||
55 | __u16 urg_ptr; | 55 | __u16 urg_ptr; |
56 | }; | 56 | }; |
57 | 57 | ||
58 | |||
59 | enum { | ||
60 | TCP_ESTABLISHED = 1, | ||
61 | TCP_SYN_SENT, | ||
62 | TCP_SYN_RECV, | ||
63 | TCP_FIN_WAIT1, | ||
64 | TCP_FIN_WAIT2, | ||
65 | TCP_TIME_WAIT, | ||
66 | TCP_CLOSE, | ||
67 | TCP_CLOSE_WAIT, | ||
68 | TCP_LAST_ACK, | ||
69 | TCP_LISTEN, | ||
70 | TCP_CLOSING, /* now a valid state */ | ||
71 | |||
72 | TCP_MAX_STATES /* Leave at the end! */ | ||
73 | }; | ||
74 | |||
75 | #define TCP_STATE_MASK 0xF | ||
76 | #define TCP_ACTION_FIN (1 << 7) | 58 | #define TCP_ACTION_FIN (1 << 7) |
77 | 59 | ||
78 | enum { | 60 | enum { |
@@ -195,8 +177,9 @@ struct tcp_info | |||
195 | 177 | ||
196 | #include <linux/config.h> | 178 | #include <linux/config.h> |
197 | #include <linux/skbuff.h> | 179 | #include <linux/skbuff.h> |
198 | #include <linux/ip.h> | ||
199 | #include <net/sock.h> | 180 | #include <net/sock.h> |
181 | #include <net/inet_connection_sock.h> | ||
182 | #include <net/inet_timewait_sock.h> | ||
200 | 183 | ||
201 | /* This defines a selective acknowledgement block. */ | 184 | /* This defines a selective acknowledgement block. */ |
202 | struct tcp_sack_block { | 185 | struct tcp_sack_block { |
@@ -236,8 +219,8 @@ static inline struct tcp_request_sock *tcp_rsk(const struct request_sock *req) | |||
236 | } | 219 | } |
237 | 220 | ||
238 | struct tcp_sock { | 221 | struct tcp_sock { |
239 | /* inet_sock has to be the first member of tcp_sock */ | 222 | /* inet_connection_sock has to be the first member of tcp_sock */ |
240 | struct inet_sock inet; | 223 | struct inet_connection_sock inet_conn; |
241 | int tcp_header_len; /* Bytes of tcp header to send */ | 224 | int tcp_header_len; /* Bytes of tcp header to send */ |
242 | 225 | ||
243 | /* | 226 | /* |
@@ -258,19 +241,6 @@ struct tcp_sock { | |||
258 | __u32 snd_sml; /* Last byte of the most recently transmitted small packet */ | 241 | __u32 snd_sml; /* Last byte of the most recently transmitted small packet */ |
259 | __u32 rcv_tstamp; /* timestamp of last received ACK (for keepalives) */ | 242 | __u32 rcv_tstamp; /* timestamp of last received ACK (for keepalives) */ |
260 | __u32 lsndtime; /* timestamp of last sent data packet (for restart window) */ | 243 | __u32 lsndtime; /* timestamp of last sent data packet (for restart window) */ |
261 | struct tcp_bind_bucket *bind_hash; | ||
262 | /* Delayed ACK control data */ | ||
263 | struct { | ||
264 | __u8 pending; /* ACK is pending */ | ||
265 | __u8 quick; /* Scheduled number of quick acks */ | ||
266 | __u8 pingpong; /* The session is interactive */ | ||
267 | __u8 blocked; /* Delayed ACK was blocked by socket lock*/ | ||
268 | __u32 ato; /* Predicted tick of soft clock */ | ||
269 | unsigned long timeout; /* Currently scheduled timeout */ | ||
270 | __u32 lrcvtime; /* timestamp of last received data packet*/ | ||
271 | __u16 last_seg_size; /* Size of last incoming segment */ | ||
272 | __u16 rcv_mss; /* MSS used for delayed ACK decisions */ | ||
273 | } ack; | ||
274 | 244 | ||
275 | /* Data for direct copy to user */ | 245 | /* Data for direct copy to user */ |
276 | struct { | 246 | struct { |
@@ -288,19 +258,15 @@ struct tcp_sock { | |||
288 | __u32 mss_cache; /* Cached effective mss, not including SACKS */ | 258 | __u32 mss_cache; /* Cached effective mss, not including SACKS */ |
289 | __u16 xmit_size_goal; /* Goal for segmenting output packets */ | 259 | __u16 xmit_size_goal; /* Goal for segmenting output packets */ |
290 | __u16 ext_header_len; /* Network protocol overhead (IP/IPv6 options) */ | 260 | __u16 ext_header_len; /* Network protocol overhead (IP/IPv6 options) */ |
291 | __u8 ca_state; /* State of fast-retransmit machine */ | ||
292 | __u8 retransmits; /* Number of unrecovered RTO timeouts. */ | ||
293 | 261 | ||
294 | __u16 advmss; /* Advertised MSS */ | ||
295 | __u32 window_clamp; /* Maximal window to advertise */ | 262 | __u32 window_clamp; /* Maximal window to advertise */ |
296 | __u32 rcv_ssthresh; /* Current window clamp */ | 263 | __u32 rcv_ssthresh; /* Current window clamp */ |
297 | 264 | ||
298 | __u32 frto_highmark; /* snd_nxt when RTO occurred */ | 265 | __u32 frto_highmark; /* snd_nxt when RTO occurred */ |
299 | __u8 reordering; /* Packet reordering metric. */ | 266 | __u8 reordering; /* Packet reordering metric. */ |
300 | __u8 frto_counter; /* Number of new acks after RTO */ | 267 | __u8 frto_counter; /* Number of new acks after RTO */ |
301 | 268 | __u8 nonagle; /* Disable Nagle algorithm? */ | |
302 | __u8 unused; | 269 | __u8 keepalive_probes; /* num of allowed keep alive probes */ |
303 | __u8 defer_accept; /* User waits for some data after accept() */ | ||
304 | 270 | ||
305 | /* RTT measurement */ | 271 | /* RTT measurement */ |
306 | __u32 srtt; /* smoothed round trip time << 3 */ | 272 | __u32 srtt; /* smoothed round trip time << 3 */ |
@@ -308,19 +274,13 @@ struct tcp_sock { | |||
308 | __u32 mdev_max; /* maximal mdev for the last rtt period */ | 274 | __u32 mdev_max; /* maximal mdev for the last rtt period */ |
309 | __u32 rttvar; /* smoothed mdev_max */ | 275 | __u32 rttvar; /* smoothed mdev_max */ |
310 | __u32 rtt_seq; /* sequence number to update rttvar */ | 276 | __u32 rtt_seq; /* sequence number to update rttvar */ |
311 | __u32 rto; /* retransmit timeout */ | ||
312 | 277 | ||
313 | __u32 packets_out; /* Packets which are "in flight" */ | 278 | __u32 packets_out; /* Packets which are "in flight" */ |
314 | __u32 left_out; /* Packets which leaved network */ | 279 | __u32 left_out; /* Packets which leaved network */ |
315 | __u32 retrans_out; /* Retransmitted packets out */ | 280 | __u32 retrans_out; /* Retransmitted packets out */ |
316 | __u8 backoff; /* backoff */ | ||
317 | /* | 281 | /* |
318 | * Options received (usually on last packet, some only on SYN packets). | 282 | * Options received (usually on last packet, some only on SYN packets). |
319 | */ | 283 | */ |
320 | __u8 nonagle; /* Disable Nagle algorithm? */ | ||
321 | __u8 keepalive_probes; /* num of allowed keep alive probes */ | ||
322 | |||
323 | __u8 probes_out; /* unanswered 0 window probes */ | ||
324 | struct tcp_options_received rx_opt; | 284 | struct tcp_options_received rx_opt; |
325 | 285 | ||
326 | /* | 286 | /* |
@@ -333,11 +293,6 @@ struct tcp_sock { | |||
333 | __u32 snd_cwnd_used; | 293 | __u32 snd_cwnd_used; |
334 | __u32 snd_cwnd_stamp; | 294 | __u32 snd_cwnd_stamp; |
335 | 295 | ||
336 | /* Two commonly used timers in both sender and receiver paths. */ | ||
337 | unsigned long timeout; | ||
338 | struct timer_list retransmit_timer; /* Resend (no ack) */ | ||
339 | struct timer_list delack_timer; /* Ack delay */ | ||
340 | |||
341 | struct sk_buff_head out_of_order_queue; /* Out of order segments go here */ | 296 | struct sk_buff_head out_of_order_queue; /* Out of order segments go here */ |
342 | 297 | ||
343 | struct tcp_func *af_specific; /* Operations which are AF_INET{4,6} specific */ | 298 | struct tcp_func *af_specific; /* Operations which are AF_INET{4,6} specific */ |
@@ -352,8 +307,7 @@ struct tcp_sock { | |||
352 | struct tcp_sack_block duplicate_sack[1]; /* D-SACK block */ | 307 | struct tcp_sack_block duplicate_sack[1]; /* D-SACK block */ |
353 | struct tcp_sack_block selective_acks[4]; /* The SACKS themselves*/ | 308 | struct tcp_sack_block selective_acks[4]; /* The SACKS themselves*/ |
354 | 309 | ||
355 | __u8 syn_retries; /* num of allowed syn retries */ | 310 | __u16 advmss; /* Advertised MSS */ |
356 | __u8 ecn_flags; /* ECN status bits. */ | ||
357 | __u16 prior_ssthresh; /* ssthresh saved at recovery start */ | 311 | __u16 prior_ssthresh; /* ssthresh saved at recovery start */ |
358 | __u32 lost_out; /* Lost packets */ | 312 | __u32 lost_out; /* Lost packets */ |
359 | __u32 sacked_out; /* SACK'd packets */ | 313 | __u32 sacked_out; /* SACK'd packets */ |
@@ -367,14 +321,12 @@ struct tcp_sock { | |||
367 | int undo_retrans; /* number of undoable retransmissions. */ | 321 | int undo_retrans; /* number of undoable retransmissions. */ |
368 | __u32 urg_seq; /* Seq of received urgent pointer */ | 322 | __u32 urg_seq; /* Seq of received urgent pointer */ |
369 | __u16 urg_data; /* Saved octet of OOB data and control flags */ | 323 | __u16 urg_data; /* Saved octet of OOB data and control flags */ |
370 | __u8 pending; /* Scheduled timer event */ | ||
371 | __u8 urg_mode; /* In urgent mode */ | 324 | __u8 urg_mode; /* In urgent mode */ |
325 | __u8 ecn_flags; /* ECN status bits. */ | ||
372 | __u32 snd_up; /* Urgent pointer */ | 326 | __u32 snd_up; /* Urgent pointer */ |
373 | 327 | ||
374 | __u32 total_retrans; /* Total retransmits for entire connection */ | 328 | __u32 total_retrans; /* Total retransmits for entire connection */ |
375 | 329 | ||
376 | struct request_sock_queue accept_queue; /* FIFO of established children */ | ||
377 | |||
378 | unsigned int keepalive_time; /* time before keep alive takes place */ | 330 | unsigned int keepalive_time; /* time before keep alive takes place */ |
379 | unsigned int keepalive_intvl; /* time interval between keep alive probes */ | 331 | unsigned int keepalive_intvl; /* time interval between keep alive probes */ |
380 | int linger2; | 332 | int linger2; |
@@ -394,11 +346,6 @@ struct tcp_sock { | |||
394 | __u32 seq; | 346 | __u32 seq; |
395 | __u32 time; | 347 | __u32 time; |
396 | } rcvq_space; | 348 | } rcvq_space; |
397 | |||
398 | /* Pluggable TCP congestion control hook */ | ||
399 | struct tcp_congestion_ops *ca_ops; | ||
400 | u32 ca_priv[16]; | ||
401 | #define TCP_CA_PRIV_SIZE (16*sizeof(u32)) | ||
402 | }; | 349 | }; |
403 | 350 | ||
404 | static inline struct tcp_sock *tcp_sk(const struct sock *sk) | 351 | static inline struct tcp_sock *tcp_sk(const struct sock *sk) |
@@ -406,9 +353,18 @@ static inline struct tcp_sock *tcp_sk(const struct sock *sk) | |||
406 | return (struct tcp_sock *)sk; | 353 | return (struct tcp_sock *)sk; |
407 | } | 354 | } |
408 | 355 | ||
409 | static inline void *tcp_ca(const struct tcp_sock *tp) | 356 | struct tcp_timewait_sock { |
357 | struct inet_timewait_sock tw_sk; | ||
358 | __u32 tw_rcv_nxt; | ||
359 | __u32 tw_snd_nxt; | ||
360 | __u32 tw_rcv_wnd; | ||
361 | __u32 tw_ts_recent; | ||
362 | long tw_ts_recent_stamp; | ||
363 | }; | ||
364 | |||
365 | static inline struct tcp_timewait_sock *tcp_twsk(const struct sock *sk) | ||
410 | { | 366 | { |
411 | return (void *) tp->ca_priv; | 367 | return (struct tcp_timewait_sock *)sk; |
412 | } | 368 | } |
413 | 369 | ||
414 | #endif | 370 | #endif |
diff --git a/include/linux/tcp_diag.h b/include/linux/tcp_diag.h deleted file mode 100644 index 7a5996743946..000000000000 --- a/include/linux/tcp_diag.h +++ /dev/null | |||
@@ -1,127 +0,0 @@ | |||
1 | #ifndef _TCP_DIAG_H_ | ||
2 | #define _TCP_DIAG_H_ 1 | ||
3 | |||
4 | /* Just some random number */ | ||
5 | #define TCPDIAG_GETSOCK 18 | ||
6 | |||
7 | /* Socket identity */ | ||
8 | struct tcpdiag_sockid | ||
9 | { | ||
10 | __u16 tcpdiag_sport; | ||
11 | __u16 tcpdiag_dport; | ||
12 | __u32 tcpdiag_src[4]; | ||
13 | __u32 tcpdiag_dst[4]; | ||
14 | __u32 tcpdiag_if; | ||
15 | __u32 tcpdiag_cookie[2]; | ||
16 | #define TCPDIAG_NOCOOKIE (~0U) | ||
17 | }; | ||
18 | |||
19 | /* Request structure */ | ||
20 | |||
21 | struct tcpdiagreq | ||
22 | { | ||
23 | __u8 tcpdiag_family; /* Family of addresses. */ | ||
24 | __u8 tcpdiag_src_len; | ||
25 | __u8 tcpdiag_dst_len; | ||
26 | __u8 tcpdiag_ext; /* Query extended information */ | ||
27 | |||
28 | struct tcpdiag_sockid id; | ||
29 | |||
30 | __u32 tcpdiag_states; /* States to dump */ | ||
31 | __u32 tcpdiag_dbs; /* Tables to dump (NI) */ | ||
32 | }; | ||
33 | |||
34 | enum | ||
35 | { | ||
36 | TCPDIAG_REQ_NONE, | ||
37 | TCPDIAG_REQ_BYTECODE, | ||
38 | }; | ||
39 | |||
40 | #define TCPDIAG_REQ_MAX TCPDIAG_REQ_BYTECODE | ||
41 | |||
42 | /* Bytecode is sequence of 4 byte commands followed by variable arguments. | ||
43 | * All the commands identified by "code" are conditional jumps forward: | ||
44 | * to offset cc+"yes" or to offset cc+"no". "yes" is supposed to be | ||
45 | * length of the command and its arguments. | ||
46 | */ | ||
47 | |||
48 | struct tcpdiag_bc_op | ||
49 | { | ||
50 | unsigned char code; | ||
51 | unsigned char yes; | ||
52 | unsigned short no; | ||
53 | }; | ||
54 | |||
55 | enum | ||
56 | { | ||
57 | TCPDIAG_BC_NOP, | ||
58 | TCPDIAG_BC_JMP, | ||
59 | TCPDIAG_BC_S_GE, | ||
60 | TCPDIAG_BC_S_LE, | ||
61 | TCPDIAG_BC_D_GE, | ||
62 | TCPDIAG_BC_D_LE, | ||
63 | TCPDIAG_BC_AUTO, | ||
64 | TCPDIAG_BC_S_COND, | ||
65 | TCPDIAG_BC_D_COND, | ||
66 | }; | ||
67 | |||
68 | struct tcpdiag_hostcond | ||
69 | { | ||
70 | __u8 family; | ||
71 | __u8 prefix_len; | ||
72 | int port; | ||
73 | __u32 addr[0]; | ||
74 | }; | ||
75 | |||
76 | /* Base info structure. It contains socket identity (addrs/ports/cookie) | ||
77 | * and, alas, the information shown by netstat. */ | ||
78 | struct tcpdiagmsg | ||
79 | { | ||
80 | __u8 tcpdiag_family; | ||
81 | __u8 tcpdiag_state; | ||
82 | __u8 tcpdiag_timer; | ||
83 | __u8 tcpdiag_retrans; | ||
84 | |||
85 | struct tcpdiag_sockid id; | ||
86 | |||
87 | __u32 tcpdiag_expires; | ||
88 | __u32 tcpdiag_rqueue; | ||
89 | __u32 tcpdiag_wqueue; | ||
90 | __u32 tcpdiag_uid; | ||
91 | __u32 tcpdiag_inode; | ||
92 | }; | ||
93 | |||
94 | /* Extensions */ | ||
95 | |||
96 | enum | ||
97 | { | ||
98 | TCPDIAG_NONE, | ||
99 | TCPDIAG_MEMINFO, | ||
100 | TCPDIAG_INFO, | ||
101 | TCPDIAG_VEGASINFO, | ||
102 | TCPDIAG_CONG, | ||
103 | }; | ||
104 | |||
105 | #define TCPDIAG_MAX TCPDIAG_CONG | ||
106 | |||
107 | |||
108 | /* TCPDIAG_MEM */ | ||
109 | |||
110 | struct tcpdiag_meminfo | ||
111 | { | ||
112 | __u32 tcpdiag_rmem; | ||
113 | __u32 tcpdiag_wmem; | ||
114 | __u32 tcpdiag_fmem; | ||
115 | __u32 tcpdiag_tmem; | ||
116 | }; | ||
117 | |||
118 | /* TCPDIAG_VEGASINFO */ | ||
119 | |||
120 | struct tcpvegas_info { | ||
121 | __u32 tcpv_enabled; | ||
122 | __u32 tcpv_rttcnt; | ||
123 | __u32 tcpv_rtt; | ||
124 | __u32 tcpv_minrtt; | ||
125 | }; | ||
126 | |||
127 | #endif /* _TCP_DIAG_H_ */ | ||
diff --git a/include/linux/types.h b/include/linux/types.h index dcb13f865df9..2b678c22ca4a 100644 --- a/include/linux/types.h +++ b/include/linux/types.h | |||
@@ -123,6 +123,9 @@ typedef __u64 u_int64_t; | |||
123 | typedef __s64 int64_t; | 123 | typedef __s64 int64_t; |
124 | #endif | 124 | #endif |
125 | 125 | ||
126 | /* this is a special 64bit data type that is 8-byte aligned */ | ||
127 | #define aligned_u64 unsigned long long __attribute__((aligned(8))) | ||
128 | |||
126 | /* | 129 | /* |
127 | * The type used for indexing onto a disc or disc partition. | 130 | * The type used for indexing onto a disc or disc partition. |
128 | * If required, asm/types.h can override it and define | 131 | * If required, asm/types.h can override it and define |
diff --git a/include/linux/xfrm.h b/include/linux/xfrm.h index f0d423300d84..0fb077d68441 100644 --- a/include/linux/xfrm.h +++ b/include/linux/xfrm.h | |||
@@ -258,9 +258,27 @@ struct xfrm_usersa_flush { | |||
258 | __u8 proto; | 258 | __u8 proto; |
259 | }; | 259 | }; |
260 | 260 | ||
261 | #ifndef __KERNEL__ | ||
262 | /* backwards compatibility for userspace */ | ||
261 | #define XFRMGRP_ACQUIRE 1 | 263 | #define XFRMGRP_ACQUIRE 1 |
262 | #define XFRMGRP_EXPIRE 2 | 264 | #define XFRMGRP_EXPIRE 2 |
263 | #define XFRMGRP_SA 4 | 265 | #define XFRMGRP_SA 4 |
264 | #define XFRMGRP_POLICY 8 | 266 | #define XFRMGRP_POLICY 8 |
267 | #endif | ||
268 | |||
269 | enum xfrm_nlgroups { | ||
270 | XFRMNLGRP_NONE, | ||
271 | #define XFRMNLGRP_NONE XFRMNLGRP_NONE | ||
272 | XFRMNLGRP_ACQUIRE, | ||
273 | #define XFRMNLGRP_ACQUIRE XFRMNLGRP_ACQUIRE | ||
274 | XFRMNLGRP_EXPIRE, | ||
275 | #define XFRMNLGRP_EXPIRE XFRMNLGRP_EXPIRE | ||
276 | XFRMNLGRP_SA, | ||
277 | #define XFRMNLGRP_SA XFRMNLGRP_SA | ||
278 | XFRMNLGRP_POLICY, | ||
279 | #define XFRMNLGRP_POLICY XFRMNLGRP_POLICY | ||
280 | __XFRMNLGRP_MAX | ||
281 | }; | ||
282 | #define XFRMNLGRP_MAX (__XFRMNLGRP_MAX - 1) | ||
265 | 283 | ||
266 | #endif /* _LINUX_XFRM_H */ | 284 | #endif /* _LINUX_XFRM_H */ |
diff --git a/include/net/act_api.h b/include/net/act_api.h index ed00a995f576..b55eb7c7f033 100644 --- a/include/net/act_api.h +++ b/include/net/act_api.h | |||
@@ -63,7 +63,7 @@ struct tc_action_ops | |||
63 | __u32 type; /* TBD to match kind */ | 63 | __u32 type; /* TBD to match kind */ |
64 | __u32 capab; /* capabilities includes 4 bit version */ | 64 | __u32 capab; /* capabilities includes 4 bit version */ |
65 | struct module *owner; | 65 | struct module *owner; |
66 | int (*act)(struct sk_buff **, struct tc_action *); | 66 | int (*act)(struct sk_buff **, struct tc_action *, struct tcf_result *); |
67 | int (*get_stats)(struct sk_buff *, struct tc_action *); | 67 | int (*get_stats)(struct sk_buff *, struct tc_action *); |
68 | int (*dump)(struct sk_buff *, struct tc_action *,int , int); | 68 | int (*dump)(struct sk_buff *, struct tc_action *,int , int); |
69 | int (*cleanup)(struct tc_action *, int bind); | 69 | int (*cleanup)(struct tc_action *, int bind); |
diff --git a/include/net/addrconf.h b/include/net/addrconf.h index a0ed93672176..750e2508dd90 100644 --- a/include/net/addrconf.h +++ b/include/net/addrconf.h | |||
@@ -45,6 +45,7 @@ struct prefix_info { | |||
45 | 45 | ||
46 | #ifdef __KERNEL__ | 46 | #ifdef __KERNEL__ |
47 | 47 | ||
48 | #include <linux/config.h> | ||
48 | #include <linux/netdevice.h> | 49 | #include <linux/netdevice.h> |
49 | #include <net/if_inet6.h> | 50 | #include <net/if_inet6.h> |
50 | #include <net/ipv6.h> | 51 | #include <net/ipv6.h> |
@@ -238,5 +239,10 @@ static inline int ipv6_addr_is_ll_all_routers(const struct in6_addr *addr) | |||
238 | addr->s6_addr32[3] == htonl(0x00000002)); | 239 | addr->s6_addr32[3] == htonl(0x00000002)); |
239 | } | 240 | } |
240 | 241 | ||
242 | #ifdef CONFIG_PROC_FS | ||
243 | extern int if6_proc_init(void); | ||
244 | extern void if6_proc_exit(void); | ||
245 | #endif | ||
246 | |||
241 | #endif | 247 | #endif |
242 | #endif | 248 | #endif |
diff --git a/include/net/af_unix.h b/include/net/af_unix.h index b60b3846b9d1..b5d785ab4a0e 100644 --- a/include/net/af_unix.h +++ b/include/net/af_unix.h | |||
@@ -1,5 +1,11 @@ | |||
1 | #ifndef __LINUX_NET_AFUNIX_H | 1 | #ifndef __LINUX_NET_AFUNIX_H |
2 | #define __LINUX_NET_AFUNIX_H | 2 | #define __LINUX_NET_AFUNIX_H |
3 | |||
4 | #include <linux/config.h> | ||
5 | #include <linux/socket.h> | ||
6 | #include <linux/un.h> | ||
7 | #include <net/sock.h> | ||
8 | |||
3 | extern void unix_inflight(struct file *fp); | 9 | extern void unix_inflight(struct file *fp); |
4 | extern void unix_notinflight(struct file *fp); | 10 | extern void unix_notinflight(struct file *fp); |
5 | extern void unix_gc(void); | 11 | extern void unix_gc(void); |
@@ -74,5 +80,14 @@ struct unix_sock { | |||
74 | wait_queue_head_t peer_wait; | 80 | wait_queue_head_t peer_wait; |
75 | }; | 81 | }; |
76 | #define unix_sk(__sk) ((struct unix_sock *)__sk) | 82 | #define unix_sk(__sk) ((struct unix_sock *)__sk) |
83 | |||
84 | #ifdef CONFIG_SYSCTL | ||
85 | extern int sysctl_unix_max_dgram_qlen; | ||
86 | extern void unix_sysctl_register(void); | ||
87 | extern void unix_sysctl_unregister(void); | ||
88 | #else | ||
89 | static inline void unix_sysctl_register(void) {} | ||
90 | static inline void unix_sysctl_unregister(void) {} | ||
91 | #endif | ||
77 | #endif | 92 | #endif |
78 | #endif | 93 | #endif |
diff --git a/include/net/arp.h b/include/net/arp.h index a1f09fad6a52..a13e30c35f42 100644 --- a/include/net/arp.h +++ b/include/net/arp.h | |||
@@ -11,7 +11,7 @@ extern struct neigh_table arp_tbl; | |||
11 | 11 | ||
12 | extern void arp_init(void); | 12 | extern void arp_init(void); |
13 | extern int arp_rcv(struct sk_buff *skb, struct net_device *dev, | 13 | extern int arp_rcv(struct sk_buff *skb, struct net_device *dev, |
14 | struct packet_type *pt); | 14 | struct packet_type *pt, struct net_device *orig_dev); |
15 | extern int arp_find(unsigned char *haddr, struct sk_buff *skb); | 15 | extern int arp_find(unsigned char *haddr, struct sk_buff *skb); |
16 | extern int arp_ioctl(unsigned int cmd, void __user *arg); | 16 | extern int arp_ioctl(unsigned int cmd, void __user *arg); |
17 | extern void arp_send(int type, int ptype, u32 dest_ip, | 17 | extern void arp_send(int type, int ptype, u32 dest_ip, |
diff --git a/include/net/ax25.h b/include/net/ax25.h index 3696f988a9f1..926eed543023 100644 --- a/include/net/ax25.h +++ b/include/net/ax25.h | |||
@@ -316,7 +316,7 @@ extern int ax25_protocol_is_registered(unsigned int); | |||
316 | 316 | ||
317 | /* ax25_in.c */ | 317 | /* ax25_in.c */ |
318 | extern int ax25_rx_iframe(ax25_cb *, struct sk_buff *); | 318 | extern int ax25_rx_iframe(ax25_cb *, struct sk_buff *); |
319 | extern int ax25_kiss_rcv(struct sk_buff *, struct net_device *, struct packet_type *); | 319 | extern int ax25_kiss_rcv(struct sk_buff *, struct net_device *, struct packet_type *, struct net_device *); |
320 | 320 | ||
321 | /* ax25_ip.c */ | 321 | /* ax25_ip.c */ |
322 | extern int ax25_encapsulate(struct sk_buff *, struct net_device *, unsigned short, void *, void *, unsigned int); | 322 | extern int ax25_encapsulate(struct sk_buff *, struct net_device *, unsigned short, void *, void *, unsigned int); |
diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index 06b24f637026..6dfa4a61ffd0 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h | |||
@@ -131,11 +131,12 @@ struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock); | |||
131 | 131 | ||
132 | /* Skb helpers */ | 132 | /* Skb helpers */ |
133 | struct bt_skb_cb { | 133 | struct bt_skb_cb { |
134 | int incoming; | 134 | __u8 pkt_type; |
135 | __u8 incoming; | ||
135 | }; | 136 | }; |
136 | #define bt_cb(skb) ((struct bt_skb_cb *)(skb->cb)) | 137 | #define bt_cb(skb) ((struct bt_skb_cb *)(skb->cb)) |
137 | 138 | ||
138 | static inline struct sk_buff *bt_skb_alloc(unsigned int len, int how) | 139 | static inline struct sk_buff *bt_skb_alloc(unsigned int len, unsigned int __nocast how) |
139 | { | 140 | { |
140 | struct sk_buff *skb; | 141 | struct sk_buff *skb; |
141 | 142 | ||
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index 6f0706f4af68..371e7d3f2e6f 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h | |||
@@ -453,6 +453,15 @@ struct inquiry_info_with_rssi { | |||
453 | __u16 clock_offset; | 453 | __u16 clock_offset; |
454 | __s8 rssi; | 454 | __s8 rssi; |
455 | } __attribute__ ((packed)); | 455 | } __attribute__ ((packed)); |
456 | struct inquiry_info_with_rssi_and_pscan_mode { | ||
457 | bdaddr_t bdaddr; | ||
458 | __u8 pscan_rep_mode; | ||
459 | __u8 pscan_period_mode; | ||
460 | __u8 pscan_mode; | ||
461 | __u8 dev_class[3]; | ||
462 | __u16 clock_offset; | ||
463 | __s8 rssi; | ||
464 | } __attribute__ ((packed)); | ||
456 | 465 | ||
457 | #define HCI_EV_CONN_COMPLETE 0x03 | 466 | #define HCI_EV_CONN_COMPLETE 0x03 |
458 | struct hci_ev_conn_complete { | 467 | struct hci_ev_conn_complete { |
@@ -584,6 +593,12 @@ struct hci_ev_clock_offset { | |||
584 | __u16 clock_offset; | 593 | __u16 clock_offset; |
585 | } __attribute__ ((packed)); | 594 | } __attribute__ ((packed)); |
586 | 595 | ||
596 | #define HCI_EV_PSCAN_REP_MODE 0x20 | ||
597 | struct hci_ev_pscan_rep_mode { | ||
598 | bdaddr_t bdaddr; | ||
599 | __u8 pscan_rep_mode; | ||
600 | } __attribute__ ((packed)); | ||
601 | |||
587 | /* Internal events generated by Bluetooth stack */ | 602 | /* Internal events generated by Bluetooth stack */ |
588 | #define HCI_EV_STACK_INTERNAL 0xFD | 603 | #define HCI_EV_STACK_INTERNAL 0xFD |
589 | struct hci_ev_stack_internal { | 604 | struct hci_ev_stack_internal { |
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index 6d63a47c731b..7f933f302078 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h | |||
@@ -404,7 +404,7 @@ static inline int hci_recv_frame(struct sk_buff *skb) | |||
404 | bt_cb(skb)->incoming = 1; | 404 | bt_cb(skb)->incoming = 1; |
405 | 405 | ||
406 | /* Time stamp */ | 406 | /* Time stamp */ |
407 | do_gettimeofday(&skb->stamp); | 407 | __net_timestamp(skb); |
408 | 408 | ||
409 | /* Queue frame for rx task */ | 409 | /* Queue frame for rx task */ |
410 | skb_queue_tail(&hdev->rx_q, skb); | 410 | skb_queue_tail(&hdev->rx_q, skb); |
diff --git a/include/net/bluetooth/rfcomm.h b/include/net/bluetooth/rfcomm.h index 13669bad00b3..ffea9d54071f 100644 --- a/include/net/bluetooth/rfcomm.h +++ b/include/net/bluetooth/rfcomm.h | |||
@@ -80,9 +80,9 @@ | |||
80 | #define RFCOMM_RPN_STOP_15 1 | 80 | #define RFCOMM_RPN_STOP_15 1 |
81 | 81 | ||
82 | #define RFCOMM_RPN_PARITY_NONE 0x0 | 82 | #define RFCOMM_RPN_PARITY_NONE 0x0 |
83 | #define RFCOMM_RPN_PARITY_ODD 0x4 | 83 | #define RFCOMM_RPN_PARITY_ODD 0x1 |
84 | #define RFCOMM_RPN_PARITY_EVEN 0x5 | 84 | #define RFCOMM_RPN_PARITY_EVEN 0x3 |
85 | #define RFCOMM_RPN_PARITY_MARK 0x6 | 85 | #define RFCOMM_RPN_PARITY_MARK 0x5 |
86 | #define RFCOMM_RPN_PARITY_SPACE 0x7 | 86 | #define RFCOMM_RPN_PARITY_SPACE 0x7 |
87 | 87 | ||
88 | #define RFCOMM_RPN_FLOW_NONE 0x00 | 88 | #define RFCOMM_RPN_FLOW_NONE 0x00 |
@@ -223,8 +223,14 @@ struct rfcomm_dlc { | |||
223 | #define RFCOMM_CFC_DISABLED 0 | 223 | #define RFCOMM_CFC_DISABLED 0 |
224 | #define RFCOMM_CFC_ENABLED RFCOMM_MAX_CREDITS | 224 | #define RFCOMM_CFC_ENABLED RFCOMM_MAX_CREDITS |
225 | 225 | ||
226 | /* ---- RFCOMM SEND RPN ---- */ | ||
227 | int rfcomm_send_rpn(struct rfcomm_session *s, int cr, u8 dlci, | ||
228 | u8 bit_rate, u8 data_bits, u8 stop_bits, | ||
229 | u8 parity, u8 flow_ctrl_settings, | ||
230 | u8 xon_char, u8 xoff_char, u16 param_mask); | ||
231 | |||
226 | /* ---- RFCOMM DLCs (channels) ---- */ | 232 | /* ---- RFCOMM DLCs (channels) ---- */ |
227 | struct rfcomm_dlc *rfcomm_dlc_alloc(int prio); | 233 | struct rfcomm_dlc *rfcomm_dlc_alloc(unsigned int __nocast prio); |
228 | void rfcomm_dlc_free(struct rfcomm_dlc *d); | 234 | void rfcomm_dlc_free(struct rfcomm_dlc *d); |
229 | int rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst, u8 channel); | 235 | int rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst, u8 channel); |
230 | int rfcomm_dlc_close(struct rfcomm_dlc *d, int reason); | 236 | int rfcomm_dlc_close(struct rfcomm_dlc *d, int reason); |
diff --git a/include/net/datalink.h b/include/net/datalink.h index 5797ba3d2eb5..deb7ca75db48 100644 --- a/include/net/datalink.h +++ b/include/net/datalink.h | |||
@@ -9,7 +9,7 @@ struct datalink_proto { | |||
9 | unsigned short header_length; | 9 | unsigned short header_length; |
10 | 10 | ||
11 | int (*rcvfunc)(struct sk_buff *, struct net_device *, | 11 | int (*rcvfunc)(struct sk_buff *, struct net_device *, |
12 | struct packet_type *); | 12 | struct packet_type *, struct net_device *); |
13 | int (*request)(struct datalink_proto *, struct sk_buff *, | 13 | int (*request)(struct datalink_proto *, struct sk_buff *, |
14 | unsigned char *); | 14 | unsigned char *); |
15 | struct list_head node; | 15 | struct list_head node; |
diff --git a/include/net/dn.h b/include/net/dn.h index 5551c46db397..c1dbbd222793 100644 --- a/include/net/dn.h +++ b/include/net/dn.h | |||
@@ -3,6 +3,7 @@ | |||
3 | 3 | ||
4 | #include <linux/dn.h> | 4 | #include <linux/dn.h> |
5 | #include <net/sock.h> | 5 | #include <net/sock.h> |
6 | #include <net/tcp.h> | ||
6 | #include <asm/byteorder.h> | 7 | #include <asm/byteorder.h> |
7 | 8 | ||
8 | typedef unsigned short dn_address; | 9 | typedef unsigned short dn_address; |
diff --git a/include/net/icmp.h b/include/net/icmp.h index e5ef0d15fb45..6cdebeee5f96 100644 --- a/include/net/icmp.h +++ b/include/net/icmp.h | |||
@@ -57,4 +57,11 @@ static inline struct raw_sock *raw_sk(const struct sock *sk) | |||
57 | return (struct raw_sock *)sk; | 57 | return (struct raw_sock *)sk; |
58 | } | 58 | } |
59 | 59 | ||
60 | extern int sysctl_icmp_echo_ignore_all; | ||
61 | extern int sysctl_icmp_echo_ignore_broadcasts; | ||
62 | extern int sysctl_icmp_ignore_bogus_error_responses; | ||
63 | extern int sysctl_icmp_errors_use_inbound_ifaddr; | ||
64 | extern int sysctl_icmp_ratelimit; | ||
65 | extern int sysctl_icmp_ratemask; | ||
66 | |||
60 | #endif /* _ICMP_H */ | 67 | #endif /* _ICMP_H */ |
diff --git a/include/net/inet6_hashtables.h b/include/net/inet6_hashtables.h new file mode 100644 index 000000000000..03df3b157960 --- /dev/null +++ b/include/net/inet6_hashtables.h | |||
@@ -0,0 +1,130 @@ | |||
1 | /* | ||
2 | * INET An implementation of the TCP/IP protocol suite for the LINUX | ||
3 | * operating system. INET is implemented using the BSD Socket | ||
4 | * interface as the means of communication with the user level. | ||
5 | * | ||
6 | * Authors: Lotsa people, from code originally in tcp | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU General Public License | ||
10 | * as published by the Free Software Foundation; either version | ||
11 | * 2 of the License, or (at your option) any later version. | ||
12 | */ | ||
13 | |||
14 | #ifndef _INET6_HASHTABLES_H | ||
15 | #define _INET6_HASHTABLES_H | ||
16 | |||
17 | #include <linux/config.h> | ||
18 | |||
19 | #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) | ||
20 | #include <linux/in6.h> | ||
21 | #include <linux/ipv6.h> | ||
22 | #include <linux/types.h> | ||
23 | |||
24 | #include <net/ipv6.h> | ||
25 | |||
26 | struct inet_hashinfo; | ||
27 | |||
28 | /* I have no idea if this is a good hash for v6 or not. -DaveM */ | ||
29 | static inline int inet6_ehashfn(const struct in6_addr *laddr, const u16 lport, | ||
30 | const struct in6_addr *faddr, const u16 fport, | ||
31 | const int ehash_size) | ||
32 | { | ||
33 | int hashent = (lport ^ fport); | ||
34 | |||
35 | hashent ^= (laddr->s6_addr32[3] ^ faddr->s6_addr32[3]); | ||
36 | hashent ^= hashent >> 16; | ||
37 | hashent ^= hashent >> 8; | ||
38 | return (hashent & (ehash_size - 1)); | ||
39 | } | ||
40 | |||
41 | static inline int inet6_sk_ehashfn(const struct sock *sk, const int ehash_size) | ||
42 | { | ||
43 | const struct inet_sock *inet = inet_sk(sk); | ||
44 | const struct ipv6_pinfo *np = inet6_sk(sk); | ||
45 | const struct in6_addr *laddr = &np->rcv_saddr; | ||
46 | const struct in6_addr *faddr = &np->daddr; | ||
47 | const __u16 lport = inet->num; | ||
48 | const __u16 fport = inet->dport; | ||
49 | return inet6_ehashfn(laddr, lport, faddr, fport, ehash_size); | ||
50 | } | ||
51 | |||
52 | /* | ||
53 | * Sockets in TCP_CLOSE state are _always_ taken out of the hash, so | ||
54 | * we need not check it for TCP lookups anymore, thanks Alexey. -DaveM | ||
55 | * | ||
56 | * The sockhash lock must be held as a reader here. | ||
57 | */ | ||
58 | static inline struct sock * | ||
59 | __inet6_lookup_established(struct inet_hashinfo *hashinfo, | ||
60 | const struct in6_addr *saddr, | ||
61 | const u16 sport, | ||
62 | const struct in6_addr *daddr, | ||
63 | const u16 hnum, | ||
64 | const int dif) | ||
65 | { | ||
66 | struct sock *sk; | ||
67 | const struct hlist_node *node; | ||
68 | const __u32 ports = INET_COMBINED_PORTS(sport, hnum); | ||
69 | /* Optimize here for direct hit, only listening connections can | ||
70 | * have wildcards anyways. | ||
71 | */ | ||
72 | const int hash = inet6_ehashfn(daddr, hnum, saddr, sport, | ||
73 | hashinfo->ehash_size); | ||
74 | struct inet_ehash_bucket *head = &hashinfo->ehash[hash]; | ||
75 | |||
76 | read_lock(&head->lock); | ||
77 | sk_for_each(sk, node, &head->chain) { | ||
78 | /* For IPV6 do the cheaper port and family tests first. */ | ||
79 | if (INET6_MATCH(sk, saddr, daddr, ports, dif)) | ||
80 | goto hit; /* You sunk my battleship! */ | ||
81 | } | ||
82 | /* Must check for a TIME_WAIT'er before going to listener hash. */ | ||
83 | sk_for_each(sk, node, &(head + hashinfo->ehash_size)->chain) { | ||
84 | const struct inet_timewait_sock *tw = inet_twsk(sk); | ||
85 | |||
86 | if(*((__u32 *)&(tw->tw_dport)) == ports && | ||
87 | sk->sk_family == PF_INET6) { | ||
88 | const struct tcp6_timewait_sock *tcp6tw = tcp6_twsk(sk); | ||
89 | |||
90 | if (ipv6_addr_equal(&tcp6tw->tw_v6_daddr, saddr) && | ||
91 | ipv6_addr_equal(&tcp6tw->tw_v6_rcv_saddr, daddr) && | ||
92 | (!sk->sk_bound_dev_if || sk->sk_bound_dev_if == dif)) | ||
93 | goto hit; | ||
94 | } | ||
95 | } | ||
96 | read_unlock(&head->lock); | ||
97 | return NULL; | ||
98 | |||
99 | hit: | ||
100 | sock_hold(sk); | ||
101 | read_unlock(&head->lock); | ||
102 | return sk; | ||
103 | } | ||
104 | |||
105 | extern struct sock *inet6_lookup_listener(struct inet_hashinfo *hashinfo, | ||
106 | const struct in6_addr *daddr, | ||
107 | const unsigned short hnum, | ||
108 | const int dif); | ||
109 | |||
110 | static inline struct sock *__inet6_lookup(struct inet_hashinfo *hashinfo, | ||
111 | const struct in6_addr *saddr, | ||
112 | const u16 sport, | ||
113 | const struct in6_addr *daddr, | ||
114 | const u16 hnum, | ||
115 | const int dif) | ||
116 | { | ||
117 | struct sock *sk = __inet6_lookup_established(hashinfo, saddr, sport, | ||
118 | daddr, hnum, dif); | ||
119 | if (sk) | ||
120 | return sk; | ||
121 | |||
122 | return inet6_lookup_listener(hashinfo, daddr, hnum, dif); | ||
123 | } | ||
124 | |||
125 | extern struct sock *inet6_lookup(struct inet_hashinfo *hashinfo, | ||
126 | const struct in6_addr *saddr, const u16 sport, | ||
127 | const struct in6_addr *daddr, const u16 dport, | ||
128 | const int dif); | ||
129 | #endif /* defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) */ | ||
130 | #endif /* _INET6_HASHTABLES_H */ | ||
diff --git a/include/net/inet_common.h b/include/net/inet_common.h index fbc1f4d140d8..f943306ce5ff 100644 --- a/include/net/inet_common.h +++ b/include/net/inet_common.h | |||
@@ -8,6 +8,11 @@ extern struct proto_ops inet_dgram_ops; | |||
8 | * INET4 prototypes used by INET6 | 8 | * INET4 prototypes used by INET6 |
9 | */ | 9 | */ |
10 | 10 | ||
11 | struct msghdr; | ||
12 | struct sock; | ||
13 | struct sockaddr; | ||
14 | struct socket; | ||
15 | |||
11 | extern void inet_remove_sock(struct sock *sk1); | 16 | extern void inet_remove_sock(struct sock *sk1); |
12 | extern void inet_put_sock(unsigned short num, | 17 | extern void inet_put_sock(unsigned short num, |
13 | struct sock *sk); | 18 | struct sock *sk); |
@@ -29,7 +34,6 @@ extern unsigned int inet_poll(struct file * file, struct socket *sock, struct p | |||
29 | extern int inet_listen(struct socket *sock, int backlog); | 34 | extern int inet_listen(struct socket *sock, int backlog); |
30 | 35 | ||
31 | extern void inet_sock_destruct(struct sock *sk); | 36 | extern void inet_sock_destruct(struct sock *sk); |
32 | extern atomic_t inet_sock_nr; | ||
33 | 37 | ||
34 | extern int inet_bind(struct socket *sock, | 38 | extern int inet_bind(struct socket *sock, |
35 | struct sockaddr *uaddr, int addr_len); | 39 | struct sockaddr *uaddr, int addr_len); |
diff --git a/include/net/inet_connection_sock.h b/include/net/inet_connection_sock.h new file mode 100644 index 000000000000..8a87a3a4f107 --- /dev/null +++ b/include/net/inet_connection_sock.h | |||
@@ -0,0 +1,276 @@ | |||
1 | /* | ||
2 | * NET Generic infrastructure for INET connection oriented protocols. | ||
3 | * | ||
4 | * Definitions for inet_connection_sock | ||
5 | * | ||
6 | * Authors: Many people, see the TCP sources | ||
7 | * | ||
8 | * From code originally in TCP | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or | ||
11 | * modify it under the terms of the GNU General Public License | ||
12 | * as published by the Free Software Foundation; either version | ||
13 | * 2 of the License, or (at your option) any later version. | ||
14 | */ | ||
15 | #ifndef _INET_CONNECTION_SOCK_H | ||
16 | #define _INET_CONNECTION_SOCK_H | ||
17 | |||
18 | #include <linux/ip.h> | ||
19 | #include <linux/string.h> | ||
20 | #include <linux/timer.h> | ||
21 | #include <net/request_sock.h> | ||
22 | |||
23 | #define INET_CSK_DEBUG 1 | ||
24 | |||
25 | /* Cancel timers, when they are not required. */ | ||
26 | #undef INET_CSK_CLEAR_TIMERS | ||
27 | |||
28 | struct inet_bind_bucket; | ||
29 | struct inet_hashinfo; | ||
30 | struct tcp_congestion_ops; | ||
31 | |||
32 | /** inet_connection_sock - INET connection oriented sock | ||
33 | * | ||
34 | * @icsk_accept_queue: FIFO of established children | ||
35 | * @icsk_bind_hash: Bind node | ||
36 | * @icsk_timeout: Timeout | ||
37 | * @icsk_retransmit_timer: Resend (no ack) | ||
38 | * @icsk_rto: Retransmit timeout | ||
39 | * @icsk_ca_ops Pluggable congestion control hook | ||
40 | * @icsk_ca_state: Congestion control state | ||
41 | * @icsk_retransmits: Number of unrecovered [RTO] timeouts | ||
42 | * @icsk_pending: Scheduled timer event | ||
43 | * @icsk_backoff: Backoff | ||
44 | * @icsk_syn_retries: Number of allowed SYN (or equivalent) retries | ||
45 | * @icsk_probes_out: unanswered 0 window probes | ||
46 | * @icsk_ack: Delayed ACK control data | ||
47 | */ | ||
48 | struct inet_connection_sock { | ||
49 | /* inet_sock has to be the first member! */ | ||
50 | struct inet_sock icsk_inet; | ||
51 | struct request_sock_queue icsk_accept_queue; | ||
52 | struct inet_bind_bucket *icsk_bind_hash; | ||
53 | unsigned long icsk_timeout; | ||
54 | struct timer_list icsk_retransmit_timer; | ||
55 | struct timer_list icsk_delack_timer; | ||
56 | __u32 icsk_rto; | ||
57 | struct tcp_congestion_ops *icsk_ca_ops; | ||
58 | __u8 icsk_ca_state; | ||
59 | __u8 icsk_retransmits; | ||
60 | __u8 icsk_pending; | ||
61 | __u8 icsk_backoff; | ||
62 | __u8 icsk_syn_retries; | ||
63 | __u8 icsk_probes_out; | ||
64 | /* 2 BYTES HOLE, TRY TO PACK! */ | ||
65 | struct { | ||
66 | __u8 pending; /* ACK is pending */ | ||
67 | __u8 quick; /* Scheduled number of quick acks */ | ||
68 | __u8 pingpong; /* The session is interactive */ | ||
69 | __u8 blocked; /* Delayed ACK was blocked by socket lock */ | ||
70 | __u32 ato; /* Predicted tick of soft clock */ | ||
71 | unsigned long timeout; /* Currently scheduled timeout */ | ||
72 | __u32 lrcvtime; /* timestamp of last received data packet */ | ||
73 | __u16 last_seg_size; /* Size of last incoming segment */ | ||
74 | __u16 rcv_mss; /* MSS used for delayed ACK decisions */ | ||
75 | } icsk_ack; | ||
76 | u32 icsk_ca_priv[16]; | ||
77 | #define ICSK_CA_PRIV_SIZE (16 * sizeof(u32)) | ||
78 | }; | ||
79 | |||
80 | #define ICSK_TIME_RETRANS 1 /* Retransmit timer */ | ||
81 | #define ICSK_TIME_DACK 2 /* Delayed ack timer */ | ||
82 | #define ICSK_TIME_PROBE0 3 /* Zero window probe timer */ | ||
83 | #define ICSK_TIME_KEEPOPEN 4 /* Keepalive timer */ | ||
84 | |||
85 | static inline struct inet_connection_sock *inet_csk(const struct sock *sk) | ||
86 | { | ||
87 | return (struct inet_connection_sock *)sk; | ||
88 | } | ||
89 | |||
90 | static inline void *inet_csk_ca(const struct sock *sk) | ||
91 | { | ||
92 | return (void *)inet_csk(sk)->icsk_ca_priv; | ||
93 | } | ||
94 | |||
95 | extern struct sock *inet_csk_clone(struct sock *sk, | ||
96 | const struct request_sock *req, | ||
97 | const unsigned int __nocast priority); | ||
98 | |||
99 | enum inet_csk_ack_state_t { | ||
100 | ICSK_ACK_SCHED = 1, | ||
101 | ICSK_ACK_TIMER = 2, | ||
102 | ICSK_ACK_PUSHED = 4 | ||
103 | }; | ||
104 | |||
105 | extern void inet_csk_init_xmit_timers(struct sock *sk, | ||
106 | void (*retransmit_handler)(unsigned long), | ||
107 | void (*delack_handler)(unsigned long), | ||
108 | void (*keepalive_handler)(unsigned long)); | ||
109 | extern void inet_csk_clear_xmit_timers(struct sock *sk); | ||
110 | |||
111 | static inline void inet_csk_schedule_ack(struct sock *sk) | ||
112 | { | ||
113 | inet_csk(sk)->icsk_ack.pending |= ICSK_ACK_SCHED; | ||
114 | } | ||
115 | |||
116 | static inline int inet_csk_ack_scheduled(const struct sock *sk) | ||
117 | { | ||
118 | return inet_csk(sk)->icsk_ack.pending & ICSK_ACK_SCHED; | ||
119 | } | ||
120 | |||
121 | static inline void inet_csk_delack_init(struct sock *sk) | ||
122 | { | ||
123 | memset(&inet_csk(sk)->icsk_ack, 0, sizeof(inet_csk(sk)->icsk_ack)); | ||
124 | } | ||
125 | |||
126 | extern void inet_csk_delete_keepalive_timer(struct sock *sk); | ||
127 | extern void inet_csk_reset_keepalive_timer(struct sock *sk, unsigned long timeout); | ||
128 | |||
129 | #ifdef INET_CSK_DEBUG | ||
130 | extern const char inet_csk_timer_bug_msg[]; | ||
131 | #endif | ||
132 | |||
133 | static inline void inet_csk_clear_xmit_timer(struct sock *sk, const int what) | ||
134 | { | ||
135 | struct inet_connection_sock *icsk = inet_csk(sk); | ||
136 | |||
137 | if (what == ICSK_TIME_RETRANS || what == ICSK_TIME_PROBE0) { | ||
138 | icsk->icsk_pending = 0; | ||
139 | #ifdef INET_CSK_CLEAR_TIMERS | ||
140 | sk_stop_timer(sk, &icsk->icsk_retransmit_timer); | ||
141 | #endif | ||
142 | } else if (what == ICSK_TIME_DACK) { | ||
143 | icsk->icsk_ack.blocked = icsk->icsk_ack.pending = 0; | ||
144 | #ifdef INET_CSK_CLEAR_TIMERS | ||
145 | sk_stop_timer(sk, &icsk->icsk_delack_timer); | ||
146 | #endif | ||
147 | } | ||
148 | #ifdef INET_CSK_DEBUG | ||
149 | else { | ||
150 | pr_debug(inet_csk_timer_bug_msg); | ||
151 | } | ||
152 | #endif | ||
153 | } | ||
154 | |||
155 | /* | ||
156 | * Reset the retransmission timer | ||
157 | */ | ||
158 | static inline void inet_csk_reset_xmit_timer(struct sock *sk, const int what, | ||
159 | unsigned long when, | ||
160 | const unsigned long max_when) | ||
161 | { | ||
162 | struct inet_connection_sock *icsk = inet_csk(sk); | ||
163 | |||
164 | if (when > max_when) { | ||
165 | #ifdef INET_CSK_DEBUG | ||
166 | pr_debug("reset_xmit_timer: sk=%p %d when=0x%lx, caller=%p\n", | ||
167 | sk, what, when, current_text_addr()); | ||
168 | #endif | ||
169 | when = max_when; | ||
170 | } | ||
171 | |||
172 | if (what == ICSK_TIME_RETRANS || what == ICSK_TIME_PROBE0) { | ||
173 | icsk->icsk_pending = what; | ||
174 | icsk->icsk_timeout = jiffies + when; | ||
175 | sk_reset_timer(sk, &icsk->icsk_retransmit_timer, icsk->icsk_timeout); | ||
176 | } else if (what == ICSK_TIME_DACK) { | ||
177 | icsk->icsk_ack.pending |= ICSK_ACK_TIMER; | ||
178 | icsk->icsk_ack.timeout = jiffies + when; | ||
179 | sk_reset_timer(sk, &icsk->icsk_delack_timer, icsk->icsk_ack.timeout); | ||
180 | } | ||
181 | #ifdef INET_CSK_DEBUG | ||
182 | else { | ||
183 | pr_debug(inet_csk_timer_bug_msg); | ||
184 | } | ||
185 | #endif | ||
186 | } | ||
187 | |||
188 | extern struct sock *inet_csk_accept(struct sock *sk, int flags, int *err); | ||
189 | |||
190 | extern struct request_sock *inet_csk_search_req(const struct sock *sk, | ||
191 | struct request_sock ***prevp, | ||
192 | const __u16 rport, | ||
193 | const __u32 raddr, | ||
194 | const __u32 laddr); | ||
195 | extern int inet_csk_get_port(struct inet_hashinfo *hashinfo, | ||
196 | struct sock *sk, unsigned short snum); | ||
197 | |||
198 | extern struct dst_entry* inet_csk_route_req(struct sock *sk, | ||
199 | const struct request_sock *req); | ||
200 | |||
201 | static inline void inet_csk_reqsk_queue_add(struct sock *sk, | ||
202 | struct request_sock *req, | ||
203 | struct sock *child) | ||
204 | { | ||
205 | reqsk_queue_add(&inet_csk(sk)->icsk_accept_queue, req, sk, child); | ||
206 | } | ||
207 | |||
208 | extern void inet_csk_reqsk_queue_hash_add(struct sock *sk, | ||
209 | struct request_sock *req, | ||
210 | const unsigned timeout); | ||
211 | |||
212 | static inline void inet_csk_reqsk_queue_removed(struct sock *sk, | ||
213 | struct request_sock *req) | ||
214 | { | ||
215 | if (reqsk_queue_removed(&inet_csk(sk)->icsk_accept_queue, req) == 0) | ||
216 | inet_csk_delete_keepalive_timer(sk); | ||
217 | } | ||
218 | |||
219 | static inline void inet_csk_reqsk_queue_added(struct sock *sk, | ||
220 | const unsigned long timeout) | ||
221 | { | ||
222 | if (reqsk_queue_added(&inet_csk(sk)->icsk_accept_queue) == 0) | ||
223 | inet_csk_reset_keepalive_timer(sk, timeout); | ||
224 | } | ||
225 | |||
226 | static inline int inet_csk_reqsk_queue_len(const struct sock *sk) | ||
227 | { | ||
228 | return reqsk_queue_len(&inet_csk(sk)->icsk_accept_queue); | ||
229 | } | ||
230 | |||
231 | static inline int inet_csk_reqsk_queue_young(const struct sock *sk) | ||
232 | { | ||
233 | return reqsk_queue_len_young(&inet_csk(sk)->icsk_accept_queue); | ||
234 | } | ||
235 | |||
236 | static inline int inet_csk_reqsk_queue_is_full(const struct sock *sk) | ||
237 | { | ||
238 | return reqsk_queue_is_full(&inet_csk(sk)->icsk_accept_queue); | ||
239 | } | ||
240 | |||
241 | static inline void inet_csk_reqsk_queue_unlink(struct sock *sk, | ||
242 | struct request_sock *req, | ||
243 | struct request_sock **prev) | ||
244 | { | ||
245 | reqsk_queue_unlink(&inet_csk(sk)->icsk_accept_queue, req, prev); | ||
246 | } | ||
247 | |||
248 | static inline void inet_csk_reqsk_queue_drop(struct sock *sk, | ||
249 | struct request_sock *req, | ||
250 | struct request_sock **prev) | ||
251 | { | ||
252 | inet_csk_reqsk_queue_unlink(sk, req, prev); | ||
253 | inet_csk_reqsk_queue_removed(sk, req); | ||
254 | reqsk_free(req); | ||
255 | } | ||
256 | |||
257 | extern void inet_csk_reqsk_queue_prune(struct sock *parent, | ||
258 | const unsigned long interval, | ||
259 | const unsigned long timeout, | ||
260 | const unsigned long max_rto); | ||
261 | |||
262 | extern void inet_csk_destroy_sock(struct sock *sk); | ||
263 | |||
264 | /* | ||
265 | * LISTEN is a special case for poll.. | ||
266 | */ | ||
267 | static inline unsigned int inet_csk_listen_poll(const struct sock *sk) | ||
268 | { | ||
269 | return !reqsk_queue_empty(&inet_csk(sk)->icsk_accept_queue) ? | ||
270 | (POLLIN | POLLRDNORM) : 0; | ||
271 | } | ||
272 | |||
273 | extern int inet_csk_listen_start(struct sock *sk, const int nr_table_entries); | ||
274 | extern void inet_csk_listen_stop(struct sock *sk); | ||
275 | |||
276 | #endif /* _INET_CONNECTION_SOCK_H */ | ||
diff --git a/include/net/inet_hashtables.h b/include/net/inet_hashtables.h new file mode 100644 index 000000000000..646b6ea7fe26 --- /dev/null +++ b/include/net/inet_hashtables.h | |||
@@ -0,0 +1,427 @@ | |||
1 | /* | ||
2 | * INET An implementation of the TCP/IP protocol suite for the LINUX | ||
3 | * operating system. INET is implemented using the BSD Socket | ||
4 | * interface as the means of communication with the user level. | ||
5 | * | ||
6 | * Authors: Lotsa people, from code originally in tcp | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU General Public License | ||
10 | * as published by the Free Software Foundation; either version | ||
11 | * 2 of the License, or (at your option) any later version. | ||
12 | */ | ||
13 | |||
14 | #ifndef _INET_HASHTABLES_H | ||
15 | #define _INET_HASHTABLES_H | ||
16 | |||
17 | #include <linux/config.h> | ||
18 | |||
19 | #include <linux/interrupt.h> | ||
20 | #include <linux/ipv6.h> | ||
21 | #include <linux/list.h> | ||
22 | #include <linux/slab.h> | ||
23 | #include <linux/socket.h> | ||
24 | #include <linux/spinlock.h> | ||
25 | #include <linux/types.h> | ||
26 | #include <linux/wait.h> | ||
27 | |||
28 | #include <net/inet_connection_sock.h> | ||
29 | #include <net/route.h> | ||
30 | #include <net/sock.h> | ||
31 | #include <net/tcp_states.h> | ||
32 | |||
33 | #include <asm/atomic.h> | ||
34 | #include <asm/byteorder.h> | ||
35 | |||
36 | /* This is for all connections with a full identity, no wildcards. | ||
37 | * New scheme, half the table is for TIME_WAIT, the other half is | ||
38 | * for the rest. I'll experiment with dynamic table growth later. | ||
39 | */ | ||
40 | struct inet_ehash_bucket { | ||
41 | rwlock_t lock; | ||
42 | struct hlist_head chain; | ||
43 | } __attribute__((__aligned__(8))); | ||
44 | |||
45 | /* There are a few simple rules, which allow for local port reuse by | ||
46 | * an application. In essence: | ||
47 | * | ||
48 | * 1) Sockets bound to different interfaces may share a local port. | ||
49 | * Failing that, goto test 2. | ||
50 | * 2) If all sockets have sk->sk_reuse set, and none of them are in | ||
51 | * TCP_LISTEN state, the port may be shared. | ||
52 | * Failing that, goto test 3. | ||
53 | * 3) If all sockets are bound to a specific inet_sk(sk)->rcv_saddr local | ||
54 | * address, and none of them are the same, the port may be | ||
55 | * shared. | ||
56 | * Failing this, the port cannot be shared. | ||
57 | * | ||
58 | * The interesting point, is test #2. This is what an FTP server does | ||
59 | * all day. To optimize this case we use a specific flag bit defined | ||
60 | * below. As we add sockets to a bind bucket list, we perform a | ||
61 | * check of: (newsk->sk_reuse && (newsk->sk_state != TCP_LISTEN)) | ||
62 | * As long as all sockets added to a bind bucket pass this test, | ||
63 | * the flag bit will be set. | ||
64 | * The resulting situation is that tcp_v[46]_verify_bind() can just check | ||
65 | * for this flag bit, if it is set and the socket trying to bind has | ||
66 | * sk->sk_reuse set, we don't even have to walk the owners list at all, | ||
67 | * we return that it is ok to bind this socket to the requested local port. | ||
68 | * | ||
69 | * Sounds like a lot of work, but it is worth it. In a more naive | ||
70 | * implementation (ie. current FreeBSD etc.) the entire list of ports | ||
71 | * must be walked for each data port opened by an ftp server. Needless | ||
72 | * to say, this does not scale at all. With a couple thousand FTP | ||
73 | * users logged onto your box, isn't it nice to know that new data | ||
74 | * ports are created in O(1) time? I thought so. ;-) -DaveM | ||
75 | */ | ||
76 | struct inet_bind_bucket { | ||
77 | unsigned short port; | ||
78 | signed short fastreuse; | ||
79 | struct hlist_node node; | ||
80 | struct hlist_head owners; | ||
81 | }; | ||
82 | |||
83 | #define inet_bind_bucket_for_each(tb, node, head) \ | ||
84 | hlist_for_each_entry(tb, node, head, node) | ||
85 | |||
86 | struct inet_bind_hashbucket { | ||
87 | spinlock_t lock; | ||
88 | struct hlist_head chain; | ||
89 | }; | ||
90 | |||
91 | /* This is for listening sockets, thus all sockets which possess wildcards. */ | ||
92 | #define INET_LHTABLE_SIZE 32 /* Yes, really, this is all you need. */ | ||
93 | |||
94 | struct inet_hashinfo { | ||
95 | /* This is for sockets with full identity only. Sockets here will | ||
96 | * always be without wildcards and will have the following invariant: | ||
97 | * | ||
98 | * TCP_ESTABLISHED <= sk->sk_state < TCP_CLOSE | ||
99 | * | ||
100 | * First half of the table is for sockets not in TIME_WAIT, second half | ||
101 | * is for TIME_WAIT sockets only. | ||
102 | */ | ||
103 | struct inet_ehash_bucket *ehash; | ||
104 | |||
105 | /* Ok, let's try this, I give up, we do need a local binding | ||
106 | * TCP hash as well as the others for fast bind/connect. | ||
107 | */ | ||
108 | struct inet_bind_hashbucket *bhash; | ||
109 | |||
110 | int bhash_size; | ||
111 | int ehash_size; | ||
112 | |||
113 | /* All sockets in TCP_LISTEN state will be in here. This is the only | ||
114 | * table where wildcard'd TCP sockets can exist. Hash function here | ||
115 | * is just local port number. | ||
116 | */ | ||
117 | struct hlist_head listening_hash[INET_LHTABLE_SIZE]; | ||
118 | |||
119 | /* All the above members are written once at bootup and | ||
120 | * never written again _or_ are predominantly read-access. | ||
121 | * | ||
122 | * Now align to a new cache line as all the following members | ||
123 | * are often dirty. | ||
124 | */ | ||
125 | rwlock_t lhash_lock ____cacheline_aligned; | ||
126 | atomic_t lhash_users; | ||
127 | wait_queue_head_t lhash_wait; | ||
128 | spinlock_t portalloc_lock; | ||
129 | kmem_cache_t *bind_bucket_cachep; | ||
130 | int port_rover; | ||
131 | }; | ||
132 | |||
133 | static inline int inet_ehashfn(const __u32 laddr, const __u16 lport, | ||
134 | const __u32 faddr, const __u16 fport, | ||
135 | const int ehash_size) | ||
136 | { | ||
137 | int h = (laddr ^ lport) ^ (faddr ^ fport); | ||
138 | h ^= h >> 16; | ||
139 | h ^= h >> 8; | ||
140 | return h & (ehash_size - 1); | ||
141 | } | ||
142 | |||
143 | static inline int inet_sk_ehashfn(const struct sock *sk, const int ehash_size) | ||
144 | { | ||
145 | const struct inet_sock *inet = inet_sk(sk); | ||
146 | const __u32 laddr = inet->rcv_saddr; | ||
147 | const __u16 lport = inet->num; | ||
148 | const __u32 faddr = inet->daddr; | ||
149 | const __u16 fport = inet->dport; | ||
150 | |||
151 | return inet_ehashfn(laddr, lport, faddr, fport, ehash_size); | ||
152 | } | ||
153 | |||
154 | extern struct inet_bind_bucket * | ||
155 | inet_bind_bucket_create(kmem_cache_t *cachep, | ||
156 | struct inet_bind_hashbucket *head, | ||
157 | const unsigned short snum); | ||
158 | extern void inet_bind_bucket_destroy(kmem_cache_t *cachep, | ||
159 | struct inet_bind_bucket *tb); | ||
160 | |||
161 | static inline int inet_bhashfn(const __u16 lport, const int bhash_size) | ||
162 | { | ||
163 | return lport & (bhash_size - 1); | ||
164 | } | ||
165 | |||
166 | extern void inet_bind_hash(struct sock *sk, struct inet_bind_bucket *tb, | ||
167 | const unsigned short snum); | ||
168 | |||
169 | /* These can have wildcards, don't try too hard. */ | ||
170 | static inline int inet_lhashfn(const unsigned short num) | ||
171 | { | ||
172 | return num & (INET_LHTABLE_SIZE - 1); | ||
173 | } | ||
174 | |||
175 | static inline int inet_sk_listen_hashfn(const struct sock *sk) | ||
176 | { | ||
177 | return inet_lhashfn(inet_sk(sk)->num); | ||
178 | } | ||
179 | |||
180 | /* Caller must disable local BH processing. */ | ||
181 | static inline void __inet_inherit_port(struct inet_hashinfo *table, | ||
182 | struct sock *sk, struct sock *child) | ||
183 | { | ||
184 | const int bhash = inet_bhashfn(inet_sk(child)->num, table->bhash_size); | ||
185 | struct inet_bind_hashbucket *head = &table->bhash[bhash]; | ||
186 | struct inet_bind_bucket *tb; | ||
187 | |||
188 | spin_lock(&head->lock); | ||
189 | tb = inet_csk(sk)->icsk_bind_hash; | ||
190 | sk_add_bind_node(child, &tb->owners); | ||
191 | inet_csk(child)->icsk_bind_hash = tb; | ||
192 | spin_unlock(&head->lock); | ||
193 | } | ||
194 | |||
195 | static inline void inet_inherit_port(struct inet_hashinfo *table, | ||
196 | struct sock *sk, struct sock *child) | ||
197 | { | ||
198 | local_bh_disable(); | ||
199 | __inet_inherit_port(table, sk, child); | ||
200 | local_bh_enable(); | ||
201 | } | ||
202 | |||
203 | extern void inet_put_port(struct inet_hashinfo *table, struct sock *sk); | ||
204 | |||
205 | extern void inet_listen_wlock(struct inet_hashinfo *hashinfo); | ||
206 | |||
207 | /* | ||
208 | * - We may sleep inside this lock. | ||
209 | * - If sleeping is not required (or called from BH), | ||
210 | * use plain read_(un)lock(&inet_hashinfo.lhash_lock). | ||
211 | */ | ||
212 | static inline void inet_listen_lock(struct inet_hashinfo *hashinfo) | ||
213 | { | ||
214 | /* read_lock synchronizes to candidates to writers */ | ||
215 | read_lock(&hashinfo->lhash_lock); | ||
216 | atomic_inc(&hashinfo->lhash_users); | ||
217 | read_unlock(&hashinfo->lhash_lock); | ||
218 | } | ||
219 | |||
220 | static inline void inet_listen_unlock(struct inet_hashinfo *hashinfo) | ||
221 | { | ||
222 | if (atomic_dec_and_test(&hashinfo->lhash_users)) | ||
223 | wake_up(&hashinfo->lhash_wait); | ||
224 | } | ||
225 | |||
226 | static inline void __inet_hash(struct inet_hashinfo *hashinfo, | ||
227 | struct sock *sk, const int listen_possible) | ||
228 | { | ||
229 | struct hlist_head *list; | ||
230 | rwlock_t *lock; | ||
231 | |||
232 | BUG_TRAP(sk_unhashed(sk)); | ||
233 | if (listen_possible && sk->sk_state == TCP_LISTEN) { | ||
234 | list = &hashinfo->listening_hash[inet_sk_listen_hashfn(sk)]; | ||
235 | lock = &hashinfo->lhash_lock; | ||
236 | inet_listen_wlock(hashinfo); | ||
237 | } else { | ||
238 | sk->sk_hashent = inet_sk_ehashfn(sk, hashinfo->ehash_size); | ||
239 | list = &hashinfo->ehash[sk->sk_hashent].chain; | ||
240 | lock = &hashinfo->ehash[sk->sk_hashent].lock; | ||
241 | write_lock(lock); | ||
242 | } | ||
243 | __sk_add_node(sk, list); | ||
244 | sock_prot_inc_use(sk->sk_prot); | ||
245 | write_unlock(lock); | ||
246 | if (listen_possible && sk->sk_state == TCP_LISTEN) | ||
247 | wake_up(&hashinfo->lhash_wait); | ||
248 | } | ||
249 | |||
250 | static inline void inet_hash(struct inet_hashinfo *hashinfo, struct sock *sk) | ||
251 | { | ||
252 | if (sk->sk_state != TCP_CLOSE) { | ||
253 | local_bh_disable(); | ||
254 | __inet_hash(hashinfo, sk, 1); | ||
255 | local_bh_enable(); | ||
256 | } | ||
257 | } | ||
258 | |||
259 | static inline void inet_unhash(struct inet_hashinfo *hashinfo, struct sock *sk) | ||
260 | { | ||
261 | rwlock_t *lock; | ||
262 | |||
263 | if (sk_unhashed(sk)) | ||
264 | goto out; | ||
265 | |||
266 | if (sk->sk_state == TCP_LISTEN) { | ||
267 | local_bh_disable(); | ||
268 | inet_listen_wlock(hashinfo); | ||
269 | lock = &hashinfo->lhash_lock; | ||
270 | } else { | ||
271 | struct inet_ehash_bucket *head = &hashinfo->ehash[sk->sk_hashent]; | ||
272 | lock = &head->lock; | ||
273 | write_lock_bh(&head->lock); | ||
274 | } | ||
275 | |||
276 | if (__sk_del_node_init(sk)) | ||
277 | sock_prot_dec_use(sk->sk_prot); | ||
278 | write_unlock_bh(lock); | ||
279 | out: | ||
280 | if (sk->sk_state == TCP_LISTEN) | ||
281 | wake_up(&hashinfo->lhash_wait); | ||
282 | } | ||
283 | |||
284 | static inline int inet_iif(const struct sk_buff *skb) | ||
285 | { | ||
286 | return ((struct rtable *)skb->dst)->rt_iif; | ||
287 | } | ||
288 | |||
289 | extern struct sock *__inet_lookup_listener(const struct hlist_head *head, | ||
290 | const u32 daddr, | ||
291 | const unsigned short hnum, | ||
292 | const int dif); | ||
293 | |||
294 | /* Optimize the common listener case. */ | ||
295 | static inline struct sock * | ||
296 | inet_lookup_listener(struct inet_hashinfo *hashinfo, | ||
297 | const u32 daddr, | ||
298 | const unsigned short hnum, const int dif) | ||
299 | { | ||
300 | struct sock *sk = NULL; | ||
301 | const struct hlist_head *head; | ||
302 | |||
303 | read_lock(&hashinfo->lhash_lock); | ||
304 | head = &hashinfo->listening_hash[inet_lhashfn(hnum)]; | ||
305 | if (!hlist_empty(head)) { | ||
306 | const struct inet_sock *inet = inet_sk((sk = __sk_head(head))); | ||
307 | |||
308 | if (inet->num == hnum && !sk->sk_node.next && | ||
309 | (!inet->rcv_saddr || inet->rcv_saddr == daddr) && | ||
310 | (sk->sk_family == PF_INET || !ipv6_only_sock(sk)) && | ||
311 | !sk->sk_bound_dev_if) | ||
312 | goto sherry_cache; | ||
313 | sk = __inet_lookup_listener(head, daddr, hnum, dif); | ||
314 | } | ||
315 | if (sk) { | ||
316 | sherry_cache: | ||
317 | sock_hold(sk); | ||
318 | } | ||
319 | read_unlock(&hashinfo->lhash_lock); | ||
320 | return sk; | ||
321 | } | ||
322 | |||
323 | /* Socket demux engine toys. */ | ||
324 | #ifdef __BIG_ENDIAN | ||
325 | #define INET_COMBINED_PORTS(__sport, __dport) \ | ||
326 | (((__u32)(__sport) << 16) | (__u32)(__dport)) | ||
327 | #else /* __LITTLE_ENDIAN */ | ||
328 | #define INET_COMBINED_PORTS(__sport, __dport) \ | ||
329 | (((__u32)(__dport) << 16) | (__u32)(__sport)) | ||
330 | #endif | ||
331 | |||
332 | #if (BITS_PER_LONG == 64) | ||
333 | #ifdef __BIG_ENDIAN | ||
334 | #define INET_ADDR_COOKIE(__name, __saddr, __daddr) \ | ||
335 | const __u64 __name = (((__u64)(__saddr)) << 32) | ((__u64)(__daddr)); | ||
336 | #else /* __LITTLE_ENDIAN */ | ||
337 | #define INET_ADDR_COOKIE(__name, __saddr, __daddr) \ | ||
338 | const __u64 __name = (((__u64)(__daddr)) << 32) | ((__u64)(__saddr)); | ||
339 | #endif /* __BIG_ENDIAN */ | ||
340 | #define INET_MATCH(__sk, __cookie, __saddr, __daddr, __ports, __dif)\ | ||
341 | (((*((__u64 *)&(inet_sk(__sk)->daddr))) == (__cookie)) && \ | ||
342 | ((*((__u32 *)&(inet_sk(__sk)->dport))) == (__ports)) && \ | ||
343 | (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif)))) | ||
344 | #define INET_TW_MATCH(__sk, __cookie, __saddr, __daddr, __ports, __dif)\ | ||
345 | (((*((__u64 *)&(inet_twsk(__sk)->tw_daddr))) == (__cookie)) && \ | ||
346 | ((*((__u32 *)&(inet_twsk(__sk)->tw_dport))) == (__ports)) && \ | ||
347 | (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif)))) | ||
348 | #else /* 32-bit arch */ | ||
349 | #define INET_ADDR_COOKIE(__name, __saddr, __daddr) | ||
350 | #define INET_MATCH(__sk, __cookie, __saddr, __daddr, __ports, __dif) \ | ||
351 | ((inet_sk(__sk)->daddr == (__saddr)) && \ | ||
352 | (inet_sk(__sk)->rcv_saddr == (__daddr)) && \ | ||
353 | ((*((__u32 *)&(inet_sk(__sk)->dport))) == (__ports)) && \ | ||
354 | (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif)))) | ||
355 | #define INET_TW_MATCH(__sk, __cookie, __saddr, __daddr, __ports, __dif) \ | ||
356 | ((inet_twsk(__sk)->tw_daddr == (__saddr)) && \ | ||
357 | (inet_twsk(__sk)->tw_rcv_saddr == (__daddr)) && \ | ||
358 | ((*((__u32 *)&(inet_twsk(__sk)->tw_dport))) == (__ports)) && \ | ||
359 | (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif)))) | ||
360 | #endif /* 64-bit arch */ | ||
361 | |||
362 | /* | ||
363 | * Sockets in TCP_CLOSE state are _always_ taken out of the hash, so we need | ||
364 | * not check it for lookups anymore, thanks Alexey. -DaveM | ||
365 | * | ||
366 | * Local BH must be disabled here. | ||
367 | */ | ||
368 | static inline struct sock * | ||
369 | __inet_lookup_established(struct inet_hashinfo *hashinfo, | ||
370 | const u32 saddr, const u16 sport, | ||
371 | const u32 daddr, const u16 hnum, | ||
372 | const int dif) | ||
373 | { | ||
374 | INET_ADDR_COOKIE(acookie, saddr, daddr) | ||
375 | const __u32 ports = INET_COMBINED_PORTS(sport, hnum); | ||
376 | struct sock *sk; | ||
377 | const struct hlist_node *node; | ||
378 | /* Optimize here for direct hit, only listening connections can | ||
379 | * have wildcards anyways. | ||
380 | */ | ||
381 | const int hash = inet_ehashfn(daddr, hnum, saddr, sport, hashinfo->ehash_size); | ||
382 | struct inet_ehash_bucket *head = &hashinfo->ehash[hash]; | ||
383 | |||
384 | read_lock(&head->lock); | ||
385 | sk_for_each(sk, node, &head->chain) { | ||
386 | if (INET_MATCH(sk, acookie, saddr, daddr, ports, dif)) | ||
387 | goto hit; /* You sunk my battleship! */ | ||
388 | } | ||
389 | |||
390 | /* Must check for a TIME_WAIT'er before going to listener hash. */ | ||
391 | sk_for_each(sk, node, &(head + hashinfo->ehash_size)->chain) { | ||
392 | if (INET_TW_MATCH(sk, acookie, saddr, daddr, ports, dif)) | ||
393 | goto hit; | ||
394 | } | ||
395 | sk = NULL; | ||
396 | out: | ||
397 | read_unlock(&head->lock); | ||
398 | return sk; | ||
399 | hit: | ||
400 | sock_hold(sk); | ||
401 | goto out; | ||
402 | } | ||
403 | |||
404 | static inline struct sock *__inet_lookup(struct inet_hashinfo *hashinfo, | ||
405 | const u32 saddr, const u16 sport, | ||
406 | const u32 daddr, const u16 hnum, | ||
407 | const int dif) | ||
408 | { | ||
409 | struct sock *sk = __inet_lookup_established(hashinfo, saddr, sport, daddr, | ||
410 | hnum, dif); | ||
411 | return sk ? : inet_lookup_listener(hashinfo, daddr, hnum, dif); | ||
412 | } | ||
413 | |||
414 | static inline struct sock *inet_lookup(struct inet_hashinfo *hashinfo, | ||
415 | const u32 saddr, const u16 sport, | ||
416 | const u32 daddr, const u16 dport, | ||
417 | const int dif) | ||
418 | { | ||
419 | struct sock *sk; | ||
420 | |||
421 | local_bh_disable(); | ||
422 | sk = __inet_lookup(hashinfo, saddr, sport, daddr, ntohs(dport), dif); | ||
423 | local_bh_enable(); | ||
424 | |||
425 | return sk; | ||
426 | } | ||
427 | #endif /* _INET_HASHTABLES_H */ | ||
diff --git a/include/net/inet_timewait_sock.h b/include/net/inet_timewait_sock.h new file mode 100644 index 000000000000..3b070352e869 --- /dev/null +++ b/include/net/inet_timewait_sock.h | |||
@@ -0,0 +1,219 @@ | |||
1 | /* | ||
2 | * INET An implementation of the TCP/IP protocol suite for the LINUX | ||
3 | * operating system. INET is implemented using the BSD Socket | ||
4 | * interface as the means of communication with the user level. | ||
5 | * | ||
6 | * Definitions for a generic INET TIMEWAIT sock | ||
7 | * | ||
8 | * From code originally in net/tcp.h | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or | ||
11 | * modify it under the terms of the GNU General Public License | ||
12 | * as published by the Free Software Foundation; either version | ||
13 | * 2 of the License, or (at your option) any later version. | ||
14 | */ | ||
15 | #ifndef _INET_TIMEWAIT_SOCK_ | ||
16 | #define _INET_TIMEWAIT_SOCK_ | ||
17 | |||
18 | #include <linux/config.h> | ||
19 | |||
20 | #include <linux/ip.h> | ||
21 | #include <linux/list.h> | ||
22 | #include <linux/timer.h> | ||
23 | #include <linux/types.h> | ||
24 | #include <linux/workqueue.h> | ||
25 | |||
26 | #include <net/sock.h> | ||
27 | #include <net/tcp_states.h> | ||
28 | |||
29 | #include <asm/atomic.h> | ||
30 | |||
31 | struct inet_hashinfo; | ||
32 | |||
33 | #define INET_TWDR_RECYCLE_SLOTS_LOG 5 | ||
34 | #define INET_TWDR_RECYCLE_SLOTS (1 << INET_TWDR_RECYCLE_SLOTS_LOG) | ||
35 | |||
36 | /* | ||
37 | * If time > 4sec, it is "slow" path, no recycling is required, | ||
38 | * so that we select tick to get range about 4 seconds. | ||
39 | */ | ||
40 | #if HZ <= 16 || HZ > 4096 | ||
41 | # error Unsupported: HZ <= 16 or HZ > 4096 | ||
42 | #elif HZ <= 32 | ||
43 | # define INET_TWDR_RECYCLE_TICK (5 + 2 - INET_TWDR_RECYCLE_SLOTS_LOG) | ||
44 | #elif HZ <= 64 | ||
45 | # define INET_TWDR_RECYCLE_TICK (6 + 2 - INET_TWDR_RECYCLE_SLOTS_LOG) | ||
46 | #elif HZ <= 128 | ||
47 | # define INET_TWDR_RECYCLE_TICK (7 + 2 - INET_TWDR_RECYCLE_SLOTS_LOG) | ||
48 | #elif HZ <= 256 | ||
49 | # define INET_TWDR_RECYCLE_TICK (8 + 2 - INET_TWDR_RECYCLE_SLOTS_LOG) | ||
50 | #elif HZ <= 512 | ||
51 | # define INET_TWDR_RECYCLE_TICK (9 + 2 - INET_TWDR_RECYCLE_SLOTS_LOG) | ||
52 | #elif HZ <= 1024 | ||
53 | # define INET_TWDR_RECYCLE_TICK (10 + 2 - INET_TWDR_RECYCLE_SLOTS_LOG) | ||
54 | #elif HZ <= 2048 | ||
55 | # define INET_TWDR_RECYCLE_TICK (11 + 2 - INET_TWDR_RECYCLE_SLOTS_LOG) | ||
56 | #else | ||
57 | # define INET_TWDR_RECYCLE_TICK (12 + 2 - INET_TWDR_RECYCLE_SLOTS_LOG) | ||
58 | #endif | ||
59 | |||
60 | /* TIME_WAIT reaping mechanism. */ | ||
61 | #define INET_TWDR_TWKILL_SLOTS 8 /* Please keep this a power of 2. */ | ||
62 | |||
63 | #define INET_TWDR_TWKILL_QUOTA 100 | ||
64 | |||
65 | struct inet_timewait_death_row { | ||
66 | /* Short-time timewait calendar */ | ||
67 | int twcal_hand; | ||
68 | int twcal_jiffie; | ||
69 | struct timer_list twcal_timer; | ||
70 | struct hlist_head twcal_row[INET_TWDR_RECYCLE_SLOTS]; | ||
71 | |||
72 | spinlock_t death_lock; | ||
73 | int tw_count; | ||
74 | int period; | ||
75 | u32 thread_slots; | ||
76 | struct work_struct twkill_work; | ||
77 | struct timer_list tw_timer; | ||
78 | int slot; | ||
79 | struct hlist_head cells[INET_TWDR_TWKILL_SLOTS]; | ||
80 | struct inet_hashinfo *hashinfo; | ||
81 | int sysctl_tw_recycle; | ||
82 | int sysctl_max_tw_buckets; | ||
83 | }; | ||
84 | |||
85 | extern void inet_twdr_hangman(unsigned long data); | ||
86 | extern void inet_twdr_twkill_work(void *data); | ||
87 | extern void inet_twdr_twcal_tick(unsigned long data); | ||
88 | |||
89 | #if (BITS_PER_LONG == 64) | ||
90 | #define INET_TIMEWAIT_ADDRCMP_ALIGN_BYTES 8 | ||
91 | #else | ||
92 | #define INET_TIMEWAIT_ADDRCMP_ALIGN_BYTES 4 | ||
93 | #endif | ||
94 | |||
95 | struct inet_bind_bucket; | ||
96 | |||
97 | /* | ||
98 | * This is a TIME_WAIT sock. It works around the memory consumption | ||
99 | * problems of sockets in such a state on heavily loaded servers, but | ||
100 | * without violating the protocol specification. | ||
101 | */ | ||
102 | struct inet_timewait_sock { | ||
103 | /* | ||
104 | * Now struct sock also uses sock_common, so please just | ||
105 | * don't add nothing before this first member (__tw_common) --acme | ||
106 | */ | ||
107 | struct sock_common __tw_common; | ||
108 | #define tw_family __tw_common.skc_family | ||
109 | #define tw_state __tw_common.skc_state | ||
110 | #define tw_reuse __tw_common.skc_reuse | ||
111 | #define tw_bound_dev_if __tw_common.skc_bound_dev_if | ||
112 | #define tw_node __tw_common.skc_node | ||
113 | #define tw_bind_node __tw_common.skc_bind_node | ||
114 | #define tw_refcnt __tw_common.skc_refcnt | ||
115 | #define tw_prot __tw_common.skc_prot | ||
116 | volatile unsigned char tw_substate; | ||
117 | /* 3 bits hole, try to pack */ | ||
118 | unsigned char tw_rcv_wscale; | ||
119 | /* Socket demultiplex comparisons on incoming packets. */ | ||
120 | /* these five are in inet_sock */ | ||
121 | __u16 tw_sport; | ||
122 | __u32 tw_daddr __attribute__((aligned(INET_TIMEWAIT_ADDRCMP_ALIGN_BYTES))); | ||
123 | __u32 tw_rcv_saddr; | ||
124 | __u16 tw_dport; | ||
125 | __u16 tw_num; | ||
126 | /* And these are ours. */ | ||
127 | __u8 tw_ipv6only:1; | ||
128 | /* 31 bits hole, try to pack */ | ||
129 | int tw_hashent; | ||
130 | int tw_timeout; | ||
131 | unsigned long tw_ttd; | ||
132 | struct inet_bind_bucket *tw_tb; | ||
133 | struct hlist_node tw_death_node; | ||
134 | }; | ||
135 | |||
136 | static inline void inet_twsk_add_node(struct inet_timewait_sock *tw, | ||
137 | struct hlist_head *list) | ||
138 | { | ||
139 | hlist_add_head(&tw->tw_node, list); | ||
140 | } | ||
141 | |||
142 | static inline void inet_twsk_add_bind_node(struct inet_timewait_sock *tw, | ||
143 | struct hlist_head *list) | ||
144 | { | ||
145 | hlist_add_head(&tw->tw_bind_node, list); | ||
146 | } | ||
147 | |||
148 | static inline int inet_twsk_dead_hashed(const struct inet_timewait_sock *tw) | ||
149 | { | ||
150 | return tw->tw_death_node.pprev != NULL; | ||
151 | } | ||
152 | |||
153 | static inline void inet_twsk_dead_node_init(struct inet_timewait_sock *tw) | ||
154 | { | ||
155 | tw->tw_death_node.pprev = NULL; | ||
156 | } | ||
157 | |||
158 | static inline void __inet_twsk_del_dead_node(struct inet_timewait_sock *tw) | ||
159 | { | ||
160 | __hlist_del(&tw->tw_death_node); | ||
161 | inet_twsk_dead_node_init(tw); | ||
162 | } | ||
163 | |||
164 | static inline int inet_twsk_del_dead_node(struct inet_timewait_sock *tw) | ||
165 | { | ||
166 | if (inet_twsk_dead_hashed(tw)) { | ||
167 | __inet_twsk_del_dead_node(tw); | ||
168 | return 1; | ||
169 | } | ||
170 | return 0; | ||
171 | } | ||
172 | |||
173 | #define inet_twsk_for_each(tw, node, head) \ | ||
174 | hlist_for_each_entry(tw, node, head, tw_node) | ||
175 | |||
176 | #define inet_twsk_for_each_inmate(tw, node, jail) \ | ||
177 | hlist_for_each_entry(tw, node, jail, tw_death_node) | ||
178 | |||
179 | #define inet_twsk_for_each_inmate_safe(tw, node, safe, jail) \ | ||
180 | hlist_for_each_entry_safe(tw, node, safe, jail, tw_death_node) | ||
181 | |||
182 | static inline struct inet_timewait_sock *inet_twsk(const struct sock *sk) | ||
183 | { | ||
184 | return (struct inet_timewait_sock *)sk; | ||
185 | } | ||
186 | |||
187 | static inline u32 inet_rcv_saddr(const struct sock *sk) | ||
188 | { | ||
189 | return likely(sk->sk_state != TCP_TIME_WAIT) ? | ||
190 | inet_sk(sk)->rcv_saddr : inet_twsk(sk)->tw_rcv_saddr; | ||
191 | } | ||
192 | |||
193 | static inline void inet_twsk_put(struct inet_timewait_sock *tw) | ||
194 | { | ||
195 | if (atomic_dec_and_test(&tw->tw_refcnt)) { | ||
196 | #ifdef SOCK_REFCNT_DEBUG | ||
197 | printk(KERN_DEBUG "%s timewait_sock %p released\n", | ||
198 | tw->tw_prot->name, tw); | ||
199 | #endif | ||
200 | kmem_cache_free(tw->tw_prot->twsk_slab, tw); | ||
201 | } | ||
202 | } | ||
203 | |||
204 | extern struct inet_timewait_sock *inet_twsk_alloc(const struct sock *sk, | ||
205 | const int state); | ||
206 | |||
207 | extern void __inet_twsk_kill(struct inet_timewait_sock *tw, | ||
208 | struct inet_hashinfo *hashinfo); | ||
209 | |||
210 | extern void __inet_twsk_hashdance(struct inet_timewait_sock *tw, | ||
211 | struct sock *sk, | ||
212 | struct inet_hashinfo *hashinfo); | ||
213 | |||
214 | extern void inet_twsk_schedule(struct inet_timewait_sock *tw, | ||
215 | struct inet_timewait_death_row *twdr, | ||
216 | const int timeo, const int timewait_len); | ||
217 | extern void inet_twsk_deschedule(struct inet_timewait_sock *tw, | ||
218 | struct inet_timewait_death_row *twdr); | ||
219 | #endif /* _INET_TIMEWAIT_SOCK_ */ | ||
diff --git a/include/net/ip.h b/include/net/ip.h index 32360bbe143f..e4563bbee6ea 100644 --- a/include/net/ip.h +++ b/include/net/ip.h | |||
@@ -86,7 +86,7 @@ extern int ip_build_and_send_pkt(struct sk_buff *skb, struct sock *sk, | |||
86 | u32 saddr, u32 daddr, | 86 | u32 saddr, u32 daddr, |
87 | struct ip_options *opt); | 87 | struct ip_options *opt); |
88 | extern int ip_rcv(struct sk_buff *skb, struct net_device *dev, | 88 | extern int ip_rcv(struct sk_buff *skb, struct net_device *dev, |
89 | struct packet_type *pt); | 89 | struct packet_type *pt, struct net_device *orig_dev); |
90 | extern int ip_local_deliver(struct sk_buff *skb); | 90 | extern int ip_local_deliver(struct sk_buff *skb); |
91 | extern int ip_mr_input(struct sk_buff *skb); | 91 | extern int ip_mr_input(struct sk_buff *skb); |
92 | extern int ip_output(struct sk_buff *skb); | 92 | extern int ip_output(struct sk_buff *skb); |
@@ -140,8 +140,6 @@ struct ip_reply_arg { | |||
140 | void ip_send_reply(struct sock *sk, struct sk_buff *skb, struct ip_reply_arg *arg, | 140 | void ip_send_reply(struct sock *sk, struct sk_buff *skb, struct ip_reply_arg *arg, |
141 | unsigned int len); | 141 | unsigned int len); |
142 | 142 | ||
143 | extern int ip_finish_output(struct sk_buff *skb); | ||
144 | |||
145 | struct ipv4_config | 143 | struct ipv4_config |
146 | { | 144 | { |
147 | int log_martians; | 145 | int log_martians; |
@@ -165,6 +163,24 @@ extern int sysctl_local_port_range[2]; | |||
165 | extern int sysctl_ip_default_ttl; | 163 | extern int sysctl_ip_default_ttl; |
166 | extern int sysctl_ip_nonlocal_bind; | 164 | extern int sysctl_ip_nonlocal_bind; |
167 | 165 | ||
166 | /* From ip_fragment.c */ | ||
167 | extern int sysctl_ipfrag_high_thresh; | ||
168 | extern int sysctl_ipfrag_low_thresh; | ||
169 | extern int sysctl_ipfrag_time; | ||
170 | extern int sysctl_ipfrag_secret_interval; | ||
171 | |||
172 | /* From inetpeer.c */ | ||
173 | extern int inet_peer_threshold; | ||
174 | extern int inet_peer_minttl; | ||
175 | extern int inet_peer_maxttl; | ||
176 | extern int inet_peer_gc_mintime; | ||
177 | extern int inet_peer_gc_maxtime; | ||
178 | |||
179 | /* From ip_output.c */ | ||
180 | extern int sysctl_ip_dynaddr; | ||
181 | |||
182 | extern void ipfrag_init(void); | ||
183 | |||
168 | #ifdef CONFIG_INET | 184 | #ifdef CONFIG_INET |
169 | /* The function in 2.2 was invalid, producing wrong result for | 185 | /* The function in 2.2 was invalid, producing wrong result for |
170 | * check=0xFEFF. It was noticed by Arthur Skawina _year_ ago. --ANK(000625) */ | 186 | * check=0xFEFF. It was noticed by Arthur Skawina _year_ ago. --ANK(000625) */ |
@@ -319,7 +335,10 @@ extern void ip_options_build(struct sk_buff *skb, struct ip_options *opt, u32 da | |||
319 | extern int ip_options_echo(struct ip_options *dopt, struct sk_buff *skb); | 335 | extern int ip_options_echo(struct ip_options *dopt, struct sk_buff *skb); |
320 | extern void ip_options_fragment(struct sk_buff *skb); | 336 | extern void ip_options_fragment(struct sk_buff *skb); |
321 | extern int ip_options_compile(struct ip_options *opt, struct sk_buff *skb); | 337 | extern int ip_options_compile(struct ip_options *opt, struct sk_buff *skb); |
322 | extern int ip_options_get(struct ip_options **optp, unsigned char *data, int optlen, int user); | 338 | extern int ip_options_get(struct ip_options **optp, |
339 | unsigned char *data, int optlen); | ||
340 | extern int ip_options_get_from_user(struct ip_options **optp, | ||
341 | unsigned char __user *data, int optlen); | ||
323 | extern void ip_options_undo(struct ip_options * opt); | 342 | extern void ip_options_undo(struct ip_options * opt); |
324 | extern void ip_forward_options(struct sk_buff *skb); | 343 | extern void ip_forward_options(struct sk_buff *skb); |
325 | extern int ip_options_rcv_srr(struct sk_buff *skb); | 344 | extern int ip_options_rcv_srr(struct sk_buff *skb); |
@@ -350,5 +369,10 @@ int ipv4_doint_and_flush_strategy(ctl_table *table, int __user *name, int nlen, | |||
350 | void __user *oldval, size_t __user *oldlenp, | 369 | void __user *oldval, size_t __user *oldlenp, |
351 | void __user *newval, size_t newlen, | 370 | void __user *newval, size_t newlen, |
352 | void **context); | 371 | void **context); |
372 | #ifdef CONFIG_PROC_FS | ||
373 | extern int ip_misc_proc_init(void); | ||
374 | #endif | ||
375 | |||
376 | extern struct ctl_table ipv4_table[]; | ||
353 | 377 | ||
354 | #endif /* _IP_H */ | 378 | #endif /* _IP_H */ |
diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h index f920706d526b..1f2e428ca364 100644 --- a/include/net/ip6_route.h +++ b/include/net/ip6_route.h | |||
@@ -12,7 +12,6 @@ | |||
12 | #include <net/flow.h> | 12 | #include <net/flow.h> |
13 | #include <net/ip6_fib.h> | 13 | #include <net/ip6_fib.h> |
14 | #include <net/sock.h> | 14 | #include <net/sock.h> |
15 | #include <linux/tcp.h> | ||
16 | #include <linux/ip.h> | 15 | #include <linux/ip.h> |
17 | #include <linux/ipv6.h> | 16 | #include <linux/ipv6.h> |
18 | 17 | ||
diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h index a4208a336ac0..14de4ebd1211 100644 --- a/include/net/ip_fib.h +++ b/include/net/ip_fib.h | |||
@@ -295,4 +295,9 @@ static inline void fib_res_put(struct fib_result *res) | |||
295 | #endif | 295 | #endif |
296 | } | 296 | } |
297 | 297 | ||
298 | #ifdef CONFIG_PROC_FS | ||
299 | extern int fib_proc_init(void); | ||
300 | extern void fib_proc_exit(void); | ||
301 | #endif | ||
302 | |||
298 | #endif /* _NET_FIB_H */ | 303 | #endif /* _NET_FIB_H */ |
diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h index 52da5d26617a..7a3c43711a17 100644 --- a/include/net/ip_vs.h +++ b/include/net/ip_vs.h | |||
@@ -255,7 +255,6 @@ struct ip_vs_daemon_user { | |||
255 | #include <asm/atomic.h> /* for struct atomic_t */ | 255 | #include <asm/atomic.h> /* for struct atomic_t */ |
256 | #include <linux/netdevice.h> /* for struct neighbour */ | 256 | #include <linux/netdevice.h> /* for struct neighbour */ |
257 | #include <net/dst.h> /* for struct dst_entry */ | 257 | #include <net/dst.h> /* for struct dst_entry */ |
258 | #include <net/tcp.h> | ||
259 | #include <net/udp.h> | 258 | #include <net/udp.h> |
260 | #include <linux/compiler.h> | 259 | #include <linux/compiler.h> |
261 | 260 | ||
diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 69324465e8b3..3203eaff4bd4 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h | |||
@@ -104,6 +104,7 @@ struct frag_hdr { | |||
104 | 104 | ||
105 | #ifdef __KERNEL__ | 105 | #ifdef __KERNEL__ |
106 | 106 | ||
107 | #include <linux/config.h> | ||
107 | #include <net/sock.h> | 108 | #include <net/sock.h> |
108 | 109 | ||
109 | /* sysctls */ | 110 | /* sysctls */ |
@@ -145,7 +146,6 @@ DECLARE_SNMP_STAT(struct udp_mib, udp_stats_in6); | |||
145 | #define UDP6_INC_STATS(field) SNMP_INC_STATS(udp_stats_in6, field) | 146 | #define UDP6_INC_STATS(field) SNMP_INC_STATS(udp_stats_in6, field) |
146 | #define UDP6_INC_STATS_BH(field) SNMP_INC_STATS_BH(udp_stats_in6, field) | 147 | #define UDP6_INC_STATS_BH(field) SNMP_INC_STATS_BH(udp_stats_in6, field) |
147 | #define UDP6_INC_STATS_USER(field) SNMP_INC_STATS_USER(udp_stats_in6, field) | 148 | #define UDP6_INC_STATS_USER(field) SNMP_INC_STATS_USER(udp_stats_in6, field) |
148 | extern atomic_t inet6_sock_nr; | ||
149 | 149 | ||
150 | int snmp6_register_dev(struct inet6_dev *idev); | 150 | int snmp6_register_dev(struct inet6_dev *idev); |
151 | int snmp6_unregister_dev(struct inet6_dev *idev); | 151 | int snmp6_unregister_dev(struct inet6_dev *idev); |
@@ -346,7 +346,8 @@ static inline int ipv6_addr_any(const struct in6_addr *a) | |||
346 | 346 | ||
347 | extern int ipv6_rcv(struct sk_buff *skb, | 347 | extern int ipv6_rcv(struct sk_buff *skb, |
348 | struct net_device *dev, | 348 | struct net_device *dev, |
349 | struct packet_type *pt); | 349 | struct packet_type *pt, |
350 | struct net_device *orig_dev); | ||
350 | 351 | ||
351 | /* | 352 | /* |
352 | * upper-layer output functions | 353 | * upper-layer output functions |
@@ -464,8 +465,38 @@ extern int sysctl_ip6frag_low_thresh; | |||
464 | extern int sysctl_ip6frag_time; | 465 | extern int sysctl_ip6frag_time; |
465 | extern int sysctl_ip6frag_secret_interval; | 466 | extern int sysctl_ip6frag_secret_interval; |
466 | 467 | ||
467 | #endif /* __KERNEL__ */ | 468 | extern struct proto_ops inet6_stream_ops; |
468 | #endif /* _NET_IPV6_H */ | 469 | extern struct proto_ops inet6_dgram_ops; |
470 | |||
471 | extern int ip6_mc_source(int add, int omode, struct sock *sk, | ||
472 | struct group_source_req *pgsr); | ||
473 | extern int ip6_mc_msfilter(struct sock *sk, struct group_filter *gsf); | ||
474 | extern int ip6_mc_msfget(struct sock *sk, struct group_filter *gsf, | ||
475 | struct group_filter __user *optval, | ||
476 | int __user *optlen); | ||
477 | |||
478 | #ifdef CONFIG_PROC_FS | ||
479 | extern int ac6_proc_init(void); | ||
480 | extern void ac6_proc_exit(void); | ||
481 | extern int raw6_proc_init(void); | ||
482 | extern void raw6_proc_exit(void); | ||
483 | extern int tcp6_proc_init(void); | ||
484 | extern void tcp6_proc_exit(void); | ||
485 | extern int udp6_proc_init(void); | ||
486 | extern void udp6_proc_exit(void); | ||
487 | extern int ipv6_misc_proc_init(void); | ||
488 | extern void ipv6_misc_proc_exit(void); | ||
489 | |||
490 | extern struct rt6_statistics rt6_stats; | ||
491 | #endif | ||
469 | 492 | ||
493 | #ifdef CONFIG_SYSCTL | ||
494 | extern ctl_table ipv6_route_table[]; | ||
495 | extern ctl_table ipv6_icmp_table[]; | ||
470 | 496 | ||
497 | extern void ipv6_sysctl_register(void); | ||
498 | extern void ipv6_sysctl_unregister(void); | ||
499 | #endif | ||
471 | 500 | ||
501 | #endif /* __KERNEL__ */ | ||
502 | #endif /* _NET_IPV6_H */ | ||
diff --git a/include/net/llc.h b/include/net/llc.h index c9aed2a8b4e2..71769a5aeef3 100644 --- a/include/net/llc.h +++ b/include/net/llc.h | |||
@@ -46,7 +46,8 @@ struct llc_sap { | |||
46 | unsigned char f_bit; | 46 | unsigned char f_bit; |
47 | int (*rcv_func)(struct sk_buff *skb, | 47 | int (*rcv_func)(struct sk_buff *skb, |
48 | struct net_device *dev, | 48 | struct net_device *dev, |
49 | struct packet_type *pt); | 49 | struct packet_type *pt, |
50 | struct net_device *orig_dev); | ||
50 | struct llc_addr laddr; | 51 | struct llc_addr laddr; |
51 | struct list_head node; | 52 | struct list_head node; |
52 | struct { | 53 | struct { |
@@ -64,7 +65,7 @@ extern rwlock_t llc_sap_list_lock; | |||
64 | extern unsigned char llc_station_mac_sa[ETH_ALEN]; | 65 | extern unsigned char llc_station_mac_sa[ETH_ALEN]; |
65 | 66 | ||
66 | extern int llc_rcv(struct sk_buff *skb, struct net_device *dev, | 67 | extern int llc_rcv(struct sk_buff *skb, struct net_device *dev, |
67 | struct packet_type *pt); | 68 | struct packet_type *pt, struct net_device *orig_dev); |
68 | 69 | ||
69 | extern int llc_mac_hdr_init(struct sk_buff *skb, | 70 | extern int llc_mac_hdr_init(struct sk_buff *skb, |
70 | unsigned char *sa, unsigned char *da); | 71 | unsigned char *sa, unsigned char *da); |
@@ -78,7 +79,8 @@ extern void llc_set_station_handler(void (*handler)(struct sk_buff *skb)); | |||
78 | extern struct llc_sap *llc_sap_open(unsigned char lsap, | 79 | extern struct llc_sap *llc_sap_open(unsigned char lsap, |
79 | int (*rcv)(struct sk_buff *skb, | 80 | int (*rcv)(struct sk_buff *skb, |
80 | struct net_device *dev, | 81 | struct net_device *dev, |
81 | struct packet_type *pt)); | 82 | struct packet_type *pt, |
83 | struct net_device *orig_dev)); | ||
82 | extern void llc_sap_close(struct llc_sap *sap); | 84 | extern void llc_sap_close(struct llc_sap *sap); |
83 | 85 | ||
84 | extern struct llc_sap *llc_sap_find(unsigned char sap_value); | 86 | extern struct llc_sap *llc_sap_find(unsigned char sap_value); |
diff --git a/include/net/neighbour.h b/include/net/neighbour.h index 89809891e5ab..34c07731933d 100644 --- a/include/net/neighbour.h +++ b/include/net/neighbour.h | |||
@@ -363,7 +363,14 @@ __neigh_lookup_errno(struct neigh_table *tbl, const void *pkey, | |||
363 | return neigh_create(tbl, pkey, dev); | 363 | return neigh_create(tbl, pkey, dev); |
364 | } | 364 | } |
365 | 365 | ||
366 | #define LOCALLY_ENQUEUED -2 | 366 | struct neighbour_cb { |
367 | unsigned long sched_next; | ||
368 | unsigned int flags; | ||
369 | }; | ||
370 | |||
371 | #define LOCALLY_ENQUEUED 0x1 | ||
372 | |||
373 | #define NEIGH_CB(skb) ((struct neighbour_cb *)(skb)->cb) | ||
367 | 374 | ||
368 | #endif | 375 | #endif |
369 | #endif | 376 | #endif |
diff --git a/include/net/p8022.h b/include/net/p8022.h index 3c99a86c3581..42e9fac51b31 100644 --- a/include/net/p8022.h +++ b/include/net/p8022.h | |||
@@ -4,7 +4,10 @@ extern struct datalink_proto * | |||
4 | register_8022_client(unsigned char type, | 4 | register_8022_client(unsigned char type, |
5 | int (*func)(struct sk_buff *skb, | 5 | int (*func)(struct sk_buff *skb, |
6 | struct net_device *dev, | 6 | struct net_device *dev, |
7 | struct packet_type *pt)); | 7 | struct packet_type *pt, |
8 | struct net_device *orig_dev)); | ||
8 | extern void unregister_8022_client(struct datalink_proto *proto); | 9 | extern void unregister_8022_client(struct datalink_proto *proto); |
9 | 10 | ||
11 | extern struct datalink_proto *make_8023_client(void); | ||
12 | extern void destroy_8023_client(struct datalink_proto *dl); | ||
10 | #endif | 13 | #endif |
diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h index 4abda6aec05a..b902d24a3256 100644 --- a/include/net/pkt_cls.h +++ b/include/net/pkt_cls.h | |||
@@ -352,10 +352,10 @@ tcf_change_indev(struct tcf_proto *tp, char *indev, struct rtattr *indev_tlv) | |||
352 | static inline int | 352 | static inline int |
353 | tcf_match_indev(struct sk_buff *skb, char *indev) | 353 | tcf_match_indev(struct sk_buff *skb, char *indev) |
354 | { | 354 | { |
355 | if (0 != indev[0]) { | 355 | if (indev[0]) { |
356 | if (NULL == skb->input_dev) | 356 | if (!skb->input_dev) |
357 | return 0; | 357 | return 0; |
358 | else if (0 != strcmp(indev, skb->input_dev->name)) | 358 | if (strcmp(indev, skb->input_dev->name)) |
359 | return 0; | 359 | return 0; |
360 | } | 360 | } |
361 | 361 | ||
diff --git a/include/net/psnap.h b/include/net/psnap.h index 9c94e8f98b36..b2e01cc3fc8a 100644 --- a/include/net/psnap.h +++ b/include/net/psnap.h | |||
@@ -1,7 +1,7 @@ | |||
1 | #ifndef _NET_PSNAP_H | 1 | #ifndef _NET_PSNAP_H |
2 | #define _NET_PSNAP_H | 2 | #define _NET_PSNAP_H |
3 | 3 | ||
4 | extern struct datalink_proto *register_snap_client(unsigned char *desc, int (*rcvfunc)(struct sk_buff *, struct net_device *, struct packet_type *)); | 4 | extern struct datalink_proto *register_snap_client(unsigned char *desc, int (*rcvfunc)(struct sk_buff *, struct net_device *, struct packet_type *, struct net_device *orig_dev)); |
5 | extern void unregister_snap_client(struct datalink_proto *proto); | 5 | extern void unregister_snap_client(struct datalink_proto *proto); |
6 | 6 | ||
7 | #endif | 7 | #endif |
diff --git a/include/net/raw.h b/include/net/raw.h index 1c411c45587a..f47917469b12 100644 --- a/include/net/raw.h +++ b/include/net/raw.h | |||
@@ -17,10 +17,10 @@ | |||
17 | #ifndef _RAW_H | 17 | #ifndef _RAW_H |
18 | #define _RAW_H | 18 | #define _RAW_H |
19 | 19 | ||
20 | #include <linux/config.h> | ||
20 | 21 | ||
21 | extern struct proto raw_prot; | 22 | extern struct proto raw_prot; |
22 | 23 | ||
23 | |||
24 | extern void raw_err(struct sock *, struct sk_buff *, u32 info); | 24 | extern void raw_err(struct sock *, struct sk_buff *, u32 info); |
25 | extern int raw_rcv(struct sock *, struct sk_buff *); | 25 | extern int raw_rcv(struct sock *, struct sk_buff *); |
26 | 26 | ||
@@ -37,6 +37,11 @@ extern struct sock *__raw_v4_lookup(struct sock *sk, unsigned short num, | |||
37 | unsigned long raddr, unsigned long laddr, | 37 | unsigned long raddr, unsigned long laddr, |
38 | int dif); | 38 | int dif); |
39 | 39 | ||
40 | extern void raw_v4_input(struct sk_buff *skb, struct iphdr *iph, int hash); | 40 | extern int raw_v4_input(struct sk_buff *skb, struct iphdr *iph, int hash); |
41 | |||
42 | #ifdef CONFIG_PROC_FS | ||
43 | extern int raw_proc_init(void); | ||
44 | extern void raw_proc_exit(void); | ||
45 | #endif | ||
41 | 46 | ||
42 | #endif /* _RAW_H */ | 47 | #endif /* _RAW_H */ |
diff --git a/include/net/rawv6.h b/include/net/rawv6.h index 23fd9a6a221a..14476a71725e 100644 --- a/include/net/rawv6.h +++ b/include/net/rawv6.h | |||
@@ -7,10 +7,11 @@ | |||
7 | extern struct hlist_head raw_v6_htable[RAWV6_HTABLE_SIZE]; | 7 | extern struct hlist_head raw_v6_htable[RAWV6_HTABLE_SIZE]; |
8 | extern rwlock_t raw_v6_lock; | 8 | extern rwlock_t raw_v6_lock; |
9 | 9 | ||
10 | extern void ipv6_raw_deliver(struct sk_buff *skb, int nexthdr); | 10 | extern int ipv6_raw_deliver(struct sk_buff *skb, int nexthdr); |
11 | 11 | ||
12 | extern struct sock *__raw_v6_lookup(struct sock *sk, unsigned short num, | 12 | extern struct sock *__raw_v6_lookup(struct sock *sk, unsigned short num, |
13 | struct in6_addr *loc_addr, struct in6_addr *rmt_addr); | 13 | struct in6_addr *loc_addr, struct in6_addr *rmt_addr, |
14 | int dif); | ||
14 | 15 | ||
15 | extern int rawv6_rcv(struct sock *sk, | 16 | extern int rawv6_rcv(struct sock *sk, |
16 | struct sk_buff *skb); | 17 | struct sk_buff *skb); |
diff --git a/include/net/request_sock.h b/include/net/request_sock.h index 72fd6f5e86b1..b52cc52ffe39 100644 --- a/include/net/request_sock.h +++ b/include/net/request_sock.h | |||
@@ -89,6 +89,7 @@ struct listen_sock { | |||
89 | int qlen_young; | 89 | int qlen_young; |
90 | int clock_hand; | 90 | int clock_hand; |
91 | u32 hash_rnd; | 91 | u32 hash_rnd; |
92 | u32 nr_table_entries; | ||
92 | struct request_sock *syn_table[0]; | 93 | struct request_sock *syn_table[0]; |
93 | }; | 94 | }; |
94 | 95 | ||
@@ -96,6 +97,7 @@ struct listen_sock { | |||
96 | * | 97 | * |
97 | * @rskq_accept_head - FIFO head of established children | 98 | * @rskq_accept_head - FIFO head of established children |
98 | * @rskq_accept_tail - FIFO tail of established children | 99 | * @rskq_accept_tail - FIFO tail of established children |
100 | * @rskq_defer_accept - User waits for some data after accept() | ||
99 | * @syn_wait_lock - serializer | 101 | * @syn_wait_lock - serializer |
100 | * | 102 | * |
101 | * %syn_wait_lock is necessary only to avoid proc interface having to grab the main | 103 | * %syn_wait_lock is necessary only to avoid proc interface having to grab the main |
@@ -111,6 +113,8 @@ struct request_sock_queue { | |||
111 | struct request_sock *rskq_accept_head; | 113 | struct request_sock *rskq_accept_head; |
112 | struct request_sock *rskq_accept_tail; | 114 | struct request_sock *rskq_accept_tail; |
113 | rwlock_t syn_wait_lock; | 115 | rwlock_t syn_wait_lock; |
116 | u8 rskq_defer_accept; | ||
117 | /* 3 bytes hole, try to pack */ | ||
114 | struct listen_sock *listen_opt; | 118 | struct listen_sock *listen_opt; |
115 | }; | 119 | }; |
116 | 120 | ||
@@ -129,11 +133,13 @@ static inline struct listen_sock *reqsk_queue_yank_listen_sk(struct request_sock | |||
129 | return lopt; | 133 | return lopt; |
130 | } | 134 | } |
131 | 135 | ||
132 | static inline void reqsk_queue_destroy(struct request_sock_queue *queue) | 136 | static inline void __reqsk_queue_destroy(struct request_sock_queue *queue) |
133 | { | 137 | { |
134 | kfree(reqsk_queue_yank_listen_sk(queue)); | 138 | kfree(reqsk_queue_yank_listen_sk(queue)); |
135 | } | 139 | } |
136 | 140 | ||
141 | extern void reqsk_queue_destroy(struct request_sock_queue *queue); | ||
142 | |||
137 | static inline struct request_sock * | 143 | static inline struct request_sock * |
138 | reqsk_queue_yank_acceptq(struct request_sock_queue *queue) | 144 | reqsk_queue_yank_acceptq(struct request_sock_queue *queue) |
139 | { | 145 | { |
@@ -221,17 +227,17 @@ static inline int reqsk_queue_added(struct request_sock_queue *queue) | |||
221 | return prev_qlen; | 227 | return prev_qlen; |
222 | } | 228 | } |
223 | 229 | ||
224 | static inline int reqsk_queue_len(struct request_sock_queue *queue) | 230 | static inline int reqsk_queue_len(const struct request_sock_queue *queue) |
225 | { | 231 | { |
226 | return queue->listen_opt != NULL ? queue->listen_opt->qlen : 0; | 232 | return queue->listen_opt != NULL ? queue->listen_opt->qlen : 0; |
227 | } | 233 | } |
228 | 234 | ||
229 | static inline int reqsk_queue_len_young(struct request_sock_queue *queue) | 235 | static inline int reqsk_queue_len_young(const struct request_sock_queue *queue) |
230 | { | 236 | { |
231 | return queue->listen_opt->qlen_young; | 237 | return queue->listen_opt->qlen_young; |
232 | } | 238 | } |
233 | 239 | ||
234 | static inline int reqsk_queue_is_full(struct request_sock_queue *queue) | 240 | static inline int reqsk_queue_is_full(const struct request_sock_queue *queue) |
235 | { | 241 | { |
236 | return queue->listen_opt->qlen >> queue->listen_opt->max_qlen_log; | 242 | return queue->listen_opt->qlen >> queue->listen_opt->max_qlen_log; |
237 | } | 243 | } |
diff --git a/include/net/route.h b/include/net/route.h index c3cd069a9aca..dbe79ca67d31 100644 --- a/include/net/route.h +++ b/include/net/route.h | |||
@@ -105,10 +105,6 @@ struct rt_cache_stat | |||
105 | unsigned int out_hlist_search; | 105 | unsigned int out_hlist_search; |
106 | }; | 106 | }; |
107 | 107 | ||
108 | extern struct rt_cache_stat *rt_cache_stat; | ||
109 | #define RT_CACHE_STAT_INC(field) \ | ||
110 | (per_cpu_ptr(rt_cache_stat, raw_smp_processor_id())->field++) | ||
111 | |||
112 | extern struct ip_rt_acct *ip_rt_acct; | 108 | extern struct ip_rt_acct *ip_rt_acct; |
113 | 109 | ||
114 | struct in_device; | 110 | struct in_device; |
@@ -199,4 +195,6 @@ static inline struct inet_peer *rt_get_peer(struct rtable *rt) | |||
199 | return rt->peer; | 195 | return rt->peer; |
200 | } | 196 | } |
201 | 197 | ||
198 | extern ctl_table ipv4_route_table[]; | ||
199 | |||
202 | #endif /* _ROUTE_H */ | 200 | #endif /* _ROUTE_H */ |
diff --git a/include/net/sctp/constants.h b/include/net/sctp/constants.h index 5999e5684bbf..c51541ee0247 100644 --- a/include/net/sctp/constants.h +++ b/include/net/sctp/constants.h | |||
@@ -47,10 +47,10 @@ | |||
47 | #ifndef __sctp_constants_h__ | 47 | #ifndef __sctp_constants_h__ |
48 | #define __sctp_constants_h__ | 48 | #define __sctp_constants_h__ |
49 | 49 | ||
50 | #include <linux/tcp.h> /* For TCP states used in sctp_sock_state_t */ | ||
51 | #include <linux/sctp.h> | 50 | #include <linux/sctp.h> |
52 | #include <linux/ipv6.h> /* For ipv6hdr. */ | 51 | #include <linux/ipv6.h> /* For ipv6hdr. */ |
53 | #include <net/sctp/user.h> | 52 | #include <net/sctp/user.h> |
53 | #include <net/tcp_states.h> /* For TCP states used in sctp_sock_state_t */ | ||
54 | 54 | ||
55 | /* Value used for stream negotiation. */ | 55 | /* Value used for stream negotiation. */ |
56 | enum { SCTP_MAX_STREAM = 0xffff }; | 56 | enum { SCTP_MAX_STREAM = 0xffff }; |
diff --git a/include/net/sock.h b/include/net/sock.h index e9b1dbab90d0..312cb25cbd18 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -88,6 +88,7 @@ do { spin_lock_init(&((__sk)->sk_lock.slock)); \ | |||
88 | } while(0) | 88 | } while(0) |
89 | 89 | ||
90 | struct sock; | 90 | struct sock; |
91 | struct proto; | ||
91 | 92 | ||
92 | /** | 93 | /** |
93 | * struct sock_common - minimal network layer representation of sockets | 94 | * struct sock_common - minimal network layer representation of sockets |
@@ -98,10 +99,11 @@ struct sock; | |||
98 | * @skc_node: main hash linkage for various protocol lookup tables | 99 | * @skc_node: main hash linkage for various protocol lookup tables |
99 | * @skc_bind_node: bind hash linkage for various protocol lookup tables | 100 | * @skc_bind_node: bind hash linkage for various protocol lookup tables |
100 | * @skc_refcnt: reference count | 101 | * @skc_refcnt: reference count |
102 | * @skc_prot: protocol handlers inside a network family | ||
101 | * | 103 | * |
102 | * This is the minimal network layer representation of sockets, the header | 104 | * This is the minimal network layer representation of sockets, the header |
103 | * for struct sock and struct tcp_tw_bucket. | 105 | * for struct sock and struct inet_timewait_sock. |
104 | */ | 106 | */ |
105 | struct sock_common { | 107 | struct sock_common { |
106 | unsigned short skc_family; | 108 | unsigned short skc_family; |
107 | volatile unsigned char skc_state; | 109 | volatile unsigned char skc_state; |
@@ -110,11 +112,12 @@ struct sock_common { | |||
110 | struct hlist_node skc_node; | 112 | struct hlist_node skc_node; |
111 | struct hlist_node skc_bind_node; | 113 | struct hlist_node skc_bind_node; |
112 | atomic_t skc_refcnt; | 114 | atomic_t skc_refcnt; |
115 | struct proto *skc_prot; | ||
113 | }; | 116 | }; |
114 | 117 | ||
115 | /** | 118 | /** |
116 | * struct sock - network layer representation of sockets | 119 | * struct sock - network layer representation of sockets |
117 | * @__sk_common: shared layout with tcp_tw_bucket | 120 | * @__sk_common: shared layout with inet_timewait_sock |
118 | * @sk_shutdown: mask of %SEND_SHUTDOWN and/or %RCV_SHUTDOWN | 121 | * @sk_shutdown: mask of %SEND_SHUTDOWN and/or %RCV_SHUTDOWN |
119 | * @sk_userlocks: %SO_SNDBUF and %SO_RCVBUF settings | 122 | * @sk_userlocks: %SO_SNDBUF and %SO_RCVBUF settings |
120 | * @sk_lock: synchronizer | 123 | * @sk_lock: synchronizer |
@@ -136,11 +139,10 @@ struct sock_common { | |||
136 | * @sk_no_check: %SO_NO_CHECK setting, wether or not checkup packets | 139 | * @sk_no_check: %SO_NO_CHECK setting, wether or not checkup packets |
137 | * @sk_route_caps: route capabilities (e.g. %NETIF_F_TSO) | 140 | * @sk_route_caps: route capabilities (e.g. %NETIF_F_TSO) |
138 | * @sk_lingertime: %SO_LINGER l_linger setting | 141 | * @sk_lingertime: %SO_LINGER l_linger setting |
139 | * @sk_hashent: hash entry in several tables (e.g. tcp_ehash) | 142 | * @sk_hashent: hash entry in several tables (e.g. inet_hashinfo.ehash) |
140 | * @sk_backlog: always used with the per-socket spinlock held | 143 | * @sk_backlog: always used with the per-socket spinlock held |
141 | * @sk_callback_lock: used with the callbacks in the end of this struct | 144 | * @sk_callback_lock: used with the callbacks in the end of this struct |
142 | * @sk_error_queue: rarely used | 145 | * @sk_error_queue: rarely used |
143 | * @sk_prot: protocol handlers inside a network family | ||
144 | * @sk_prot_creator: sk_prot of original sock creator (see ipv6_setsockopt, IPV6_ADDRFORM for instance) | 146 | * @sk_prot_creator: sk_prot of original sock creator (see ipv6_setsockopt, IPV6_ADDRFORM for instance) |
145 | * @sk_err: last error | 147 | * @sk_err: last error |
146 | * @sk_err_soft: errors that don't cause failure but are the cause of a persistent failure not just 'timed out' | 148 | * @sk_err_soft: errors that don't cause failure but are the cause of a persistent failure not just 'timed out' |
@@ -173,7 +175,7 @@ struct sock_common { | |||
173 | */ | 175 | */ |
174 | struct sock { | 176 | struct sock { |
175 | /* | 177 | /* |
176 | * Now struct tcp_tw_bucket also uses sock_common, so please just | 178 | * Now struct inet_timewait_sock also uses sock_common, so please just |
177 | * don't add nothing before this first member (__sk_common) --acme | 179 | * don't add nothing before this first member (__sk_common) --acme |
178 | */ | 180 | */ |
179 | struct sock_common __sk_common; | 181 | struct sock_common __sk_common; |
@@ -184,6 +186,7 @@ struct sock { | |||
184 | #define sk_node __sk_common.skc_node | 186 | #define sk_node __sk_common.skc_node |
185 | #define sk_bind_node __sk_common.skc_bind_node | 187 | #define sk_bind_node __sk_common.skc_bind_node |
186 | #define sk_refcnt __sk_common.skc_refcnt | 188 | #define sk_refcnt __sk_common.skc_refcnt |
189 | #define sk_prot __sk_common.skc_prot | ||
187 | unsigned char sk_shutdown : 2, | 190 | unsigned char sk_shutdown : 2, |
188 | sk_no_check : 2, | 191 | sk_no_check : 2, |
189 | sk_userlocks : 4; | 192 | sk_userlocks : 4; |
@@ -218,7 +221,6 @@ struct sock { | |||
218 | struct sk_buff *tail; | 221 | struct sk_buff *tail; |
219 | } sk_backlog; | 222 | } sk_backlog; |
220 | struct sk_buff_head sk_error_queue; | 223 | struct sk_buff_head sk_error_queue; |
221 | struct proto *sk_prot; | ||
222 | struct proto *sk_prot_creator; | 224 | struct proto *sk_prot_creator; |
223 | rwlock_t sk_callback_lock; | 225 | rwlock_t sk_callback_lock; |
224 | int sk_err, | 226 | int sk_err, |
@@ -253,28 +255,28 @@ struct sock { | |||
253 | /* | 255 | /* |
254 | * Hashed lists helper routines | 256 | * Hashed lists helper routines |
255 | */ | 257 | */ |
256 | static inline struct sock *__sk_head(struct hlist_head *head) | 258 | static inline struct sock *__sk_head(const struct hlist_head *head) |
257 | { | 259 | { |
258 | return hlist_entry(head->first, struct sock, sk_node); | 260 | return hlist_entry(head->first, struct sock, sk_node); |
259 | } | 261 | } |
260 | 262 | ||
261 | static inline struct sock *sk_head(struct hlist_head *head) | 263 | static inline struct sock *sk_head(const struct hlist_head *head) |
262 | { | 264 | { |
263 | return hlist_empty(head) ? NULL : __sk_head(head); | 265 | return hlist_empty(head) ? NULL : __sk_head(head); |
264 | } | 266 | } |
265 | 267 | ||
266 | static inline struct sock *sk_next(struct sock *sk) | 268 | static inline struct sock *sk_next(const struct sock *sk) |
267 | { | 269 | { |
268 | return sk->sk_node.next ? | 270 | return sk->sk_node.next ? |
269 | hlist_entry(sk->sk_node.next, struct sock, sk_node) : NULL; | 271 | hlist_entry(sk->sk_node.next, struct sock, sk_node) : NULL; |
270 | } | 272 | } |
271 | 273 | ||
272 | static inline int sk_unhashed(struct sock *sk) | 274 | static inline int sk_unhashed(const struct sock *sk) |
273 | { | 275 | { |
274 | return hlist_unhashed(&sk->sk_node); | 276 | return hlist_unhashed(&sk->sk_node); |
275 | } | 277 | } |
276 | 278 | ||
277 | static inline int sk_hashed(struct sock *sk) | 279 | static inline int sk_hashed(const struct sock *sk) |
278 | { | 280 | { |
279 | return sk->sk_node.pprev != NULL; | 281 | return sk->sk_node.pprev != NULL; |
280 | } | 282 | } |
@@ -554,6 +556,10 @@ struct proto { | |||
554 | kmem_cache_t *slab; | 556 | kmem_cache_t *slab; |
555 | unsigned int obj_size; | 557 | unsigned int obj_size; |
556 | 558 | ||
559 | kmem_cache_t *twsk_slab; | ||
560 | unsigned int twsk_obj_size; | ||
561 | atomic_t *orphan_count; | ||
562 | |||
557 | struct request_sock_ops *rsk_prot; | 563 | struct request_sock_ops *rsk_prot; |
558 | 564 | ||
559 | struct module *owner; | 565 | struct module *owner; |
@@ -561,7 +567,9 @@ struct proto { | |||
561 | char name[32]; | 567 | char name[32]; |
562 | 568 | ||
563 | struct list_head node; | 569 | struct list_head node; |
564 | 570 | #ifdef SOCK_REFCNT_DEBUG | |
571 | atomic_t socks; | ||
572 | #endif | ||
565 | struct { | 573 | struct { |
566 | int inuse; | 574 | int inuse; |
567 | u8 __pad[SMP_CACHE_BYTES - sizeof(int)]; | 575 | u8 __pad[SMP_CACHE_BYTES - sizeof(int)]; |
@@ -571,6 +579,31 @@ struct proto { | |||
571 | extern int proto_register(struct proto *prot, int alloc_slab); | 579 | extern int proto_register(struct proto *prot, int alloc_slab); |
572 | extern void proto_unregister(struct proto *prot); | 580 | extern void proto_unregister(struct proto *prot); |
573 | 581 | ||
582 | #ifdef SOCK_REFCNT_DEBUG | ||
583 | static inline void sk_refcnt_debug_inc(struct sock *sk) | ||
584 | { | ||
585 | atomic_inc(&sk->sk_prot->socks); | ||
586 | } | ||
587 | |||
588 | static inline void sk_refcnt_debug_dec(struct sock *sk) | ||
589 | { | ||
590 | atomic_dec(&sk->sk_prot->socks); | ||
591 | printk(KERN_DEBUG "%s socket %p released, %d are still alive\n", | ||
592 | sk->sk_prot->name, sk, atomic_read(&sk->sk_prot->socks)); | ||
593 | } | ||
594 | |||
595 | static inline void sk_refcnt_debug_release(const struct sock *sk) | ||
596 | { | ||
597 | if (atomic_read(&sk->sk_refcnt) != 1) | ||
598 | printk(KERN_DEBUG "Destruction of the %s socket %p delayed, refcnt=%d\n", | ||
599 | sk->sk_prot->name, sk, atomic_read(&sk->sk_refcnt)); | ||
600 | } | ||
601 | #else /* SOCK_REFCNT_DEBUG */ | ||
602 | #define sk_refcnt_debug_inc(sk) do { } while (0) | ||
603 | #define sk_refcnt_debug_dec(sk) do { } while (0) | ||
604 | #define sk_refcnt_debug_release(sk) do { } while (0) | ||
605 | #endif /* SOCK_REFCNT_DEBUG */ | ||
606 | |||
574 | /* Called with local bh disabled */ | 607 | /* Called with local bh disabled */ |
575 | static __inline__ void sock_prot_inc_use(struct proto *prot) | 608 | static __inline__ void sock_prot_inc_use(struct proto *prot) |
576 | { | 609 | { |
@@ -582,6 +615,15 @@ static __inline__ void sock_prot_dec_use(struct proto *prot) | |||
582 | prot->stats[smp_processor_id()].inuse--; | 615 | prot->stats[smp_processor_id()].inuse--; |
583 | } | 616 | } |
584 | 617 | ||
618 | /* With per-bucket locks this operation is not-atomic, so that | ||
619 | * this version is not worse. | ||
620 | */ | ||
621 | static inline void __sk_prot_rehash(struct sock *sk) | ||
622 | { | ||
623 | sk->sk_prot->unhash(sk); | ||
624 | sk->sk_prot->hash(sk); | ||
625 | } | ||
626 | |||
585 | /* About 10 seconds */ | 627 | /* About 10 seconds */ |
586 | #define SOCK_DESTROY_TIME (10*HZ) | 628 | #define SOCK_DESTROY_TIME (10*HZ) |
587 | 629 | ||
@@ -693,6 +735,8 @@ extern struct sock *sk_alloc(int family, | |||
693 | unsigned int __nocast priority, | 735 | unsigned int __nocast priority, |
694 | struct proto *prot, int zero_it); | 736 | struct proto *prot, int zero_it); |
695 | extern void sk_free(struct sock *sk); | 737 | extern void sk_free(struct sock *sk); |
738 | extern struct sock *sk_clone(const struct sock *sk, | ||
739 | const unsigned int __nocast priority); | ||
696 | 740 | ||
697 | extern struct sk_buff *sock_wmalloc(struct sock *sk, | 741 | extern struct sk_buff *sock_wmalloc(struct sock *sk, |
698 | unsigned long size, int force, | 742 | unsigned long size, int force, |
@@ -986,6 +1030,16 @@ sk_dst_check(struct sock *sk, u32 cookie) | |||
986 | return dst; | 1030 | return dst; |
987 | } | 1031 | } |
988 | 1032 | ||
1033 | static inline void sk_setup_caps(struct sock *sk, struct dst_entry *dst) | ||
1034 | { | ||
1035 | __sk_dst_set(sk, dst); | ||
1036 | sk->sk_route_caps = dst->dev->features; | ||
1037 | if (sk->sk_route_caps & NETIF_F_TSO) { | ||
1038 | if (sock_flag(sk, SOCK_NO_LARGESEND) || dst->header_len) | ||
1039 | sk->sk_route_caps &= ~NETIF_F_TSO; | ||
1040 | } | ||
1041 | } | ||
1042 | |||
989 | static inline void sk_charge_skb(struct sock *sk, struct sk_buff *skb) | 1043 | static inline void sk_charge_skb(struct sock *sk, struct sk_buff *skb) |
990 | { | 1044 | { |
991 | sk->sk_wmem_queued += skb->truesize; | 1045 | sk->sk_wmem_queued += skb->truesize; |
@@ -1146,7 +1200,7 @@ static inline struct sk_buff *sk_stream_alloc_pskb(struct sock *sk, | |||
1146 | int hdr_len; | 1200 | int hdr_len; |
1147 | 1201 | ||
1148 | hdr_len = SKB_DATA_ALIGN(sk->sk_prot->max_header); | 1202 | hdr_len = SKB_DATA_ALIGN(sk->sk_prot->max_header); |
1149 | skb = alloc_skb(size + hdr_len, gfp); | 1203 | skb = alloc_skb_fclone(size + hdr_len, gfp); |
1150 | if (skb) { | 1204 | if (skb) { |
1151 | skb->truesize += mem; | 1205 | skb->truesize += mem; |
1152 | if (sk->sk_forward_alloc >= (int)skb->truesize || | 1206 | if (sk->sk_forward_alloc >= (int)skb->truesize || |
@@ -1228,16 +1282,19 @@ static inline int sock_intr_errno(long timeo) | |||
1228 | static __inline__ void | 1282 | static __inline__ void |
1229 | sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb) | 1283 | sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb) |
1230 | { | 1284 | { |
1231 | struct timeval *stamp = &skb->stamp; | 1285 | struct timeval stamp; |
1286 | |||
1287 | skb_get_timestamp(skb, &stamp); | ||
1232 | if (sock_flag(sk, SOCK_RCVTSTAMP)) { | 1288 | if (sock_flag(sk, SOCK_RCVTSTAMP)) { |
1233 | /* Race occurred between timestamp enabling and packet | 1289 | /* Race occurred between timestamp enabling and packet |
1234 | receiving. Fill in the current time for now. */ | 1290 | receiving. Fill in the current time for now. */ |
1235 | if (stamp->tv_sec == 0) | 1291 | if (stamp.tv_sec == 0) |
1236 | do_gettimeofday(stamp); | 1292 | do_gettimeofday(&stamp); |
1293 | skb_set_timestamp(skb, &stamp); | ||
1237 | put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMP, sizeof(struct timeval), | 1294 | put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMP, sizeof(struct timeval), |
1238 | stamp); | 1295 | &stamp); |
1239 | } else | 1296 | } else |
1240 | sk->sk_stamp = *stamp; | 1297 | sk->sk_stamp = stamp; |
1241 | } | 1298 | } |
1242 | 1299 | ||
1243 | /** | 1300 | /** |
@@ -1262,11 +1319,11 @@ extern int sock_get_timestamp(struct sock *, struct timeval __user *); | |||
1262 | */ | 1319 | */ |
1263 | 1320 | ||
1264 | #if 0 | 1321 | #if 0 |
1265 | #define NETDEBUG(x) do { } while (0) | 1322 | #define NETDEBUG(fmt, args...) do { } while (0) |
1266 | #define LIMIT_NETDEBUG(x) do {} while(0) | 1323 | #define LIMIT_NETDEBUG(fmt, args...) do { } while(0) |
1267 | #else | 1324 | #else |
1268 | #define NETDEBUG(x) do { x; } while (0) | 1325 | #define NETDEBUG(fmt, args...) printk(fmt,##args) |
1269 | #define LIMIT_NETDEBUG(x) do { if (net_ratelimit()) { x; } } while(0) | 1326 | #define LIMIT_NETDEBUG(fmt, args...) do { if (net_ratelimit()) printk(fmt,##args); } while(0) |
1270 | #endif | 1327 | #endif |
1271 | 1328 | ||
1272 | /* | 1329 | /* |
@@ -1313,4 +1370,14 @@ static inline int siocdevprivate_ioctl(unsigned int fd, unsigned int cmd, unsign | |||
1313 | } | 1370 | } |
1314 | #endif | 1371 | #endif |
1315 | 1372 | ||
1373 | extern void sk_init(void); | ||
1374 | |||
1375 | #ifdef CONFIG_SYSCTL | ||
1376 | extern struct ctl_table core_table[]; | ||
1377 | extern int sysctl_optmem_max; | ||
1378 | #endif | ||
1379 | |||
1380 | extern __u32 sysctl_wmem_default; | ||
1381 | extern __u32 sysctl_rmem_default; | ||
1382 | |||
1316 | #endif /* _SOCK_H */ | 1383 | #endif /* _SOCK_H */ |
diff --git a/include/net/tcp.h b/include/net/tcp.h index 5010f0c5a56e..d6bcf1317a6a 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
@@ -21,360 +21,29 @@ | |||
21 | #define TCP_DEBUG 1 | 21 | #define TCP_DEBUG 1 |
22 | #define FASTRETRANS_DEBUG 1 | 22 | #define FASTRETRANS_DEBUG 1 |
23 | 23 | ||
24 | /* Cancel timers, when they are not required. */ | ||
25 | #undef TCP_CLEAR_TIMERS | ||
26 | |||
27 | #include <linux/config.h> | 24 | #include <linux/config.h> |
28 | #include <linux/list.h> | 25 | #include <linux/list.h> |
29 | #include <linux/tcp.h> | 26 | #include <linux/tcp.h> |
30 | #include <linux/slab.h> | 27 | #include <linux/slab.h> |
31 | #include <linux/cache.h> | 28 | #include <linux/cache.h> |
32 | #include <linux/percpu.h> | 29 | #include <linux/percpu.h> |
30 | |||
31 | #include <net/inet_connection_sock.h> | ||
32 | #include <net/inet_timewait_sock.h> | ||
33 | #include <net/inet_hashtables.h> | ||
33 | #include <net/checksum.h> | 34 | #include <net/checksum.h> |
34 | #include <net/request_sock.h> | 35 | #include <net/request_sock.h> |
35 | #include <net/sock.h> | 36 | #include <net/sock.h> |
36 | #include <net/snmp.h> | 37 | #include <net/snmp.h> |
37 | #include <net/ip.h> | 38 | #include <net/ip.h> |
38 | #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) | 39 | #include <net/tcp_states.h> |
39 | #include <linux/ipv6.h> | ||
40 | #endif | ||
41 | #include <linux/seq_file.h> | ||
42 | |||
43 | /* This is for all connections with a full identity, no wildcards. | ||
44 | * New scheme, half the table is for TIME_WAIT, the other half is | ||
45 | * for the rest. I'll experiment with dynamic table growth later. | ||
46 | */ | ||
47 | struct tcp_ehash_bucket { | ||
48 | rwlock_t lock; | ||
49 | struct hlist_head chain; | ||
50 | } __attribute__((__aligned__(8))); | ||
51 | |||
52 | /* This is for listening sockets, thus all sockets which possess wildcards. */ | ||
53 | #define TCP_LHTABLE_SIZE 32 /* Yes, really, this is all you need. */ | ||
54 | |||
55 | /* There are a few simple rules, which allow for local port reuse by | ||
56 | * an application. In essence: | ||
57 | * | ||
58 | * 1) Sockets bound to different interfaces may share a local port. | ||
59 | * Failing that, goto test 2. | ||
60 | * 2) If all sockets have sk->sk_reuse set, and none of them are in | ||
61 | * TCP_LISTEN state, the port may be shared. | ||
62 | * Failing that, goto test 3. | ||
63 | * 3) If all sockets are bound to a specific inet_sk(sk)->rcv_saddr local | ||
64 | * address, and none of them are the same, the port may be | ||
65 | * shared. | ||
66 | * Failing this, the port cannot be shared. | ||
67 | * | ||
68 | * The interesting point, is test #2. This is what an FTP server does | ||
69 | * all day. To optimize this case we use a specific flag bit defined | ||
70 | * below. As we add sockets to a bind bucket list, we perform a | ||
71 | * check of: (newsk->sk_reuse && (newsk->sk_state != TCP_LISTEN)) | ||
72 | * As long as all sockets added to a bind bucket pass this test, | ||
73 | * the flag bit will be set. | ||
74 | * The resulting situation is that tcp_v[46]_verify_bind() can just check | ||
75 | * for this flag bit, if it is set and the socket trying to bind has | ||
76 | * sk->sk_reuse set, we don't even have to walk the owners list at all, | ||
77 | * we return that it is ok to bind this socket to the requested local port. | ||
78 | * | ||
79 | * Sounds like a lot of work, but it is worth it. In a more naive | ||
80 | * implementation (ie. current FreeBSD etc.) the entire list of ports | ||
81 | * must be walked for each data port opened by an ftp server. Needless | ||
82 | * to say, this does not scale at all. With a couple thousand FTP | ||
83 | * users logged onto your box, isn't it nice to know that new data | ||
84 | * ports are created in O(1) time? I thought so. ;-) -DaveM | ||
85 | */ | ||
86 | struct tcp_bind_bucket { | ||
87 | unsigned short port; | ||
88 | signed short fastreuse; | ||
89 | struct hlist_node node; | ||
90 | struct hlist_head owners; | ||
91 | }; | ||
92 | |||
93 | #define tb_for_each(tb, node, head) hlist_for_each_entry(tb, node, head, node) | ||
94 | |||
95 | struct tcp_bind_hashbucket { | ||
96 | spinlock_t lock; | ||
97 | struct hlist_head chain; | ||
98 | }; | ||
99 | |||
100 | static inline struct tcp_bind_bucket *__tb_head(struct tcp_bind_hashbucket *head) | ||
101 | { | ||
102 | return hlist_entry(head->chain.first, struct tcp_bind_bucket, node); | ||
103 | } | ||
104 | |||
105 | static inline struct tcp_bind_bucket *tb_head(struct tcp_bind_hashbucket *head) | ||
106 | { | ||
107 | return hlist_empty(&head->chain) ? NULL : __tb_head(head); | ||
108 | } | ||
109 | |||
110 | extern struct tcp_hashinfo { | ||
111 | /* This is for sockets with full identity only. Sockets here will | ||
112 | * always be without wildcards and will have the following invariant: | ||
113 | * | ||
114 | * TCP_ESTABLISHED <= sk->sk_state < TCP_CLOSE | ||
115 | * | ||
116 | * First half of the table is for sockets not in TIME_WAIT, second half | ||
117 | * is for TIME_WAIT sockets only. | ||
118 | */ | ||
119 | struct tcp_ehash_bucket *__tcp_ehash; | ||
120 | |||
121 | /* Ok, let's try this, I give up, we do need a local binding | ||
122 | * TCP hash as well as the others for fast bind/connect. | ||
123 | */ | ||
124 | struct tcp_bind_hashbucket *__tcp_bhash; | ||
125 | 40 | ||
126 | int __tcp_bhash_size; | 41 | #include <linux/seq_file.h> |
127 | int __tcp_ehash_size; | ||
128 | |||
129 | /* All sockets in TCP_LISTEN state will be in here. This is the only | ||
130 | * table where wildcard'd TCP sockets can exist. Hash function here | ||
131 | * is just local port number. | ||
132 | */ | ||
133 | struct hlist_head __tcp_listening_hash[TCP_LHTABLE_SIZE]; | ||
134 | |||
135 | /* All the above members are written once at bootup and | ||
136 | * never written again _or_ are predominantly read-access. | ||
137 | * | ||
138 | * Now align to a new cache line as all the following members | ||
139 | * are often dirty. | ||
140 | */ | ||
141 | rwlock_t __tcp_lhash_lock ____cacheline_aligned; | ||
142 | atomic_t __tcp_lhash_users; | ||
143 | wait_queue_head_t __tcp_lhash_wait; | ||
144 | spinlock_t __tcp_portalloc_lock; | ||
145 | } tcp_hashinfo; | ||
146 | |||
147 | #define tcp_ehash (tcp_hashinfo.__tcp_ehash) | ||
148 | #define tcp_bhash (tcp_hashinfo.__tcp_bhash) | ||
149 | #define tcp_ehash_size (tcp_hashinfo.__tcp_ehash_size) | ||
150 | #define tcp_bhash_size (tcp_hashinfo.__tcp_bhash_size) | ||
151 | #define tcp_listening_hash (tcp_hashinfo.__tcp_listening_hash) | ||
152 | #define tcp_lhash_lock (tcp_hashinfo.__tcp_lhash_lock) | ||
153 | #define tcp_lhash_users (tcp_hashinfo.__tcp_lhash_users) | ||
154 | #define tcp_lhash_wait (tcp_hashinfo.__tcp_lhash_wait) | ||
155 | #define tcp_portalloc_lock (tcp_hashinfo.__tcp_portalloc_lock) | ||
156 | |||
157 | extern kmem_cache_t *tcp_bucket_cachep; | ||
158 | extern struct tcp_bind_bucket *tcp_bucket_create(struct tcp_bind_hashbucket *head, | ||
159 | unsigned short snum); | ||
160 | extern void tcp_bucket_destroy(struct tcp_bind_bucket *tb); | ||
161 | extern void tcp_bucket_unlock(struct sock *sk); | ||
162 | extern int tcp_port_rover; | ||
163 | |||
164 | /* These are AF independent. */ | ||
165 | static __inline__ int tcp_bhashfn(__u16 lport) | ||
166 | { | ||
167 | return (lport & (tcp_bhash_size - 1)); | ||
168 | } | ||
169 | |||
170 | extern void tcp_bind_hash(struct sock *sk, struct tcp_bind_bucket *tb, | ||
171 | unsigned short snum); | ||
172 | |||
173 | #if (BITS_PER_LONG == 64) | ||
174 | #define TCP_ADDRCMP_ALIGN_BYTES 8 | ||
175 | #else | ||
176 | #define TCP_ADDRCMP_ALIGN_BYTES 4 | ||
177 | #endif | ||
178 | |||
179 | /* This is a TIME_WAIT bucket. It works around the memory consumption | ||
180 | * problems of sockets in such a state on heavily loaded servers, but | ||
181 | * without violating the protocol specification. | ||
182 | */ | ||
183 | struct tcp_tw_bucket { | ||
184 | /* | ||
185 | * Now struct sock also uses sock_common, so please just | ||
186 | * don't add nothing before this first member (__tw_common) --acme | ||
187 | */ | ||
188 | struct sock_common __tw_common; | ||
189 | #define tw_family __tw_common.skc_family | ||
190 | #define tw_state __tw_common.skc_state | ||
191 | #define tw_reuse __tw_common.skc_reuse | ||
192 | #define tw_bound_dev_if __tw_common.skc_bound_dev_if | ||
193 | #define tw_node __tw_common.skc_node | ||
194 | #define tw_bind_node __tw_common.skc_bind_node | ||
195 | #define tw_refcnt __tw_common.skc_refcnt | ||
196 | volatile unsigned char tw_substate; | ||
197 | unsigned char tw_rcv_wscale; | ||
198 | __u16 tw_sport; | ||
199 | /* Socket demultiplex comparisons on incoming packets. */ | ||
200 | /* these five are in inet_sock */ | ||
201 | __u32 tw_daddr | ||
202 | __attribute__((aligned(TCP_ADDRCMP_ALIGN_BYTES))); | ||
203 | __u32 tw_rcv_saddr; | ||
204 | __u16 tw_dport; | ||
205 | __u16 tw_num; | ||
206 | /* And these are ours. */ | ||
207 | int tw_hashent; | ||
208 | int tw_timeout; | ||
209 | __u32 tw_rcv_nxt; | ||
210 | __u32 tw_snd_nxt; | ||
211 | __u32 tw_rcv_wnd; | ||
212 | __u32 tw_ts_recent; | ||
213 | long tw_ts_recent_stamp; | ||
214 | unsigned long tw_ttd; | ||
215 | struct tcp_bind_bucket *tw_tb; | ||
216 | struct hlist_node tw_death_node; | ||
217 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
218 | struct in6_addr tw_v6_daddr; | ||
219 | struct in6_addr tw_v6_rcv_saddr; | ||
220 | int tw_v6_ipv6only; | ||
221 | #endif | ||
222 | }; | ||
223 | |||
224 | static __inline__ void tw_add_node(struct tcp_tw_bucket *tw, | ||
225 | struct hlist_head *list) | ||
226 | { | ||
227 | hlist_add_head(&tw->tw_node, list); | ||
228 | } | ||
229 | |||
230 | static __inline__ void tw_add_bind_node(struct tcp_tw_bucket *tw, | ||
231 | struct hlist_head *list) | ||
232 | { | ||
233 | hlist_add_head(&tw->tw_bind_node, list); | ||
234 | } | ||
235 | |||
236 | static inline int tw_dead_hashed(struct tcp_tw_bucket *tw) | ||
237 | { | ||
238 | return tw->tw_death_node.pprev != NULL; | ||
239 | } | ||
240 | |||
241 | static __inline__ void tw_dead_node_init(struct tcp_tw_bucket *tw) | ||
242 | { | ||
243 | tw->tw_death_node.pprev = NULL; | ||
244 | } | ||
245 | |||
246 | static __inline__ void __tw_del_dead_node(struct tcp_tw_bucket *tw) | ||
247 | { | ||
248 | __hlist_del(&tw->tw_death_node); | ||
249 | tw_dead_node_init(tw); | ||
250 | } | ||
251 | |||
252 | static __inline__ int tw_del_dead_node(struct tcp_tw_bucket *tw) | ||
253 | { | ||
254 | if (tw_dead_hashed(tw)) { | ||
255 | __tw_del_dead_node(tw); | ||
256 | return 1; | ||
257 | } | ||
258 | return 0; | ||
259 | } | ||
260 | |||
261 | #define tw_for_each(tw, node, head) \ | ||
262 | hlist_for_each_entry(tw, node, head, tw_node) | ||
263 | |||
264 | #define tw_for_each_inmate(tw, node, jail) \ | ||
265 | hlist_for_each_entry(tw, node, jail, tw_death_node) | ||
266 | |||
267 | #define tw_for_each_inmate_safe(tw, node, safe, jail) \ | ||
268 | hlist_for_each_entry_safe(tw, node, safe, jail, tw_death_node) | ||
269 | |||
270 | #define tcptw_sk(__sk) ((struct tcp_tw_bucket *)(__sk)) | ||
271 | |||
272 | static inline u32 tcp_v4_rcv_saddr(const struct sock *sk) | ||
273 | { | ||
274 | return likely(sk->sk_state != TCP_TIME_WAIT) ? | ||
275 | inet_sk(sk)->rcv_saddr : tcptw_sk(sk)->tw_rcv_saddr; | ||
276 | } | ||
277 | |||
278 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
279 | static inline struct in6_addr *__tcp_v6_rcv_saddr(const struct sock *sk) | ||
280 | { | ||
281 | return likely(sk->sk_state != TCP_TIME_WAIT) ? | ||
282 | &inet6_sk(sk)->rcv_saddr : &tcptw_sk(sk)->tw_v6_rcv_saddr; | ||
283 | } | ||
284 | |||
285 | static inline struct in6_addr *tcp_v6_rcv_saddr(const struct sock *sk) | ||
286 | { | ||
287 | return sk->sk_family == AF_INET6 ? __tcp_v6_rcv_saddr(sk) : NULL; | ||
288 | } | ||
289 | |||
290 | #define tcptw_sk_ipv6only(__sk) (tcptw_sk(__sk)->tw_v6_ipv6only) | ||
291 | |||
292 | static inline int tcp_v6_ipv6only(const struct sock *sk) | ||
293 | { | ||
294 | return likely(sk->sk_state != TCP_TIME_WAIT) ? | ||
295 | ipv6_only_sock(sk) : tcptw_sk_ipv6only(sk); | ||
296 | } | ||
297 | #else | ||
298 | # define __tcp_v6_rcv_saddr(__sk) NULL | ||
299 | # define tcp_v6_rcv_saddr(__sk) NULL | ||
300 | # define tcptw_sk_ipv6only(__sk) 0 | ||
301 | # define tcp_v6_ipv6only(__sk) 0 | ||
302 | #endif | ||
303 | 42 | ||
304 | extern kmem_cache_t *tcp_timewait_cachep; | 43 | extern struct inet_hashinfo tcp_hashinfo; |
305 | |||
306 | static inline void tcp_tw_put(struct tcp_tw_bucket *tw) | ||
307 | { | ||
308 | if (atomic_dec_and_test(&tw->tw_refcnt)) { | ||
309 | #ifdef INET_REFCNT_DEBUG | ||
310 | printk(KERN_DEBUG "tw_bucket %p released\n", tw); | ||
311 | #endif | ||
312 | kmem_cache_free(tcp_timewait_cachep, tw); | ||
313 | } | ||
314 | } | ||
315 | 44 | ||
316 | extern atomic_t tcp_orphan_count; | 45 | extern atomic_t tcp_orphan_count; |
317 | extern int tcp_tw_count; | ||
318 | extern void tcp_time_wait(struct sock *sk, int state, int timeo); | 46 | extern void tcp_time_wait(struct sock *sk, int state, int timeo); |
319 | extern void tcp_tw_deschedule(struct tcp_tw_bucket *tw); | ||
320 | |||
321 | |||
322 | /* Socket demux engine toys. */ | ||
323 | #ifdef __BIG_ENDIAN | ||
324 | #define TCP_COMBINED_PORTS(__sport, __dport) \ | ||
325 | (((__u32)(__sport)<<16) | (__u32)(__dport)) | ||
326 | #else /* __LITTLE_ENDIAN */ | ||
327 | #define TCP_COMBINED_PORTS(__sport, __dport) \ | ||
328 | (((__u32)(__dport)<<16) | (__u32)(__sport)) | ||
329 | #endif | ||
330 | |||
331 | #if (BITS_PER_LONG == 64) | ||
332 | #ifdef __BIG_ENDIAN | ||
333 | #define TCP_V4_ADDR_COOKIE(__name, __saddr, __daddr) \ | ||
334 | __u64 __name = (((__u64)(__saddr))<<32)|((__u64)(__daddr)); | ||
335 | #else /* __LITTLE_ENDIAN */ | ||
336 | #define TCP_V4_ADDR_COOKIE(__name, __saddr, __daddr) \ | ||
337 | __u64 __name = (((__u64)(__daddr))<<32)|((__u64)(__saddr)); | ||
338 | #endif /* __BIG_ENDIAN */ | ||
339 | #define TCP_IPV4_MATCH(__sk, __cookie, __saddr, __daddr, __ports, __dif)\ | ||
340 | (((*((__u64 *)&(inet_sk(__sk)->daddr)))== (__cookie)) && \ | ||
341 | ((*((__u32 *)&(inet_sk(__sk)->dport)))== (__ports)) && \ | ||
342 | (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif)))) | ||
343 | #define TCP_IPV4_TW_MATCH(__sk, __cookie, __saddr, __daddr, __ports, __dif)\ | ||
344 | (((*((__u64 *)&(tcptw_sk(__sk)->tw_daddr))) == (__cookie)) && \ | ||
345 | ((*((__u32 *)&(tcptw_sk(__sk)->tw_dport))) == (__ports)) && \ | ||
346 | (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif)))) | ||
347 | #else /* 32-bit arch */ | ||
348 | #define TCP_V4_ADDR_COOKIE(__name, __saddr, __daddr) | ||
349 | #define TCP_IPV4_MATCH(__sk, __cookie, __saddr, __daddr, __ports, __dif)\ | ||
350 | ((inet_sk(__sk)->daddr == (__saddr)) && \ | ||
351 | (inet_sk(__sk)->rcv_saddr == (__daddr)) && \ | ||
352 | ((*((__u32 *)&(inet_sk(__sk)->dport)))== (__ports)) && \ | ||
353 | (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif)))) | ||
354 | #define TCP_IPV4_TW_MATCH(__sk, __cookie, __saddr, __daddr, __ports, __dif)\ | ||
355 | ((tcptw_sk(__sk)->tw_daddr == (__saddr)) && \ | ||
356 | (tcptw_sk(__sk)->tw_rcv_saddr == (__daddr)) && \ | ||
357 | ((*((__u32 *)&(tcptw_sk(__sk)->tw_dport))) == (__ports)) && \ | ||
358 | (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif)))) | ||
359 | #endif /* 64-bit arch */ | ||
360 | |||
361 | #define TCP_IPV6_MATCH(__sk, __saddr, __daddr, __ports, __dif) \ | ||
362 | (((*((__u32 *)&(inet_sk(__sk)->dport)))== (__ports)) && \ | ||
363 | ((__sk)->sk_family == AF_INET6) && \ | ||
364 | ipv6_addr_equal(&inet6_sk(__sk)->daddr, (__saddr)) && \ | ||
365 | ipv6_addr_equal(&inet6_sk(__sk)->rcv_saddr, (__daddr)) && \ | ||
366 | (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif)))) | ||
367 | |||
368 | /* These can have wildcards, don't try too hard. */ | ||
369 | static __inline__ int tcp_lhashfn(unsigned short num) | ||
370 | { | ||
371 | return num & (TCP_LHTABLE_SIZE - 1); | ||
372 | } | ||
373 | |||
374 | static __inline__ int tcp_sk_listen_hashfn(struct sock *sk) | ||
375 | { | ||
376 | return tcp_lhashfn(inet_sk(sk)->num); | ||
377 | } | ||
378 | 47 | ||
379 | #define MAX_TCP_HEADER (128 + MAX_HEADER) | 48 | #define MAX_TCP_HEADER (128 + MAX_HEADER) |
380 | 49 | ||
@@ -478,33 +147,6 @@ static __inline__ int tcp_sk_listen_hashfn(struct sock *sk) | |||
478 | * timestamps. It must be less than | 147 | * timestamps. It must be less than |
479 | * minimal timewait lifetime. | 148 | * minimal timewait lifetime. |
480 | */ | 149 | */ |
481 | |||
482 | #define TCP_TW_RECYCLE_SLOTS_LOG 5 | ||
483 | #define TCP_TW_RECYCLE_SLOTS (1<<TCP_TW_RECYCLE_SLOTS_LOG) | ||
484 | |||
485 | /* If time > 4sec, it is "slow" path, no recycling is required, | ||
486 | so that we select tick to get range about 4 seconds. | ||
487 | */ | ||
488 | |||
489 | #if HZ <= 16 || HZ > 4096 | ||
490 | # error Unsupported: HZ <= 16 or HZ > 4096 | ||
491 | #elif HZ <= 32 | ||
492 | # define TCP_TW_RECYCLE_TICK (5+2-TCP_TW_RECYCLE_SLOTS_LOG) | ||
493 | #elif HZ <= 64 | ||
494 | # define TCP_TW_RECYCLE_TICK (6+2-TCP_TW_RECYCLE_SLOTS_LOG) | ||
495 | #elif HZ <= 128 | ||
496 | # define TCP_TW_RECYCLE_TICK (7+2-TCP_TW_RECYCLE_SLOTS_LOG) | ||
497 | #elif HZ <= 256 | ||
498 | # define TCP_TW_RECYCLE_TICK (8+2-TCP_TW_RECYCLE_SLOTS_LOG) | ||
499 | #elif HZ <= 512 | ||
500 | # define TCP_TW_RECYCLE_TICK (9+2-TCP_TW_RECYCLE_SLOTS_LOG) | ||
501 | #elif HZ <= 1024 | ||
502 | # define TCP_TW_RECYCLE_TICK (10+2-TCP_TW_RECYCLE_SLOTS_LOG) | ||
503 | #elif HZ <= 2048 | ||
504 | # define TCP_TW_RECYCLE_TICK (11+2-TCP_TW_RECYCLE_SLOTS_LOG) | ||
505 | #else | ||
506 | # define TCP_TW_RECYCLE_TICK (12+2-TCP_TW_RECYCLE_SLOTS_LOG) | ||
507 | #endif | ||
508 | /* | 150 | /* |
509 | * TCP option | 151 | * TCP option |
510 | */ | 152 | */ |
@@ -534,22 +176,18 @@ static __inline__ int tcp_sk_listen_hashfn(struct sock *sk) | |||
534 | #define TCPOLEN_SACK_BASE_ALIGNED 4 | 176 | #define TCPOLEN_SACK_BASE_ALIGNED 4 |
535 | #define TCPOLEN_SACK_PERBLOCK 8 | 177 | #define TCPOLEN_SACK_PERBLOCK 8 |
536 | 178 | ||
537 | #define TCP_TIME_RETRANS 1 /* Retransmit timer */ | ||
538 | #define TCP_TIME_DACK 2 /* Delayed ack timer */ | ||
539 | #define TCP_TIME_PROBE0 3 /* Zero window probe timer */ | ||
540 | #define TCP_TIME_KEEPOPEN 4 /* Keepalive timer */ | ||
541 | |||
542 | /* Flags in tp->nonagle */ | 179 | /* Flags in tp->nonagle */ |
543 | #define TCP_NAGLE_OFF 1 /* Nagle's algo is disabled */ | 180 | #define TCP_NAGLE_OFF 1 /* Nagle's algo is disabled */ |
544 | #define TCP_NAGLE_CORK 2 /* Socket is corked */ | 181 | #define TCP_NAGLE_CORK 2 /* Socket is corked */ |
545 | #define TCP_NAGLE_PUSH 4 /* Cork is overriden for already queued data */ | 182 | #define TCP_NAGLE_PUSH 4 /* Cork is overriden for already queued data */ |
546 | 183 | ||
184 | extern struct inet_timewait_death_row tcp_death_row; | ||
185 | |||
547 | /* sysctl variables for tcp */ | 186 | /* sysctl variables for tcp */ |
548 | extern int sysctl_tcp_timestamps; | 187 | extern int sysctl_tcp_timestamps; |
549 | extern int sysctl_tcp_window_scaling; | 188 | extern int sysctl_tcp_window_scaling; |
550 | extern int sysctl_tcp_sack; | 189 | extern int sysctl_tcp_sack; |
551 | extern int sysctl_tcp_fin_timeout; | 190 | extern int sysctl_tcp_fin_timeout; |
552 | extern int sysctl_tcp_tw_recycle; | ||
553 | extern int sysctl_tcp_keepalive_time; | 191 | extern int sysctl_tcp_keepalive_time; |
554 | extern int sysctl_tcp_keepalive_probes; | 192 | extern int sysctl_tcp_keepalive_probes; |
555 | extern int sysctl_tcp_keepalive_intvl; | 193 | extern int sysctl_tcp_keepalive_intvl; |
@@ -564,7 +202,6 @@ extern int sysctl_tcp_stdurg; | |||
564 | extern int sysctl_tcp_rfc1337; | 202 | extern int sysctl_tcp_rfc1337; |
565 | extern int sysctl_tcp_abort_on_overflow; | 203 | extern int sysctl_tcp_abort_on_overflow; |
566 | extern int sysctl_tcp_max_orphans; | 204 | extern int sysctl_tcp_max_orphans; |
567 | extern int sysctl_tcp_max_tw_buckets; | ||
568 | extern int sysctl_tcp_fack; | 205 | extern int sysctl_tcp_fack; |
569 | extern int sysctl_tcp_reordering; | 206 | extern int sysctl_tcp_reordering; |
570 | extern int sysctl_tcp_ecn; | 207 | extern int sysctl_tcp_ecn; |
@@ -585,12 +222,6 @@ extern atomic_t tcp_memory_allocated; | |||
585 | extern atomic_t tcp_sockets_allocated; | 222 | extern atomic_t tcp_sockets_allocated; |
586 | extern int tcp_memory_pressure; | 223 | extern int tcp_memory_pressure; |
587 | 224 | ||
588 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
589 | #define TCP_INET_FAMILY(fam) ((fam) == AF_INET) | ||
590 | #else | ||
591 | #define TCP_INET_FAMILY(fam) 1 | ||
592 | #endif | ||
593 | |||
594 | /* | 225 | /* |
595 | * Pointers to address related TCP functions | 226 | * Pointers to address related TCP functions |
596 | * (i.e. things that depend on the address family) | 227 | * (i.e. things that depend on the address family) |
@@ -671,9 +302,6 @@ DECLARE_SNMP_STAT(struct tcp_mib, tcp_statistics); | |||
671 | #define TCP_ADD_STATS_BH(field, val) SNMP_ADD_STATS_BH(tcp_statistics, field, val) | 302 | #define TCP_ADD_STATS_BH(field, val) SNMP_ADD_STATS_BH(tcp_statistics, field, val) |
672 | #define TCP_ADD_STATS_USER(field, val) SNMP_ADD_STATS_USER(tcp_statistics, field, val) | 303 | #define TCP_ADD_STATS_USER(field, val) SNMP_ADD_STATS_USER(tcp_statistics, field, val) |
673 | 304 | ||
674 | extern void tcp_put_port(struct sock *sk); | ||
675 | extern void tcp_inherit_port(struct sock *sk, struct sock *child); | ||
676 | |||
677 | extern void tcp_v4_err(struct sk_buff *skb, u32); | 305 | extern void tcp_v4_err(struct sk_buff *skb, u32); |
678 | 306 | ||
679 | extern void tcp_shutdown (struct sock *sk, int how); | 307 | extern void tcp_shutdown (struct sock *sk, int how); |
@@ -682,7 +310,7 @@ extern int tcp_v4_rcv(struct sk_buff *skb); | |||
682 | 310 | ||
683 | extern int tcp_v4_remember_stamp(struct sock *sk); | 311 | extern int tcp_v4_remember_stamp(struct sock *sk); |
684 | 312 | ||
685 | extern int tcp_v4_tw_remember_stamp(struct tcp_tw_bucket *tw); | 313 | extern int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw); |
686 | 314 | ||
687 | extern int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, | 315 | extern int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, |
688 | struct msghdr *msg, size_t size); | 316 | struct msghdr *msg, size_t size); |
@@ -704,42 +332,22 @@ extern int tcp_rcv_established(struct sock *sk, | |||
704 | 332 | ||
705 | extern void tcp_rcv_space_adjust(struct sock *sk); | 333 | extern void tcp_rcv_space_adjust(struct sock *sk); |
706 | 334 | ||
707 | enum tcp_ack_state_t | 335 | static inline void tcp_dec_quickack_mode(struct sock *sk, |
708 | { | 336 | const unsigned int pkts) |
709 | TCP_ACK_SCHED = 1, | ||
710 | TCP_ACK_TIMER = 2, | ||
711 | TCP_ACK_PUSHED= 4 | ||
712 | }; | ||
713 | |||
714 | static inline void tcp_schedule_ack(struct tcp_sock *tp) | ||
715 | { | 337 | { |
716 | tp->ack.pending |= TCP_ACK_SCHED; | 338 | struct inet_connection_sock *icsk = inet_csk(sk); |
717 | } | ||
718 | |||
719 | static inline int tcp_ack_scheduled(struct tcp_sock *tp) | ||
720 | { | ||
721 | return tp->ack.pending&TCP_ACK_SCHED; | ||
722 | } | ||
723 | |||
724 | static __inline__ void tcp_dec_quickack_mode(struct tcp_sock *tp, unsigned int pkts) | ||
725 | { | ||
726 | if (tp->ack.quick) { | ||
727 | if (pkts >= tp->ack.quick) { | ||
728 | tp->ack.quick = 0; | ||
729 | 339 | ||
340 | if (icsk->icsk_ack.quick) { | ||
341 | if (pkts >= icsk->icsk_ack.quick) { | ||
342 | icsk->icsk_ack.quick = 0; | ||
730 | /* Leaving quickack mode we deflate ATO. */ | 343 | /* Leaving quickack mode we deflate ATO. */ |
731 | tp->ack.ato = TCP_ATO_MIN; | 344 | icsk->icsk_ack.ato = TCP_ATO_MIN; |
732 | } else | 345 | } else |
733 | tp->ack.quick -= pkts; | 346 | icsk->icsk_ack.quick -= pkts; |
734 | } | 347 | } |
735 | } | 348 | } |
736 | 349 | ||
737 | extern void tcp_enter_quickack_mode(struct tcp_sock *tp); | 350 | extern void tcp_enter_quickack_mode(struct sock *sk); |
738 | |||
739 | static __inline__ void tcp_delack_init(struct tcp_sock *tp) | ||
740 | { | ||
741 | memset(&tp->ack, 0, sizeof(tp->ack)); | ||
742 | } | ||
743 | 351 | ||
744 | static inline void tcp_clear_options(struct tcp_options_received *rx_opt) | 352 | static inline void tcp_clear_options(struct tcp_options_received *rx_opt) |
745 | { | 353 | { |
@@ -755,10 +363,9 @@ enum tcp_tw_status | |||
755 | }; | 363 | }; |
756 | 364 | ||
757 | 365 | ||
758 | extern enum tcp_tw_status tcp_timewait_state_process(struct tcp_tw_bucket *tw, | 366 | extern enum tcp_tw_status tcp_timewait_state_process(struct inet_timewait_sock *tw, |
759 | struct sk_buff *skb, | 367 | struct sk_buff *skb, |
760 | struct tcphdr *th, | 368 | const struct tcphdr *th); |
761 | unsigned len); | ||
762 | 369 | ||
763 | extern struct sock * tcp_check_req(struct sock *sk,struct sk_buff *skb, | 370 | extern struct sock * tcp_check_req(struct sock *sk,struct sk_buff *skb, |
764 | struct request_sock *req, | 371 | struct request_sock *req, |
@@ -773,7 +380,6 @@ extern void tcp_update_metrics(struct sock *sk); | |||
773 | 380 | ||
774 | extern void tcp_close(struct sock *sk, | 381 | extern void tcp_close(struct sock *sk, |
775 | long timeout); | 382 | long timeout); |
776 | extern struct sock * tcp_accept(struct sock *sk, int flags, int *err); | ||
777 | extern unsigned int tcp_poll(struct file * file, struct socket *sock, struct poll_table_struct *wait); | 383 | extern unsigned int tcp_poll(struct file * file, struct socket *sock, struct poll_table_struct *wait); |
778 | 384 | ||
779 | extern int tcp_getsockopt(struct sock *sk, int level, | 385 | extern int tcp_getsockopt(struct sock *sk, int level, |
@@ -789,8 +395,6 @@ extern int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, | |||
789 | size_t len, int nonblock, | 395 | size_t len, int nonblock, |
790 | int flags, int *addr_len); | 396 | int flags, int *addr_len); |
791 | 397 | ||
792 | extern int tcp_listen_start(struct sock *sk); | ||
793 | |||
794 | extern void tcp_parse_options(struct sk_buff *skb, | 398 | extern void tcp_parse_options(struct sk_buff *skb, |
795 | struct tcp_options_received *opt_rx, | 399 | struct tcp_options_received *opt_rx, |
796 | int estab); | 400 | int estab); |
@@ -799,11 +403,6 @@ extern void tcp_parse_options(struct sk_buff *skb, | |||
799 | * TCP v4 functions exported for the inet6 API | 403 | * TCP v4 functions exported for the inet6 API |
800 | */ | 404 | */ |
801 | 405 | ||
802 | extern int tcp_v4_rebuild_header(struct sock *sk); | ||
803 | |||
804 | extern int tcp_v4_build_header(struct sock *sk, | ||
805 | struct sk_buff *skb); | ||
806 | |||
807 | extern void tcp_v4_send_check(struct sock *sk, | 406 | extern void tcp_v4_send_check(struct sock *sk, |
808 | struct tcphdr *th, int len, | 407 | struct tcphdr *th, int len, |
809 | struct sk_buff *skb); | 408 | struct sk_buff *skb); |
@@ -872,18 +471,15 @@ extern void tcp_cwnd_application_limited(struct sock *sk); | |||
872 | 471 | ||
873 | /* tcp_timer.c */ | 472 | /* tcp_timer.c */ |
874 | extern void tcp_init_xmit_timers(struct sock *); | 473 | extern void tcp_init_xmit_timers(struct sock *); |
875 | extern void tcp_clear_xmit_timers(struct sock *); | 474 | static inline void tcp_clear_xmit_timers(struct sock *sk) |
475 | { | ||
476 | inet_csk_clear_xmit_timers(sk); | ||
477 | } | ||
876 | 478 | ||
877 | extern void tcp_delete_keepalive_timer(struct sock *); | ||
878 | extern void tcp_reset_keepalive_timer(struct sock *, unsigned long); | ||
879 | extern unsigned int tcp_sync_mss(struct sock *sk, u32 pmtu); | 479 | extern unsigned int tcp_sync_mss(struct sock *sk, u32 pmtu); |
880 | extern unsigned int tcp_current_mss(struct sock *sk, int large); | 480 | extern unsigned int tcp_current_mss(struct sock *sk, int large); |
881 | 481 | ||
882 | #ifdef TCP_DEBUG | 482 | /* tcp.c */ |
883 | extern const char tcp_timer_bug_msg[]; | ||
884 | #endif | ||
885 | |||
886 | /* tcp_diag.c */ | ||
887 | extern void tcp_get_info(struct sock *, struct tcp_info *); | 483 | extern void tcp_get_info(struct sock *, struct tcp_info *); |
888 | 484 | ||
889 | /* Read 'sendfile()'-style from a TCP socket */ | 485 | /* Read 'sendfile()'-style from a TCP socket */ |
@@ -892,72 +488,6 @@ typedef int (*sk_read_actor_t)(read_descriptor_t *, struct sk_buff *, | |||
892 | extern int tcp_read_sock(struct sock *sk, read_descriptor_t *desc, | 488 | extern int tcp_read_sock(struct sock *sk, read_descriptor_t *desc, |
893 | sk_read_actor_t recv_actor); | 489 | sk_read_actor_t recv_actor); |
894 | 490 | ||
895 | static inline void tcp_clear_xmit_timer(struct sock *sk, int what) | ||
896 | { | ||
897 | struct tcp_sock *tp = tcp_sk(sk); | ||
898 | |||
899 | switch (what) { | ||
900 | case TCP_TIME_RETRANS: | ||
901 | case TCP_TIME_PROBE0: | ||
902 | tp->pending = 0; | ||
903 | |||
904 | #ifdef TCP_CLEAR_TIMERS | ||
905 | sk_stop_timer(sk, &tp->retransmit_timer); | ||
906 | #endif | ||
907 | break; | ||
908 | case TCP_TIME_DACK: | ||
909 | tp->ack.blocked = 0; | ||
910 | tp->ack.pending = 0; | ||
911 | |||
912 | #ifdef TCP_CLEAR_TIMERS | ||
913 | sk_stop_timer(sk, &tp->delack_timer); | ||
914 | #endif | ||
915 | break; | ||
916 | default: | ||
917 | #ifdef TCP_DEBUG | ||
918 | printk(tcp_timer_bug_msg); | ||
919 | #endif | ||
920 | return; | ||
921 | }; | ||
922 | |||
923 | } | ||
924 | |||
925 | /* | ||
926 | * Reset the retransmission timer | ||
927 | */ | ||
928 | static inline void tcp_reset_xmit_timer(struct sock *sk, int what, unsigned long when) | ||
929 | { | ||
930 | struct tcp_sock *tp = tcp_sk(sk); | ||
931 | |||
932 | if (when > TCP_RTO_MAX) { | ||
933 | #ifdef TCP_DEBUG | ||
934 | printk(KERN_DEBUG "reset_xmit_timer sk=%p %d when=0x%lx, caller=%p\n", sk, what, when, current_text_addr()); | ||
935 | #endif | ||
936 | when = TCP_RTO_MAX; | ||
937 | } | ||
938 | |||
939 | switch (what) { | ||
940 | case TCP_TIME_RETRANS: | ||
941 | case TCP_TIME_PROBE0: | ||
942 | tp->pending = what; | ||
943 | tp->timeout = jiffies+when; | ||
944 | sk_reset_timer(sk, &tp->retransmit_timer, tp->timeout); | ||
945 | break; | ||
946 | |||
947 | case TCP_TIME_DACK: | ||
948 | tp->ack.pending |= TCP_ACK_TIMER; | ||
949 | tp->ack.timeout = jiffies+when; | ||
950 | sk_reset_timer(sk, &tp->delack_timer, tp->ack.timeout); | ||
951 | break; | ||
952 | |||
953 | default: | ||
954 | #ifdef TCP_DEBUG | ||
955 | printk(tcp_timer_bug_msg); | ||
956 | #endif | ||
957 | return; | ||
958 | }; | ||
959 | } | ||
960 | |||
961 | /* Initialize RCV_MSS value. | 491 | /* Initialize RCV_MSS value. |
962 | * RCV_MSS is an our guess about MSS used by the peer. | 492 | * RCV_MSS is an our guess about MSS used by the peer. |
963 | * We haven't any direct information about the MSS. | 493 | * We haven't any direct information about the MSS. |
@@ -975,7 +505,7 @@ static inline void tcp_initialize_rcv_mss(struct sock *sk) | |||
975 | hint = min(hint, TCP_MIN_RCVMSS); | 505 | hint = min(hint, TCP_MIN_RCVMSS); |
976 | hint = max(hint, TCP_MIN_MSS); | 506 | hint = max(hint, TCP_MIN_MSS); |
977 | 507 | ||
978 | tp->ack.rcv_mss = hint; | 508 | inet_csk(sk)->icsk_ack.rcv_mss = hint; |
979 | } | 509 | } |
980 | 510 | ||
981 | static __inline__ void __tcp_fast_path_on(struct tcp_sock *tp, u32 snd_wnd) | 511 | static __inline__ void __tcp_fast_path_on(struct tcp_sock *tp, u32 snd_wnd) |
@@ -1110,7 +640,8 @@ static inline void tcp_packets_out_inc(struct sock *sk, | |||
1110 | 640 | ||
1111 | tp->packets_out += tcp_skb_pcount(skb); | 641 | tp->packets_out += tcp_skb_pcount(skb); |
1112 | if (!orig) | 642 | if (!orig) |
1113 | tcp_reset_xmit_timer(sk, TCP_TIME_RETRANS, tp->rto); | 643 | inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, |
644 | inet_csk(sk)->icsk_rto, TCP_RTO_MAX); | ||
1114 | } | 645 | } |
1115 | 646 | ||
1116 | static inline void tcp_packets_out_dec(struct tcp_sock *tp, | 647 | static inline void tcp_packets_out_dec(struct tcp_sock *tp, |
@@ -1138,29 +669,29 @@ struct tcp_congestion_ops { | |||
1138 | struct list_head list; | 669 | struct list_head list; |
1139 | 670 | ||
1140 | /* initialize private data (optional) */ | 671 | /* initialize private data (optional) */ |
1141 | void (*init)(struct tcp_sock *tp); | 672 | void (*init)(struct sock *sk); |
1142 | /* cleanup private data (optional) */ | 673 | /* cleanup private data (optional) */ |
1143 | void (*release)(struct tcp_sock *tp); | 674 | void (*release)(struct sock *sk); |
1144 | 675 | ||
1145 | /* return slow start threshold (required) */ | 676 | /* return slow start threshold (required) */ |
1146 | u32 (*ssthresh)(struct tcp_sock *tp); | 677 | u32 (*ssthresh)(struct sock *sk); |
1147 | /* lower bound for congestion window (optional) */ | 678 | /* lower bound for congestion window (optional) */ |
1148 | u32 (*min_cwnd)(struct tcp_sock *tp); | 679 | u32 (*min_cwnd)(struct sock *sk); |
1149 | /* do new cwnd calculation (required) */ | 680 | /* do new cwnd calculation (required) */ |
1150 | void (*cong_avoid)(struct tcp_sock *tp, u32 ack, | 681 | void (*cong_avoid)(struct sock *sk, u32 ack, |
1151 | u32 rtt, u32 in_flight, int good_ack); | 682 | u32 rtt, u32 in_flight, int good_ack); |
1152 | /* round trip time sample per acked packet (optional) */ | 683 | /* round trip time sample per acked packet (optional) */ |
1153 | void (*rtt_sample)(struct tcp_sock *tp, u32 usrtt); | 684 | void (*rtt_sample)(struct sock *sk, u32 usrtt); |
1154 | /* call before changing ca_state (optional) */ | 685 | /* call before changing ca_state (optional) */ |
1155 | void (*set_state)(struct tcp_sock *tp, u8 new_state); | 686 | void (*set_state)(struct sock *sk, u8 new_state); |
1156 | /* call when cwnd event occurs (optional) */ | 687 | /* call when cwnd event occurs (optional) */ |
1157 | void (*cwnd_event)(struct tcp_sock *tp, enum tcp_ca_event ev); | 688 | void (*cwnd_event)(struct sock *sk, enum tcp_ca_event ev); |
1158 | /* new value of cwnd after loss (optional) */ | 689 | /* new value of cwnd after loss (optional) */ |
1159 | u32 (*undo_cwnd)(struct tcp_sock *tp); | 690 | u32 (*undo_cwnd)(struct sock *sk); |
1160 | /* hook for packet ack accounting (optional) */ | 691 | /* hook for packet ack accounting (optional) */ |
1161 | void (*pkts_acked)(struct tcp_sock *tp, u32 num_acked); | 692 | void (*pkts_acked)(struct sock *sk, u32 num_acked); |
1162 | /* get info for tcp_diag (optional) */ | 693 | /* get info for inet_diag (optional) */ |
1163 | void (*get_info)(struct tcp_sock *tp, u32 ext, struct sk_buff *skb); | 694 | void (*get_info)(struct sock *sk, u32 ext, struct sk_buff *skb); |
1164 | 695 | ||
1165 | char name[TCP_CA_NAME_MAX]; | 696 | char name[TCP_CA_NAME_MAX]; |
1166 | struct module *owner; | 697 | struct module *owner; |
@@ -1169,30 +700,34 @@ struct tcp_congestion_ops { | |||
1169 | extern int tcp_register_congestion_control(struct tcp_congestion_ops *type); | 700 | extern int tcp_register_congestion_control(struct tcp_congestion_ops *type); |
1170 | extern void tcp_unregister_congestion_control(struct tcp_congestion_ops *type); | 701 | extern void tcp_unregister_congestion_control(struct tcp_congestion_ops *type); |
1171 | 702 | ||
1172 | extern void tcp_init_congestion_control(struct tcp_sock *tp); | 703 | extern void tcp_init_congestion_control(struct sock *sk); |
1173 | extern void tcp_cleanup_congestion_control(struct tcp_sock *tp); | 704 | extern void tcp_cleanup_congestion_control(struct sock *sk); |
1174 | extern int tcp_set_default_congestion_control(const char *name); | 705 | extern int tcp_set_default_congestion_control(const char *name); |
1175 | extern void tcp_get_default_congestion_control(char *name); | 706 | extern void tcp_get_default_congestion_control(char *name); |
1176 | extern int tcp_set_congestion_control(struct tcp_sock *tp, const char *name); | 707 | extern int tcp_set_congestion_control(struct sock *sk, const char *name); |
1177 | 708 | ||
1178 | extern struct tcp_congestion_ops tcp_init_congestion_ops; | 709 | extern struct tcp_congestion_ops tcp_init_congestion_ops; |
1179 | extern u32 tcp_reno_ssthresh(struct tcp_sock *tp); | 710 | extern u32 tcp_reno_ssthresh(struct sock *sk); |
1180 | extern void tcp_reno_cong_avoid(struct tcp_sock *tp, u32 ack, | 711 | extern void tcp_reno_cong_avoid(struct sock *sk, u32 ack, |
1181 | u32 rtt, u32 in_flight, int flag); | 712 | u32 rtt, u32 in_flight, int flag); |
1182 | extern u32 tcp_reno_min_cwnd(struct tcp_sock *tp); | 713 | extern u32 tcp_reno_min_cwnd(struct sock *sk); |
1183 | extern struct tcp_congestion_ops tcp_reno; | 714 | extern struct tcp_congestion_ops tcp_reno; |
1184 | 715 | ||
1185 | static inline void tcp_set_ca_state(struct tcp_sock *tp, u8 ca_state) | 716 | static inline void tcp_set_ca_state(struct sock *sk, const u8 ca_state) |
1186 | { | 717 | { |
1187 | if (tp->ca_ops->set_state) | 718 | struct inet_connection_sock *icsk = inet_csk(sk); |
1188 | tp->ca_ops->set_state(tp, ca_state); | 719 | |
1189 | tp->ca_state = ca_state; | 720 | if (icsk->icsk_ca_ops->set_state) |
721 | icsk->icsk_ca_ops->set_state(sk, ca_state); | ||
722 | icsk->icsk_ca_state = ca_state; | ||
1190 | } | 723 | } |
1191 | 724 | ||
1192 | static inline void tcp_ca_event(struct tcp_sock *tp, enum tcp_ca_event event) | 725 | static inline void tcp_ca_event(struct sock *sk, const enum tcp_ca_event event) |
1193 | { | 726 | { |
1194 | if (tp->ca_ops->cwnd_event) | 727 | const struct inet_connection_sock *icsk = inet_csk(sk); |
1195 | tp->ca_ops->cwnd_event(tp, event); | 728 | |
729 | if (icsk->icsk_ca_ops->cwnd_event) | ||
730 | icsk->icsk_ca_ops->cwnd_event(sk, event); | ||
1196 | } | 731 | } |
1197 | 732 | ||
1198 | /* This determines how many packets are "in the network" to the best | 733 | /* This determines how many packets are "in the network" to the best |
@@ -1218,9 +753,10 @@ static __inline__ unsigned int tcp_packets_in_flight(const struct tcp_sock *tp) | |||
1218 | * The exception is rate halving phase, when cwnd is decreasing towards | 753 | * The exception is rate halving phase, when cwnd is decreasing towards |
1219 | * ssthresh. | 754 | * ssthresh. |
1220 | */ | 755 | */ |
1221 | static inline __u32 tcp_current_ssthresh(struct tcp_sock *tp) | 756 | static inline __u32 tcp_current_ssthresh(const struct sock *sk) |
1222 | { | 757 | { |
1223 | if ((1<<tp->ca_state)&(TCPF_CA_CWR|TCPF_CA_Recovery)) | 758 | const struct tcp_sock *tp = tcp_sk(sk); |
759 | if ((1 << inet_csk(sk)->icsk_ca_state) & (TCPF_CA_CWR | TCPF_CA_Recovery)) | ||
1224 | return tp->snd_ssthresh; | 760 | return tp->snd_ssthresh; |
1225 | else | 761 | else |
1226 | return max(tp->snd_ssthresh, | 762 | return max(tp->snd_ssthresh, |
@@ -1237,10 +773,13 @@ static inline void tcp_sync_left_out(struct tcp_sock *tp) | |||
1237 | } | 773 | } |
1238 | 774 | ||
1239 | /* Set slow start threshold and cwnd not falling to slow start */ | 775 | /* Set slow start threshold and cwnd not falling to slow start */ |
1240 | static inline void __tcp_enter_cwr(struct tcp_sock *tp) | 776 | static inline void __tcp_enter_cwr(struct sock *sk) |
1241 | { | 777 | { |
778 | const struct inet_connection_sock *icsk = inet_csk(sk); | ||
779 | struct tcp_sock *tp = tcp_sk(sk); | ||
780 | |||
1242 | tp->undo_marker = 0; | 781 | tp->undo_marker = 0; |
1243 | tp->snd_ssthresh = tp->ca_ops->ssthresh(tp); | 782 | tp->snd_ssthresh = icsk->icsk_ca_ops->ssthresh(sk); |
1244 | tp->snd_cwnd = min(tp->snd_cwnd, | 783 | tp->snd_cwnd = min(tp->snd_cwnd, |
1245 | tcp_packets_in_flight(tp) + 1U); | 784 | tcp_packets_in_flight(tp) + 1U); |
1246 | tp->snd_cwnd_cnt = 0; | 785 | tp->snd_cwnd_cnt = 0; |
@@ -1249,12 +788,14 @@ static inline void __tcp_enter_cwr(struct tcp_sock *tp) | |||
1249 | TCP_ECN_queue_cwr(tp); | 788 | TCP_ECN_queue_cwr(tp); |
1250 | } | 789 | } |
1251 | 790 | ||
1252 | static inline void tcp_enter_cwr(struct tcp_sock *tp) | 791 | static inline void tcp_enter_cwr(struct sock *sk) |
1253 | { | 792 | { |
793 | struct tcp_sock *tp = tcp_sk(sk); | ||
794 | |||
1254 | tp->prior_ssthresh = 0; | 795 | tp->prior_ssthresh = 0; |
1255 | if (tp->ca_state < TCP_CA_CWR) { | 796 | if (inet_csk(sk)->icsk_ca_state < TCP_CA_CWR) { |
1256 | __tcp_enter_cwr(tp); | 797 | __tcp_enter_cwr(sk); |
1257 | tcp_set_ca_state(tp, TCP_CA_CWR); | 798 | tcp_set_ca_state(sk, TCP_CA_CWR); |
1258 | } | 799 | } |
1259 | } | 800 | } |
1260 | 801 | ||
@@ -1277,8 +818,10 @@ static __inline__ void tcp_minshall_update(struct tcp_sock *tp, int mss, | |||
1277 | 818 | ||
1278 | static __inline__ void tcp_check_probe_timer(struct sock *sk, struct tcp_sock *tp) | 819 | static __inline__ void tcp_check_probe_timer(struct sock *sk, struct tcp_sock *tp) |
1279 | { | 820 | { |
1280 | if (!tp->packets_out && !tp->pending) | 821 | const struct inet_connection_sock *icsk = inet_csk(sk); |
1281 | tcp_reset_xmit_timer(sk, TCP_TIME_PROBE0, tp->rto); | 822 | if (!tp->packets_out && !icsk->icsk_pending) |
823 | inet_csk_reset_xmit_timer(sk, ICSK_TIME_PROBE0, | ||
824 | icsk->icsk_rto, TCP_RTO_MAX); | ||
1282 | } | 825 | } |
1283 | 826 | ||
1284 | static __inline__ void tcp_push_pending_frames(struct sock *sk, | 827 | static __inline__ void tcp_push_pending_frames(struct sock *sk, |
@@ -1297,9 +840,6 @@ static __inline__ void tcp_update_wl(struct tcp_sock *tp, u32 ack, u32 seq) | |||
1297 | tp->snd_wl1 = seq; | 840 | tp->snd_wl1 = seq; |
1298 | } | 841 | } |
1299 | 842 | ||
1300 | extern void tcp_destroy_sock(struct sock *sk); | ||
1301 | |||
1302 | |||
1303 | /* | 843 | /* |
1304 | * Calculate(/check) TCP checksum | 844 | * Calculate(/check) TCP checksum |
1305 | */ | 845 | */ |
@@ -1359,8 +899,10 @@ static __inline__ int tcp_prequeue(struct sock *sk, struct sk_buff *skb) | |||
1359 | tp->ucopy.memory = 0; | 899 | tp->ucopy.memory = 0; |
1360 | } else if (skb_queue_len(&tp->ucopy.prequeue) == 1) { | 900 | } else if (skb_queue_len(&tp->ucopy.prequeue) == 1) { |
1361 | wake_up_interruptible(sk->sk_sleep); | 901 | wake_up_interruptible(sk->sk_sleep); |
1362 | if (!tcp_ack_scheduled(tp)) | 902 | if (!inet_csk_ack_scheduled(sk)) |
1363 | tcp_reset_xmit_timer(sk, TCP_TIME_DACK, (3*TCP_RTO_MIN)/4); | 903 | inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK, |
904 | (3 * TCP_RTO_MIN) / 4, | ||
905 | TCP_RTO_MAX); | ||
1364 | } | 906 | } |
1365 | return 1; | 907 | return 1; |
1366 | } | 908 | } |
@@ -1393,9 +935,9 @@ static __inline__ void tcp_set_state(struct sock *sk, int state) | |||
1393 | TCP_INC_STATS(TCP_MIB_ESTABRESETS); | 935 | TCP_INC_STATS(TCP_MIB_ESTABRESETS); |
1394 | 936 | ||
1395 | sk->sk_prot->unhash(sk); | 937 | sk->sk_prot->unhash(sk); |
1396 | if (tcp_sk(sk)->bind_hash && | 938 | if (inet_csk(sk)->icsk_bind_hash && |
1397 | !(sk->sk_userlocks & SOCK_BINDPORT_LOCK)) | 939 | !(sk->sk_userlocks & SOCK_BINDPORT_LOCK)) |
1398 | tcp_put_port(sk); | 940 | inet_put_port(&tcp_hashinfo, sk); |
1399 | /* fall through */ | 941 | /* fall through */ |
1400 | default: | 942 | default: |
1401 | if (oldstate==TCP_ESTABLISHED) | 943 | if (oldstate==TCP_ESTABLISHED) |
@@ -1422,7 +964,7 @@ static __inline__ void tcp_done(struct sock *sk) | |||
1422 | if (!sock_flag(sk, SOCK_DEAD)) | 964 | if (!sock_flag(sk, SOCK_DEAD)) |
1423 | sk->sk_state_change(sk); | 965 | sk->sk_state_change(sk); |
1424 | else | 966 | else |
1425 | tcp_destroy_sock(sk); | 967 | inet_csk_destroy_sock(sk); |
1426 | } | 968 | } |
1427 | 969 | ||
1428 | static __inline__ void tcp_sack_reset(struct tcp_options_received *rx_opt) | 970 | static __inline__ void tcp_sack_reset(struct tcp_options_received *rx_opt) |
@@ -1524,54 +1066,6 @@ static inline int tcp_full_space(const struct sock *sk) | |||
1524 | return tcp_win_from_space(sk->sk_rcvbuf); | 1066 | return tcp_win_from_space(sk->sk_rcvbuf); |
1525 | } | 1067 | } |
1526 | 1068 | ||
1527 | static inline void tcp_acceptq_queue(struct sock *sk, struct request_sock *req, | ||
1528 | struct sock *child) | ||
1529 | { | ||
1530 | reqsk_queue_add(&tcp_sk(sk)->accept_queue, req, sk, child); | ||
1531 | } | ||
1532 | |||
1533 | static inline void | ||
1534 | tcp_synq_removed(struct sock *sk, struct request_sock *req) | ||
1535 | { | ||
1536 | if (reqsk_queue_removed(&tcp_sk(sk)->accept_queue, req) == 0) | ||
1537 | tcp_delete_keepalive_timer(sk); | ||
1538 | } | ||
1539 | |||
1540 | static inline void tcp_synq_added(struct sock *sk) | ||
1541 | { | ||
1542 | if (reqsk_queue_added(&tcp_sk(sk)->accept_queue) == 0) | ||
1543 | tcp_reset_keepalive_timer(sk, TCP_TIMEOUT_INIT); | ||
1544 | } | ||
1545 | |||
1546 | static inline int tcp_synq_len(struct sock *sk) | ||
1547 | { | ||
1548 | return reqsk_queue_len(&tcp_sk(sk)->accept_queue); | ||
1549 | } | ||
1550 | |||
1551 | static inline int tcp_synq_young(struct sock *sk) | ||
1552 | { | ||
1553 | return reqsk_queue_len_young(&tcp_sk(sk)->accept_queue); | ||
1554 | } | ||
1555 | |||
1556 | static inline int tcp_synq_is_full(struct sock *sk) | ||
1557 | { | ||
1558 | return reqsk_queue_is_full(&tcp_sk(sk)->accept_queue); | ||
1559 | } | ||
1560 | |||
1561 | static inline void tcp_synq_unlink(struct tcp_sock *tp, struct request_sock *req, | ||
1562 | struct request_sock **prev) | ||
1563 | { | ||
1564 | reqsk_queue_unlink(&tp->accept_queue, req, prev); | ||
1565 | } | ||
1566 | |||
1567 | static inline void tcp_synq_drop(struct sock *sk, struct request_sock *req, | ||
1568 | struct request_sock **prev) | ||
1569 | { | ||
1570 | tcp_synq_unlink(tcp_sk(sk), req, prev); | ||
1571 | tcp_synq_removed(sk, req); | ||
1572 | reqsk_free(req); | ||
1573 | } | ||
1574 | |||
1575 | static __inline__ void tcp_openreq_init(struct request_sock *req, | 1069 | static __inline__ void tcp_openreq_init(struct request_sock *req, |
1576 | struct tcp_options_received *rx_opt, | 1070 | struct tcp_options_received *rx_opt, |
1577 | struct sk_buff *skb) | 1071 | struct sk_buff *skb) |
@@ -1593,27 +1087,6 @@ static __inline__ void tcp_openreq_init(struct request_sock *req, | |||
1593 | 1087 | ||
1594 | extern void tcp_enter_memory_pressure(void); | 1088 | extern void tcp_enter_memory_pressure(void); |
1595 | 1089 | ||
1596 | extern void tcp_listen_wlock(void); | ||
1597 | |||
1598 | /* - We may sleep inside this lock. | ||
1599 | * - If sleeping is not required (or called from BH), | ||
1600 | * use plain read_(un)lock(&tcp_lhash_lock). | ||
1601 | */ | ||
1602 | |||
1603 | static inline void tcp_listen_lock(void) | ||
1604 | { | ||
1605 | /* read_lock synchronizes to candidates to writers */ | ||
1606 | read_lock(&tcp_lhash_lock); | ||
1607 | atomic_inc(&tcp_lhash_users); | ||
1608 | read_unlock(&tcp_lhash_lock); | ||
1609 | } | ||
1610 | |||
1611 | static inline void tcp_listen_unlock(void) | ||
1612 | { | ||
1613 | if (atomic_dec_and_test(&tcp_lhash_users)) | ||
1614 | wake_up(&tcp_lhash_wait); | ||
1615 | } | ||
1616 | |||
1617 | static inline int keepalive_intvl_when(const struct tcp_sock *tp) | 1090 | static inline int keepalive_intvl_when(const struct tcp_sock *tp) |
1618 | { | 1091 | { |
1619 | return tp->keepalive_intvl ? : sysctl_tcp_keepalive_intvl; | 1092 | return tp->keepalive_intvl ? : sysctl_tcp_keepalive_intvl; |
@@ -1624,12 +1097,13 @@ static inline int keepalive_time_when(const struct tcp_sock *tp) | |||
1624 | return tp->keepalive_time ? : sysctl_tcp_keepalive_time; | 1097 | return tp->keepalive_time ? : sysctl_tcp_keepalive_time; |
1625 | } | 1098 | } |
1626 | 1099 | ||
1627 | static inline int tcp_fin_time(const struct tcp_sock *tp) | 1100 | static inline int tcp_fin_time(const struct sock *sk) |
1628 | { | 1101 | { |
1629 | int fin_timeout = tp->linger2 ? : sysctl_tcp_fin_timeout; | 1102 | int fin_timeout = tcp_sk(sk)->linger2 ? : sysctl_tcp_fin_timeout; |
1103 | const int rto = inet_csk(sk)->icsk_rto; | ||
1630 | 1104 | ||
1631 | if (fin_timeout < (tp->rto<<2) - (tp->rto>>1)) | 1105 | if (fin_timeout < (rto << 2) - (rto >> 1)) |
1632 | fin_timeout = (tp->rto<<2) - (tp->rto>>1); | 1106 | fin_timeout = (rto << 2) - (rto >> 1); |
1633 | 1107 | ||
1634 | return fin_timeout; | 1108 | return fin_timeout; |
1635 | } | 1109 | } |
@@ -1658,15 +1132,6 @@ static inline int tcp_paws_check(const struct tcp_options_received *rx_opt, int | |||
1658 | return 1; | 1132 | return 1; |
1659 | } | 1133 | } |
1660 | 1134 | ||
1661 | static inline void tcp_v4_setup_caps(struct sock *sk, struct dst_entry *dst) | ||
1662 | { | ||
1663 | sk->sk_route_caps = dst->dev->features; | ||
1664 | if (sk->sk_route_caps & NETIF_F_TSO) { | ||
1665 | if (sock_flag(sk, SOCK_NO_LARGESEND) || dst->header_len) | ||
1666 | sk->sk_route_caps &= ~NETIF_F_TSO; | ||
1667 | } | ||
1668 | } | ||
1669 | |||
1670 | #define TCP_CHECK_TIMER(sk) do { } while (0) | 1135 | #define TCP_CHECK_TIMER(sk) do { } while (0) |
1671 | 1136 | ||
1672 | static inline int tcp_use_frto(const struct sock *sk) | 1137 | static inline int tcp_use_frto(const struct sock *sk) |
@@ -1718,4 +1183,16 @@ struct tcp_iter_state { | |||
1718 | extern int tcp_proc_register(struct tcp_seq_afinfo *afinfo); | 1183 | extern int tcp_proc_register(struct tcp_seq_afinfo *afinfo); |
1719 | extern void tcp_proc_unregister(struct tcp_seq_afinfo *afinfo); | 1184 | extern void tcp_proc_unregister(struct tcp_seq_afinfo *afinfo); |
1720 | 1185 | ||
1186 | extern struct request_sock_ops tcp_request_sock_ops; | ||
1187 | |||
1188 | extern int tcp_v4_destroy_sock(struct sock *sk); | ||
1189 | |||
1190 | #ifdef CONFIG_PROC_FS | ||
1191 | extern int tcp4_proc_init(void); | ||
1192 | extern void tcp4_proc_exit(void); | ||
1193 | #endif | ||
1194 | |||
1195 | extern void tcp_v4_init(struct net_proto_family *ops); | ||
1196 | extern void tcp_init(void); | ||
1197 | |||
1721 | #endif /* _TCP_H */ | 1198 | #endif /* _TCP_H */ |
diff --git a/include/net/tcp_ecn.h b/include/net/tcp_ecn.h index 64980ee8c92a..c6b84397448d 100644 --- a/include/net/tcp_ecn.h +++ b/include/net/tcp_ecn.h | |||
@@ -88,7 +88,7 @@ static inline void TCP_ECN_check_ce(struct tcp_sock *tp, struct sk_buff *skb) | |||
88 | * it is surely retransmit. It is not in ECN RFC, | 88 | * it is surely retransmit. It is not in ECN RFC, |
89 | * but Linux follows this rule. */ | 89 | * but Linux follows this rule. */ |
90 | else if (INET_ECN_is_not_ect((TCP_SKB_CB(skb)->flags))) | 90 | else if (INET_ECN_is_not_ect((TCP_SKB_CB(skb)->flags))) |
91 | tcp_enter_quickack_mode(tp); | 91 | tcp_enter_quickack_mode((struct sock *)tp); |
92 | } | 92 | } |
93 | } | 93 | } |
94 | 94 | ||
diff --git a/include/net/tcp_states.h b/include/net/tcp_states.h new file mode 100644 index 000000000000..b9d4176b2d15 --- /dev/null +++ b/include/net/tcp_states.h | |||
@@ -0,0 +1,34 @@ | |||
1 | /* | ||
2 | * INET An implementation of the TCP/IP protocol suite for the LINUX | ||
3 | * operating system. INET is implemented using the BSD Socket | ||
4 | * interface as the means of communication with the user level. | ||
5 | * | ||
6 | * Definitions for the TCP protocol sk_state field. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU General Public License | ||
10 | * as published by the Free Software Foundation; either version | ||
11 | * 2 of the License, or (at your option) any later version. | ||
12 | */ | ||
13 | #ifndef _LINUX_TCP_STATES_H | ||
14 | #define _LINUX_TCP_STATES_H | ||
15 | |||
16 | enum { | ||
17 | TCP_ESTABLISHED = 1, | ||
18 | TCP_SYN_SENT, | ||
19 | TCP_SYN_RECV, | ||
20 | TCP_FIN_WAIT1, | ||
21 | TCP_FIN_WAIT2, | ||
22 | TCP_TIME_WAIT, | ||
23 | TCP_CLOSE, | ||
24 | TCP_CLOSE_WAIT, | ||
25 | TCP_LAST_ACK, | ||
26 | TCP_LISTEN, | ||
27 | TCP_CLOSING, /* Now a valid state */ | ||
28 | |||
29 | TCP_MAX_STATES /* Leave at the end! */ | ||
30 | }; | ||
31 | |||
32 | #define TCP_STATE_MASK 0xF | ||
33 | |||
34 | #endif /* _LINUX_TCP_STATES_H */ | ||
diff --git a/include/net/udp.h b/include/net/udp.h index ac229b761dbc..107b9d791a1f 100644 --- a/include/net/udp.h +++ b/include/net/udp.h | |||
@@ -94,6 +94,11 @@ struct udp_iter_state { | |||
94 | struct seq_operations seq_ops; | 94 | struct seq_operations seq_ops; |
95 | }; | 95 | }; |
96 | 96 | ||
97 | #ifdef CONFIG_PROC_FS | ||
97 | extern int udp_proc_register(struct udp_seq_afinfo *afinfo); | 98 | extern int udp_proc_register(struct udp_seq_afinfo *afinfo); |
98 | extern void udp_proc_unregister(struct udp_seq_afinfo *afinfo); | 99 | extern void udp_proc_unregister(struct udp_seq_afinfo *afinfo); |
100 | |||
101 | extern int udp4_proc_init(void); | ||
102 | extern void udp4_proc_exit(void); | ||
103 | #endif | ||
99 | #endif /* _UDP_H */ | 104 | #endif /* _UDP_H */ |
diff --git a/include/net/x25.h b/include/net/x25.h index 8b39b98876e8..fee62ff8c194 100644 --- a/include/net/x25.h +++ b/include/net/x25.h | |||
@@ -175,7 +175,7 @@ extern void x25_kill_by_neigh(struct x25_neigh *); | |||
175 | 175 | ||
176 | /* x25_dev.c */ | 176 | /* x25_dev.c */ |
177 | extern void x25_send_frame(struct sk_buff *, struct x25_neigh *); | 177 | extern void x25_send_frame(struct sk_buff *, struct x25_neigh *); |
178 | extern int x25_lapb_receive_frame(struct sk_buff *, struct net_device *, struct packet_type *); | 178 | extern int x25_lapb_receive_frame(struct sk_buff *, struct net_device *, struct packet_type *, struct net_device *); |
179 | extern void x25_establish_link(struct x25_neigh *); | 179 | extern void x25_establish_link(struct x25_neigh *); |
180 | extern void x25_terminate_link(struct x25_neigh *); | 180 | extern void x25_terminate_link(struct x25_neigh *); |
181 | 181 | ||
diff --git a/include/net/x25device.h b/include/net/x25device.h index d45ae883bd1d..1a318374faef 100644 --- a/include/net/x25device.h +++ b/include/net/x25device.h | |||
@@ -8,7 +8,6 @@ | |||
8 | static inline __be16 x25_type_trans(struct sk_buff *skb, struct net_device *dev) | 8 | static inline __be16 x25_type_trans(struct sk_buff *skb, struct net_device *dev) |
9 | { | 9 | { |
10 | skb->mac.raw = skb->data; | 10 | skb->mac.raw = skb->data; |
11 | skb->input_dev = skb->dev = dev; | ||
12 | skb->pkt_type = PACKET_HOST; | 11 | skb->pkt_type = PACKET_HOST; |
13 | 12 | ||
14 | return htons(ETH_P_X25); | 13 | return htons(ETH_P_X25); |
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 868ef88ef971..a9d0d8c5dfbf 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
@@ -818,7 +818,6 @@ extern void xfrm6_init(void); | |||
818 | extern void xfrm6_fini(void); | 818 | extern void xfrm6_fini(void); |
819 | extern void xfrm_state_init(void); | 819 | extern void xfrm_state_init(void); |
820 | extern void xfrm4_state_init(void); | 820 | extern void xfrm4_state_init(void); |
821 | extern void xfrm4_state_fini(void); | ||
822 | extern void xfrm6_state_init(void); | 821 | extern void xfrm6_state_init(void); |
823 | extern void xfrm6_state_fini(void); | 822 | extern void xfrm6_state_fini(void); |
824 | 823 | ||