forked from Minki/linux
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
This commit is contained in:
commit
d347da0def
@ -46,6 +46,29 @@ ipfrag_secret_interval - INTEGER
|
||||
for the hash secret) for IP fragments.
|
||||
Default: 600
|
||||
|
||||
ipfrag_max_dist - INTEGER
|
||||
ipfrag_max_dist is a non-negative integer value which defines the
|
||||
maximum "disorder" which is allowed among fragments which share a
|
||||
common IP source address. Note that reordering of packets is
|
||||
not unusual, but if a large number of fragments arrive from a source
|
||||
IP address while a particular fragment queue remains incomplete, it
|
||||
probably indicates that one or more fragments belonging to that queue
|
||||
have been lost. When ipfrag_max_dist is positive, an additional check
|
||||
is done on fragments before they are added to a reassembly queue - if
|
||||
ipfrag_max_dist (or more) fragments have arrived from a particular IP
|
||||
address between additions to any IP fragment queue using that source
|
||||
address, it's presumed that one or more fragments in the queue are
|
||||
lost. The existing fragment queue will be dropped, and a new one
|
||||
started. An ipfrag_max_dist value of zero disables this check.
|
||||
|
||||
Using a very small value, e.g. 1 or 2, for ipfrag_max_dist can
|
||||
result in unnecessarily dropping fragment queues when normal
|
||||
reordering of packets occurs, which could lead to poor application
|
||||
performance. Using a very large value, e.g. 50000, increases the
|
||||
likelihood of incorrectly reassembling IP fragments that originate
|
||||
from different IP datagrams, which could result in data corruption.
|
||||
Default: 64
|
||||
|
||||
INET peer storage:
|
||||
|
||||
inet_peer_threshold - INTEGER
|
||||
|
@ -1554,10 +1554,8 @@ __u32 secure_tcp_sequence_number(__u32 saddr, __u32 daddr,
|
||||
|
||||
EXPORT_SYMBOL(secure_tcp_sequence_number);
|
||||
|
||||
|
||||
|
||||
/* Generate secure starting point for ephemeral TCP port search */
|
||||
u32 secure_tcp_port_ephemeral(__u32 saddr, __u32 daddr, __u16 dport)
|
||||
/* Generate secure starting point for ephemeral IPV4 transport port search */
|
||||
u32 secure_ipv4_port_ephemeral(__u32 saddr, __u32 daddr, __u16 dport)
|
||||
{
|
||||
struct keydata *keyptr = get_keyptr();
|
||||
u32 hash[4];
|
||||
@ -1575,7 +1573,7 @@ u32 secure_tcp_port_ephemeral(__u32 saddr, __u32 daddr, __u16 dport)
|
||||
}
|
||||
|
||||
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
|
||||
u32 secure_tcpv6_port_ephemeral(const __u32 *saddr, const __u32 *daddr, __u16 dport)
|
||||
u32 secure_ipv6_port_ephemeral(const __u32 *saddr, const __u32 *daddr, __u16 dport)
|
||||
{
|
||||
struct keydata *keyptr = get_keyptr();
|
||||
u32 hash[12];
|
||||
@ -1586,7 +1584,7 @@ u32 secure_tcpv6_port_ephemeral(const __u32 *saddr, const __u32 *daddr, __u16 dp
|
||||
|
||||
return twothirdsMD4Transform(daddr, hash);
|
||||
}
|
||||
EXPORT_SYMBOL(secure_tcpv6_port_ephemeral);
|
||||
EXPORT_SYMBOL(secure_ipv6_port_ephemeral);
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_IP_DCCP) || defined(CONFIG_IP_DCCP_MODULE)
|
||||
|
@ -47,6 +47,8 @@
|
||||
#include <linux/ip.h>
|
||||
#include <linux/in.h>
|
||||
|
||||
#include <net/dst.h>
|
||||
|
||||
MODULE_AUTHOR("Roland Dreier");
|
||||
MODULE_DESCRIPTION("IP-over-InfiniBand net driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -43,6 +43,8 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/completion.h>
|
||||
|
||||
#include <net/dst.h>
|
||||
|
||||
#include "ipoib.h"
|
||||
|
||||
#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG
|
||||
|
@ -115,6 +115,7 @@
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
@ -85,7 +85,7 @@ static int pppoe_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
||||
static int pppoe_xmit(struct ppp_channel *chan, struct sk_buff *skb);
|
||||
static int __pppoe_xmit(struct sock *sk, struct sk_buff *skb);
|
||||
|
||||
static struct proto_ops pppoe_ops;
|
||||
static const struct proto_ops pppoe_ops;
|
||||
static DEFINE_RWLOCK(pppoe_hash_lock);
|
||||
|
||||
static struct ppp_channel_ops pppoe_chan_ops;
|
||||
@ -383,8 +383,6 @@ static int pppoe_rcv(struct sk_buff *skb,
|
||||
{
|
||||
struct pppoe_hdr *ph;
|
||||
struct pppox_sock *po;
|
||||
struct sock *sk;
|
||||
int ret;
|
||||
|
||||
if (!pskb_may_pull(skb, sizeof(struct pppoe_hdr)))
|
||||
goto drop;
|
||||
@ -395,24 +393,8 @@ static int pppoe_rcv(struct sk_buff *skb,
|
||||
ph = (struct pppoe_hdr *) skb->nh.raw;
|
||||
|
||||
po = get_item((unsigned long) ph->sid, eth_hdr(skb)->h_source);
|
||||
if (!po)
|
||||
goto drop;
|
||||
|
||||
sk = sk_pppox(po);
|
||||
bh_lock_sock(sk);
|
||||
|
||||
/* Socket state is unknown, must put skb into backlog. */
|
||||
if (sock_owned_by_user(sk) != 0) {
|
||||
sk_add_backlog(sk, skb);
|
||||
ret = NET_RX_SUCCESS;
|
||||
} else {
|
||||
ret = pppoe_rcv_core(sk, skb);
|
||||
}
|
||||
|
||||
bh_unlock_sock(sk);
|
||||
sock_put(sk);
|
||||
|
||||
return ret;
|
||||
if (po != NULL)
|
||||
return sk_receive_skb(sk_pppox(po), skb);
|
||||
drop:
|
||||
kfree_skb(skb);
|
||||
out:
|
||||
@ -1081,9 +1063,7 @@ static int __init pppoe_proc_init(void)
|
||||
static inline int pppoe_proc_init(void) { return 0; }
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
|
||||
/* ->ioctl are set at pppox_create */
|
||||
|
||||
static struct proto_ops pppoe_ops = {
|
||||
static const struct proto_ops pppoe_ops = {
|
||||
.family = AF_PPPOX,
|
||||
.owner = THIS_MODULE,
|
||||
.release = pppoe_release,
|
||||
@ -1099,7 +1079,8 @@ static struct proto_ops pppoe_ops = {
|
||||
.getsockopt = sock_no_getsockopt,
|
||||
.sendmsg = pppoe_sendmsg,
|
||||
.recvmsg = pppoe_recvmsg,
|
||||
.mmap = sock_no_mmap
|
||||
.mmap = sock_no_mmap,
|
||||
.ioctl = pppox_ioctl,
|
||||
};
|
||||
|
||||
static struct pppox_proto pppoe_proto = {
|
||||
|
@ -68,8 +68,7 @@ EXPORT_SYMBOL(register_pppox_proto);
|
||||
EXPORT_SYMBOL(unregister_pppox_proto);
|
||||
EXPORT_SYMBOL(pppox_unbind_sock);
|
||||
|
||||
static int pppox_ioctl(struct socket* sock, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
int pppox_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct pppox_sock *po = pppox_sk(sk);
|
||||
@ -105,6 +104,7 @@ static int pppox_ioctl(struct socket* sock, unsigned int cmd,
|
||||
return rc;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(pppox_ioctl);
|
||||
|
||||
static int pppox_create(struct socket *sock, int protocol)
|
||||
{
|
||||
@ -119,11 +119,7 @@ static int pppox_create(struct socket *sock, int protocol)
|
||||
goto out;
|
||||
|
||||
rc = pppox_protos[protocol]->create(sock);
|
||||
if (!rc) {
|
||||
/* We get to set the ioctl handler. */
|
||||
/* For everything else, pppox is just a shell. */
|
||||
sock->ops->ioctl = pppox_ioctl;
|
||||
}
|
||||
|
||||
module_put(pppox_protos[protocol]->owner);
|
||||
out:
|
||||
return rc;
|
||||
|
@ -107,6 +107,7 @@
|
||||
|
||||
#include "h/skversion.h"
|
||||
|
||||
#include <linux/in.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/init.h>
|
||||
|
@ -25,6 +25,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/in.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/moduleparam.h>
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/in.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/pci.h>
|
||||
@ -3650,7 +3651,7 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
TXD_FLAG_CPU_POST_DMA);
|
||||
|
||||
skb->nh.iph->check = 0;
|
||||
skb->nh.iph->tot_len = ntohs(mss + ip_tcp_len + tcp_opt_len);
|
||||
skb->nh.iph->tot_len = htons(mss + ip_tcp_len + tcp_opt_len);
|
||||
if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) {
|
||||
skb->h.th->check = 0;
|
||||
base_flags &= ~TXD_FLAG_TCPUDP_CSUM;
|
||||
|
@ -7456,8 +7456,7 @@ static void ipw_handle_data_packet(struct ipw_priv *priv,
|
||||
/* HW decrypt will not clear the WEP bit, MIC, PN, etc. */
|
||||
hdr = (struct ieee80211_hdr_4addr *)rxb->skb->data;
|
||||
if (priv->ieee->iw_mode != IW_MODE_MONITOR &&
|
||||
((is_multicast_ether_addr(hdr->addr1) ||
|
||||
is_broadcast_ether_addr(hdr->addr1)) ?
|
||||
(is_multicast_ether_addr(hdr->addr1) ?
|
||||
!priv->ieee->host_mc_decrypt : !priv->ieee->host_decrypt))
|
||||
ipw_rebuild_decrypted_skb(priv, rxb->skb);
|
||||
|
||||
@ -7648,8 +7647,7 @@ static inline int is_network_packet(struct ipw_priv *priv,
|
||||
return 0;
|
||||
|
||||
/* {broad,multi}cast packets to our BSSID go through */
|
||||
if (is_multicast_ether_addr(header->addr1) ||
|
||||
is_broadcast_ether_addr(header->addr1))
|
||||
if (is_multicast_ether_addr(header->addr1))
|
||||
return !memcmp(header->addr3, priv->bssid, ETH_ALEN);
|
||||
|
||||
/* packets to our adapter go through */
|
||||
@ -7662,8 +7660,7 @@ static inline int is_network_packet(struct ipw_priv *priv,
|
||||
return 0;
|
||||
|
||||
/* {broad,multi}cast packets to our BSS go through */
|
||||
if (is_multicast_ether_addr(header->addr1) ||
|
||||
is_broadcast_ether_addr(header->addr1))
|
||||
if (is_multicast_ether_addr(header->addr1))
|
||||
return !memcmp(header->addr2, priv->bssid, ETH_ALEN);
|
||||
|
||||
/* packets to our adapter go through */
|
||||
@ -9657,8 +9654,7 @@ static inline int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb,
|
||||
switch (priv->ieee->iw_mode) {
|
||||
case IW_MODE_ADHOC:
|
||||
hdr_len = IEEE80211_3ADDR_LEN;
|
||||
unicast = !(is_multicast_ether_addr(hdr->addr1) ||
|
||||
is_broadcast_ether_addr(hdr->addr1));
|
||||
unicast = !is_multicast_ether_addr(hdr->addr1);
|
||||
id = ipw_find_station(priv, hdr->addr1);
|
||||
if (id == IPW_INVALID_STATION) {
|
||||
id = ipw_add_station(priv, hdr->addr1);
|
||||
@ -9673,8 +9669,7 @@ static inline int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb,
|
||||
|
||||
case IW_MODE_INFRA:
|
||||
default:
|
||||
unicast = !(is_multicast_ether_addr(hdr->addr3) ||
|
||||
is_broadcast_ether_addr(hdr->addr3));
|
||||
unicast = !is_multicast_ether_addr(hdr->addr3);
|
||||
hdr_len = IEEE80211_3ADDR_LEN;
|
||||
id = 0;
|
||||
break;
|
||||
|
@ -26,6 +26,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/in.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/net.h>
|
||||
#include <linux/ipv6.h>
|
||||
|
@ -14,6 +14,9 @@
|
||||
#include <linux/sunrpc/svc.h>
|
||||
#include <linux/sunrpc/svcsock.h>
|
||||
#include <linux/nfs_fs.h>
|
||||
|
||||
#include <net/inet_sock.h>
|
||||
|
||||
#include "nfs4_fs.h"
|
||||
#include "callback.h"
|
||||
|
||||
|
@ -321,6 +321,7 @@ static inline int fls(int word)
|
||||
#else
|
||||
#define fls generic_fls
|
||||
#endif
|
||||
#define fls64 generic_fls64
|
||||
|
||||
/* Compute powers of two for the given integer. */
|
||||
static inline long floor_log2(unsigned long word)
|
||||
|
@ -332,6 +332,7 @@ static inline unsigned long __ffs(unsigned long word)
|
||||
*/
|
||||
|
||||
#define fls(x) generic_fls(x)
|
||||
#define fls64(x) generic_fls64(x)
|
||||
|
||||
/*
|
||||
* ffs: find first bit set. This is defined the same way as
|
||||
@ -351,6 +352,7 @@ static inline unsigned long __ffs(unsigned long word)
|
||||
#define fls(x) \
|
||||
( __builtin_constant_p(x) ? generic_fls(x) : \
|
||||
({ int __r; asm("clz\t%0, %1" : "=r"(__r) : "r"(x) : "cc"); 32-__r; }) )
|
||||
#define fls64(x) generic_fls64(x)
|
||||
#define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); })
|
||||
#define __ffs(x) (ffs(x) - 1)
|
||||
#define ffz(x) __ffs( ~(x) )
|
||||
|
@ -259,6 +259,7 @@ static inline unsigned long __ffs(unsigned long word)
|
||||
*/
|
||||
|
||||
#define fls(x) generic_fls(x)
|
||||
#define fls64(x) generic_fls64(x)
|
||||
|
||||
/*
|
||||
* ffs: find first bit set. This is defined the same way as
|
||||
|
@ -240,6 +240,7 @@ static inline int test_bit(int nr, const volatile unsigned long *addr)
|
||||
*/
|
||||
|
||||
#define fls(x) generic_fls(x)
|
||||
#define fls64(x) generic_fls64(x)
|
||||
|
||||
/*
|
||||
* hweightN - returns the hamming weight of a N-bit word
|
||||
|
@ -228,6 +228,7 @@ found_middle:
|
||||
\
|
||||
bit ? 33 - bit : bit; \
|
||||
})
|
||||
#define fls64(x) generic_fls64(x)
|
||||
|
||||
/*
|
||||
* Every architecture must define this function. It's the fastest
|
||||
|
@ -56,6 +56,7 @@ extern __inline__ int test_bit(int nr, const unsigned long * addr)
|
||||
*/
|
||||
|
||||
#define fls(x) generic_fls(x)
|
||||
#define fls64(x) generic_fls64(x)
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
|
@ -406,5 +406,6 @@ found_middle:
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#define fls(x) generic_fls(x)
|
||||
#define fls64(x) generic_fls64(x)
|
||||
|
||||
#endif /* _H8300_BITOPS_H */
|
||||
|
@ -372,6 +372,7 @@ static inline unsigned long ffz(unsigned long word)
|
||||
*/
|
||||
|
||||
#define fls(x) generic_fls(x)
|
||||
#define fls64(x) generic_fls64(x)
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
|
@ -345,6 +345,7 @@ fls (int t)
|
||||
x |= x >> 16;
|
||||
return ia64_popcnt(x);
|
||||
}
|
||||
#define fls64(x) generic_fls64(x)
|
||||
|
||||
/*
|
||||
* ffs: find first bit set. This is defined the same way as the libc and compiler builtin
|
||||
|
@ -465,6 +465,7 @@ static __inline__ unsigned long __ffs(unsigned long word)
|
||||
* fls: find last bit set.
|
||||
*/
|
||||
#define fls(x) generic_fls(x)
|
||||
#define fls64(x) generic_fls64(x)
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
|
@ -310,6 +310,7 @@ static inline int fls(int x)
|
||||
|
||||
return 32 - cnt;
|
||||
}
|
||||
#define fls64(x) generic_fls64(x)
|
||||
|
||||
/*
|
||||
* Every architecture must define this function. It's the fastest
|
||||
|
@ -499,5 +499,6 @@ found_middle:
|
||||
* fls: find last bit set.
|
||||
*/
|
||||
#define fls(x) generic_fls(x)
|
||||
#define fls64(x) generic_fls64(x)
|
||||
|
||||
#endif /* _M68KNOMMU_BITOPS_H */
|
||||
|
@ -695,7 +695,7 @@ static inline unsigned long fls(unsigned long word)
|
||||
|
||||
return flz(~word) + 1;
|
||||
}
|
||||
|
||||
#define fls64(x) generic_fls64(x)
|
||||
|
||||
/*
|
||||
* find_next_zero_bit - find the first zero bit in a memory region
|
||||
|
@ -263,6 +263,7 @@ static __inline__ int fls(int x)
|
||||
|
||||
return ret;
|
||||
}
|
||||
#define fls64(x) generic_fls64(x)
|
||||
|
||||
/*
|
||||
* hweightN: returns the hamming weight (i.e. the number
|
||||
|
@ -310,6 +310,7 @@ static __inline__ int fls(unsigned int x)
|
||||
asm ("cntlzw %0,%1" : "=r" (lz) : "r" (x));
|
||||
return 32 - lz;
|
||||
}
|
||||
#define fls64(x) generic_fls64(x)
|
||||
|
||||
/*
|
||||
* hweightN: returns the hamming weight (i.e. the number
|
||||
|
@ -839,6 +839,7 @@ static inline int sched_find_first_bit(unsigned long *b)
|
||||
* fls: find last bit set.
|
||||
*/
|
||||
#define fls(x) generic_fls(x)
|
||||
#define fls64(x) generic_fls64(x)
|
||||
|
||||
/*
|
||||
* hweightN: returns the hamming weight (i.e. the number
|
||||
|
@ -470,6 +470,7 @@ found_middle:
|
||||
*/
|
||||
|
||||
#define fls(x) generic_fls(x)
|
||||
#define fls64(x) generic_fls64(x)
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
|
@ -510,6 +510,7 @@ found_middle:
|
||||
|
||||
#define ffs(x) generic_ffs(x)
|
||||
#define fls(x) generic_fls(x)
|
||||
#define fls64(x) generic_fls64(x)
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
|
@ -298,6 +298,7 @@ static inline int ffs(int x)
|
||||
* Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
|
||||
*/
|
||||
#define fls(x) generic_fls(x)
|
||||
#define fls64(x) generic_fls64(x)
|
||||
|
||||
/*
|
||||
* hweightN: returns the hamming weight (i.e. the number
|
||||
|
@ -119,6 +119,7 @@ static inline unsigned long __ffs(unsigned long word)
|
||||
*/
|
||||
|
||||
#define fls(x) generic_fls(x)
|
||||
#define fls64(x) generic_fls64(x)
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
|
@ -276,6 +276,7 @@ found_middle:
|
||||
|
||||
#define ffs(x) generic_ffs (x)
|
||||
#define fls(x) generic_fls (x)
|
||||
#define fls64(x) generic_fls64(x)
|
||||
#define __ffs(x) ffs(x)
|
||||
|
||||
|
||||
|
@ -340,6 +340,20 @@ static __inline__ unsigned long __ffs(unsigned long word)
|
||||
return word;
|
||||
}
|
||||
|
||||
/*
|
||||
* __fls: find last bit set.
|
||||
* @word: The word to search
|
||||
*
|
||||
* Undefined if no zero exists, so code should check against ~0UL first.
|
||||
*/
|
||||
static __inline__ unsigned long __fls(unsigned long word)
|
||||
{
|
||||
__asm__("bsrq %1,%0"
|
||||
:"=r" (word)
|
||||
:"rm" (word));
|
||||
return word;
|
||||
}
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
static inline int sched_find_first_bit(const unsigned long *b)
|
||||
@ -369,6 +383,19 @@ static __inline__ int ffs(int x)
|
||||
return r+1;
|
||||
}
|
||||
|
||||
/**
|
||||
* fls64 - find last bit set in 64 bit word
|
||||
* @x: the word to search
|
||||
*
|
||||
* This is defined the same way as fls.
|
||||
*/
|
||||
static __inline__ int fls64(__u64 x)
|
||||
{
|
||||
if (x == 0)
|
||||
return 0;
|
||||
return __fls(x) + 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* hweightN - returns the hamming weight of a N-bit word
|
||||
* @x: the word to weigh
|
||||
|
@ -245,6 +245,7 @@ static __inline__ int fls (unsigned int x)
|
||||
{
|
||||
return __cntlz(x);
|
||||
}
|
||||
#define fls64(x) generic_fls64(x)
|
||||
|
||||
static __inline__ int
|
||||
find_next_bit(const unsigned long *addr, int size, int offset)
|
||||
|
@ -76,6 +76,15 @@ static __inline__ int generic_fls(int x)
|
||||
*/
|
||||
#include <asm/bitops.h>
|
||||
|
||||
|
||||
static inline int generic_fls64(__u64 x)
|
||||
{
|
||||
__u32 h = x >> 32;
|
||||
if (h)
|
||||
return fls(x) + 32;
|
||||
return fls(x);
|
||||
}
|
||||
|
||||
static __inline__ int get_bitmask_order(unsigned int count)
|
||||
{
|
||||
int order;
|
||||
|
@ -192,10 +192,9 @@ enum {
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
#include <net/inet_connection_sock.h>
|
||||
#include <net/inet_sock.h>
|
||||
#include <net/inet_timewait_sock.h>
|
||||
#include <net/sock.h>
|
||||
#include <net/tcp_states.h>
|
||||
#include <net/tcp.h>
|
||||
|
||||
enum dccp_state {
|
||||
DCCP_OPEN = TCP_ESTABLISHED,
|
||||
@ -408,8 +407,6 @@ struct dccp_ackvec;
|
||||
* @dccps_gar - greatest valid ack number received on a non-Sync; initialized to %dccps_iss
|
||||
* @dccps_timestamp_time - time of latest TIMESTAMP option
|
||||
* @dccps_timestamp_echo - latest timestamp received on a TIMESTAMP option
|
||||
* @dccps_ext_header_len - network protocol overhead (IP/IPv6 options)
|
||||
* @dccps_pmtu_cookie - Last pmtu seen by socket
|
||||
* @dccps_packet_size - Set thru setsockopt
|
||||
* @dccps_role - Role of this sock, one of %dccp_role
|
||||
* @dccps_ndp_count - number of Non Data Packets since last data packet
|
||||
@ -434,8 +431,6 @@ struct dccp_sock {
|
||||
__u32 dccps_timestamp_echo;
|
||||
__u32 dccps_packet_size;
|
||||
unsigned long dccps_ndp_count;
|
||||
__u16 dccps_ext_header_len;
|
||||
__u32 dccps_pmtu_cookie;
|
||||
__u32 dccps_mss_cache;
|
||||
struct dccp_options dccps_options;
|
||||
struct dccp_ackvec *dccps_hc_rx_ackvec;
|
||||
|
@ -63,10 +63,11 @@ static inline int is_zero_ether_addr(const u8 *addr)
|
||||
* @addr: Pointer to a six-byte array containing the Ethernet address
|
||||
*
|
||||
* Return true if the address is a multicast address.
|
||||
* By definition the broadcast address is also a multicast address.
|
||||
*/
|
||||
static inline int is_multicast_ether_addr(const u8 *addr)
|
||||
{
|
||||
return ((addr[0] != 0xff) && (0x01 & addr[0]));
|
||||
return (0x01 & addr[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -157,8 +157,7 @@ struct pppox_proto {
|
||||
extern int register_pppox_proto(int proto_num, struct pppox_proto *pp);
|
||||
extern void unregister_pppox_proto(int proto_num);
|
||||
extern void pppox_unbind_sock(struct sock *sk);/* delete ppp-channel binding */
|
||||
extern int pppox_channel_ioctl(struct ppp_channel *pc, unsigned int cmd,
|
||||
unsigned long arg);
|
||||
extern int pppox_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
|
||||
|
||||
/* PPPoX socket states */
|
||||
enum {
|
||||
|
@ -16,6 +16,7 @@
|
||||
*/
|
||||
#ifndef _LINUX_IP_H
|
||||
#define _LINUX_IP_H
|
||||
#include <linux/types.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
#define IPTOS_TOS_MASK 0x1E
|
||||
@ -78,126 +79,6 @@
|
||||
#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */
|
||||
#define IPOPT_TS_PRESPEC 3 /* specified modules only */
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/config.h>
|
||||
#include <linux/types.h>
|
||||
#include <net/request_sock.h>
|
||||
#include <net/sock.h>
|
||||
#include <linux/igmp.h>
|
||||
#include <net/flow.h>
|
||||
|
||||
struct ip_options {
|
||||
__u32 faddr; /* Saved first hop address */
|
||||
unsigned char optlen;
|
||||
unsigned char srr;
|
||||
unsigned char rr;
|
||||
unsigned char ts;
|
||||
unsigned char is_setbyuser:1, /* Set by setsockopt? */
|
||||
is_data:1, /* Options in __data, rather than skb */
|
||||
is_strictroute:1, /* Strict source route */
|
||||
srr_is_hit:1, /* Packet destination addr was our one */
|
||||
is_changed:1, /* IP checksum more not valid */
|
||||
rr_needaddr:1, /* Need to record addr of outgoing dev */
|
||||
ts_needtime:1, /* Need to record timestamp */
|
||||
ts_needaddr:1; /* Need to record addr of outgoing dev */
|
||||
unsigned char router_alert;
|
||||
unsigned char __pad1;
|
||||
unsigned char __pad2;
|
||||
unsigned char __data[0];
|
||||
};
|
||||
|
||||
#define optlength(opt) (sizeof(struct ip_options) + opt->optlen)
|
||||
|
||||
struct inet_request_sock {
|
||||
struct request_sock req;
|
||||
u32 loc_addr;
|
||||
u32 rmt_addr;
|
||||
u16 rmt_port;
|
||||
u16 snd_wscale : 4,
|
||||
rcv_wscale : 4,
|
||||
tstamp_ok : 1,
|
||||
sack_ok : 1,
|
||||
wscale_ok : 1,
|
||||
ecn_ok : 1,
|
||||
acked : 1;
|
||||
struct ip_options *opt;
|
||||
};
|
||||
|
||||
static inline struct inet_request_sock *inet_rsk(const struct request_sock *sk)
|
||||
{
|
||||
return (struct inet_request_sock *)sk;
|
||||
}
|
||||
|
||||
struct ipv6_pinfo;
|
||||
|
||||
struct inet_sock {
|
||||
/* sk and pinet6 has to be the first two members of inet_sock */
|
||||
struct sock sk;
|
||||
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
|
||||
struct ipv6_pinfo *pinet6;
|
||||
#endif
|
||||
/* Socket demultiplex comparisons on incoming packets. */
|
||||
__u32 daddr; /* Foreign IPv4 addr */
|
||||
__u32 rcv_saddr; /* Bound local IPv4 addr */
|
||||
__u16 dport; /* Destination port */
|
||||
__u16 num; /* Local port */
|
||||
__u32 saddr; /* Sending source */
|
||||
__s16 uc_ttl; /* Unicast TTL */
|
||||
__u16 cmsg_flags;
|
||||
struct ip_options *opt;
|
||||
__u16 sport; /* Source port */
|
||||
__u16 id; /* ID counter for DF pkts */
|
||||
__u8 tos; /* TOS */
|
||||
__u8 mc_ttl; /* Multicasting TTL */
|
||||
__u8 pmtudisc;
|
||||
unsigned recverr : 1,
|
||||
freebind : 1,
|
||||
hdrincl : 1,
|
||||
mc_loop : 1;
|
||||
int mc_index; /* Multicast device index */
|
||||
__u32 mc_addr;
|
||||
struct ip_mc_socklist *mc_list; /* Group array */
|
||||
/*
|
||||
* Following members are used to retain the infomation to build
|
||||
* an ip header on each ip fragmentation while the socket is corked.
|
||||
*/
|
||||
struct {
|
||||
unsigned int flags;
|
||||
unsigned int fragsize;
|
||||
struct ip_options *opt;
|
||||
struct rtable *rt;
|
||||
int length; /* Total length of all frames */
|
||||
u32 addr;
|
||||
struct flowi fl;
|
||||
} cork;
|
||||
};
|
||||
|
||||
#define IPCORK_OPT 1 /* ip-options has been held in ipcork.opt */
|
||||
#define IPCORK_ALLFRAG 2 /* always fragment (for ipv6 for now) */
|
||||
|
||||
static inline struct inet_sock *inet_sk(const struct sock *sk)
|
||||
{
|
||||
return (struct inet_sock *)sk;
|
||||
}
|
||||
|
||||
static inline void __inet_sk_copy_descendant(struct sock *sk_to,
|
||||
const struct sock *sk_from,
|
||||
const int ancestor_size)
|
||||
{
|
||||
memcpy(inet_sk(sk_to) + 1, inet_sk(sk_from) + 1,
|
||||
sk_from->sk_prot->obj_size - ancestor_size);
|
||||
}
|
||||
#if !(defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE))
|
||||
static inline void inet_sk_copy_descendant(struct sock *sk_to,
|
||||
const struct sock *sk_from)
|
||||
{
|
||||
__inet_sk_copy_descendant(sk_to, sk_from, sizeof(struct inet_sock));
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
extern int inet_sk_rebuild_header(struct sock *sk);
|
||||
|
||||
struct iphdr {
|
||||
#if defined(__LITTLE_ENDIAN_BITFIELD)
|
||||
__u8 ihl:4,
|
||||
|
@ -171,12 +171,13 @@ enum {
|
||||
};
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/in6.h> /* struct sockaddr_in6 */
|
||||
#include <linux/icmpv6.h>
|
||||
#include <net/if_inet6.h> /* struct ipv6_mc_socklist */
|
||||
#include <linux/tcp.h>
|
||||
#include <linux/udp.h>
|
||||
|
||||
#include <net/if_inet6.h> /* struct ipv6_mc_socklist */
|
||||
#include <net/inet_sock.h>
|
||||
|
||||
/*
|
||||
This structure contains results of exthdrs parsing
|
||||
as offsets from skb->nh.
|
||||
@ -199,18 +200,17 @@ static inline int inet6_iif(const struct sk_buff *skb)
|
||||
return IP6CB(skb)->iif;
|
||||
}
|
||||
|
||||
struct tcp6_request_sock {
|
||||
struct tcp_request_sock req;
|
||||
struct inet6_request_sock {
|
||||
struct in6_addr loc_addr;
|
||||
struct in6_addr rmt_addr;
|
||||
struct sk_buff *pktopts;
|
||||
int iif;
|
||||
};
|
||||
|
||||
static inline struct tcp6_request_sock *tcp6_rsk(const struct request_sock *sk)
|
||||
{
|
||||
return (struct tcp6_request_sock *)sk;
|
||||
}
|
||||
struct tcp6_request_sock {
|
||||
struct tcp_request_sock tcp6rsk_tcp;
|
||||
struct inet6_request_sock tcp6rsk_inet6;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ipv6_pinfo - ipv6 private area
|
||||
@ -298,12 +298,36 @@ struct tcp6_sock {
|
||||
struct ipv6_pinfo inet6;
|
||||
};
|
||||
|
||||
extern int inet6_sk_rebuild_header(struct sock *sk);
|
||||
|
||||
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
|
||||
static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
|
||||
{
|
||||
return inet_sk(__sk)->pinet6;
|
||||
}
|
||||
|
||||
static inline struct inet6_request_sock *
|
||||
inet6_rsk(const struct request_sock *rsk)
|
||||
{
|
||||
return (struct inet6_request_sock *)(((u8 *)rsk) +
|
||||
inet_rsk(rsk)->inet6_rsk_offset);
|
||||
}
|
||||
|
||||
static inline u32 inet6_rsk_offset(struct request_sock *rsk)
|
||||
{
|
||||
return rsk->rsk_ops->obj_size - sizeof(struct inet6_request_sock);
|
||||
}
|
||||
|
||||
static inline struct request_sock *inet6_reqsk_alloc(struct request_sock_ops *ops)
|
||||
{
|
||||
struct request_sock *req = reqsk_alloc(ops);
|
||||
|
||||
if (req != NULL)
|
||||
inet_rsk(req)->inet6_rsk_offset = inet6_rsk_offset(req);
|
||||
|
||||
return req;
|
||||
}
|
||||
|
||||
static inline struct raw6_sock *raw6_sk(const struct sock *sk)
|
||||
{
|
||||
return (struct raw6_sock *)sk;
|
||||
@ -323,28 +347,37 @@ static inline void inet_sk_copy_descendant(struct sock *sk_to,
|
||||
#define __ipv6_only_sock(sk) (inet6_sk(sk)->ipv6only)
|
||||
#define ipv6_only_sock(sk) ((sk)->sk_family == PF_INET6 && __ipv6_only_sock(sk))
|
||||
|
||||
#include <linux/tcp.h>
|
||||
|
||||
struct tcp6_timewait_sock {
|
||||
struct tcp_timewait_sock tw_v6_sk;
|
||||
struct inet6_timewait_sock {
|
||||
struct in6_addr tw_v6_daddr;
|
||||
struct in6_addr tw_v6_rcv_saddr;
|
||||
};
|
||||
|
||||
static inline struct tcp6_timewait_sock *tcp6_twsk(const struct sock *sk)
|
||||
struct tcp6_timewait_sock {
|
||||
struct tcp_timewait_sock tcp6tw_tcp;
|
||||
struct inet6_timewait_sock tcp6tw_inet6;
|
||||
};
|
||||
|
||||
static inline u16 inet6_tw_offset(const struct proto *prot)
|
||||
{
|
||||
return (struct tcp6_timewait_sock *)sk;
|
||||
return prot->twsk_prot->twsk_obj_size -
|
||||
sizeof(struct inet6_timewait_sock);
|
||||
}
|
||||
|
||||
static inline struct in6_addr *__tcp_v6_rcv_saddr(const struct sock *sk)
|
||||
static inline struct inet6_timewait_sock *inet6_twsk(const struct sock *sk)
|
||||
{
|
||||
return (struct inet6_timewait_sock *)(((u8 *)sk) +
|
||||
inet_twsk(sk)->tw_ipv6_offset);
|
||||
}
|
||||
|
||||
static inline struct in6_addr *__inet6_rcv_saddr(const struct sock *sk)
|
||||
{
|
||||
return likely(sk->sk_state != TCP_TIME_WAIT) ?
|
||||
&inet6_sk(sk)->rcv_saddr : &tcp6_twsk(sk)->tw_v6_rcv_saddr;
|
||||
&inet6_sk(sk)->rcv_saddr : &inet6_twsk(sk)->tw_v6_rcv_saddr;
|
||||
}
|
||||
|
||||
static inline struct in6_addr *tcp_v6_rcv_saddr(const struct sock *sk)
|
||||
static inline struct in6_addr *inet6_rcv_saddr(const struct sock *sk)
|
||||
{
|
||||
return sk->sk_family == AF_INET6 ? __tcp_v6_rcv_saddr(sk) : NULL;
|
||||
return sk->sk_family == AF_INET6 ? __inet6_rcv_saddr(sk) : NULL;
|
||||
}
|
||||
|
||||
static inline int inet_v6_ipv6only(const struct sock *sk)
|
||||
@ -361,13 +394,19 @@ static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct inet6_request_sock *
|
||||
inet6_rsk(const struct request_sock *rsk)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct raw6_sock *raw6_sk(const struct sock *sk)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#define __tcp_v6_rcv_saddr(__sk) NULL
|
||||
#define tcp_v6_rcv_saddr(__sk) NULL
|
||||
#define __inet6_rcv_saddr(__sk) NULL
|
||||
#define inet6_rcv_saddr(__sk) NULL
|
||||
#define tcp_twsk_ipv6only(__sk) 0
|
||||
#define inet_v6_ipv6only(__sk) 0
|
||||
#endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */
|
||||
|
@ -107,7 +107,7 @@ enum sock_type {
|
||||
struct socket {
|
||||
socket_state state;
|
||||
unsigned long flags;
|
||||
struct proto_ops *ops;
|
||||
const struct proto_ops *ops;
|
||||
struct fasync_struct *fasync_list;
|
||||
struct file *file;
|
||||
struct sock *sk;
|
||||
@ -260,7 +260,7 @@ SOCKCALL_WRAP(name, recvmsg, (struct kiocb *iocb, struct socket *sock, struct ms
|
||||
SOCKCALL_WRAP(name, mmap, (struct file *file, struct socket *sock, struct vm_area_struct *vma), \
|
||||
(file, sock, vma)) \
|
||||
\
|
||||
static struct proto_ops name##_ops = { \
|
||||
static const struct proto_ops name##_ops = { \
|
||||
.family = fam, \
|
||||
.owner = THIS_MODULE, \
|
||||
.release = __lock_##name##_release, \
|
||||
|
@ -216,6 +216,16 @@ struct sadb_x_nat_t_port {
|
||||
} __attribute__((packed));
|
||||
/* sizeof(struct sadb_x_nat_t_port) == 8 */
|
||||
|
||||
/* Generic LSM security context */
|
||||
struct sadb_x_sec_ctx {
|
||||
uint16_t sadb_x_sec_len;
|
||||
uint16_t sadb_x_sec_exttype;
|
||||
uint8_t sadb_x_ctx_alg; /* LSMs: e.g., selinux == 1 */
|
||||
uint8_t sadb_x_ctx_doi;
|
||||
uint16_t sadb_x_ctx_len;
|
||||
} __attribute__((packed));
|
||||
/* sizeof(struct sadb_sec_ctx) = 8 */
|
||||
|
||||
/* Message types */
|
||||
#define SADB_RESERVED 0
|
||||
#define SADB_GETSPI 1
|
||||
@ -325,7 +335,8 @@ struct sadb_x_nat_t_port {
|
||||
#define SADB_X_EXT_NAT_T_SPORT 21
|
||||
#define SADB_X_EXT_NAT_T_DPORT 22
|
||||
#define SADB_X_EXT_NAT_T_OA 23
|
||||
#define SADB_EXT_MAX 23
|
||||
#define SADB_X_EXT_SEC_CTX 24
|
||||
#define SADB_EXT_MAX 24
|
||||
|
||||
/* Identity Extension values */
|
||||
#define SADB_IDENTTYPE_RESERVED 0
|
||||
|
@ -429,6 +429,7 @@ enum
|
||||
TCA_NETEM_CORR,
|
||||
TCA_NETEM_DELAY_DIST,
|
||||
TCA_NETEM_REORDER,
|
||||
TCA_NETEM_CORRUPT,
|
||||
__TCA_NETEM_MAX,
|
||||
};
|
||||
|
||||
@ -457,6 +458,12 @@ struct tc_netem_reorder
|
||||
__u32 correlation;
|
||||
};
|
||||
|
||||
struct tc_netem_corrupt
|
||||
{
|
||||
__u32 probability;
|
||||
__u32 correlation;
|
||||
};
|
||||
|
||||
#define NETEM_DIST_SCALE 8192
|
||||
|
||||
#endif
|
||||
|
@ -52,8 +52,8 @@ extern void get_random_bytes(void *buf, int nbytes);
|
||||
void generate_random_uuid(unsigned char uuid_out[16]);
|
||||
|
||||
extern __u32 secure_ip_id(__u32 daddr);
|
||||
extern u32 secure_tcp_port_ephemeral(__u32 saddr, __u32 daddr, __u16 dport);
|
||||
extern u32 secure_tcpv6_port_ephemeral(const __u32 *saddr, const __u32 *daddr,
|
||||
extern u32 secure_ipv4_port_ephemeral(__u32 saddr, __u32 daddr, __u16 dport);
|
||||
extern u32 secure_ipv6_port_ephemeral(const __u32 *saddr, const __u32 *daddr,
|
||||
__u16 dport);
|
||||
extern __u32 secure_tcp_sequence_number(__u32 saddr, __u32 daddr,
|
||||
__u16 sport, __u16 dport);
|
||||
|
@ -59,6 +59,12 @@ struct sk_buff;
|
||||
struct sock;
|
||||
struct sockaddr;
|
||||
struct socket;
|
||||
struct flowi;
|
||||
struct dst_entry;
|
||||
struct xfrm_selector;
|
||||
struct xfrm_policy;
|
||||
struct xfrm_state;
|
||||
struct xfrm_user_sec_ctx;
|
||||
|
||||
extern int cap_netlink_send(struct sock *sk, struct sk_buff *skb);
|
||||
extern int cap_netlink_recv(struct sk_buff *skb);
|
||||
@ -788,6 +794,52 @@ struct swap_info_struct;
|
||||
* which is used to copy security attributes between local stream sockets.
|
||||
* @sk_free_security:
|
||||
* Deallocate security structure.
|
||||
* @sk_getsid:
|
||||
* Retrieve the LSM-specific sid for the sock to enable caching of network
|
||||
* authorizations.
|
||||
*
|
||||
* Security hooks for XFRM operations.
|
||||
*
|
||||
* @xfrm_policy_alloc_security:
|
||||
* @xp contains the xfrm_policy being added to Security Policy Database
|
||||
* used by the XFRM system.
|
||||
* @sec_ctx contains the security context information being provided by
|
||||
* the user-level policy update program (e.g., setkey).
|
||||
* Allocate a security structure to the xp->selector.security field.
|
||||
* The security field is initialized to NULL when the xfrm_policy is
|
||||
* allocated.
|
||||
* Return 0 if operation was successful (memory to allocate, legal context)
|
||||
* @xfrm_policy_clone_security:
|
||||
* @old contains an existing xfrm_policy in the SPD.
|
||||
* @new contains a new xfrm_policy being cloned from old.
|
||||
* Allocate a security structure to the new->selector.security field
|
||||
* that contains the information from the old->selector.security field.
|
||||
* Return 0 if operation was successful (memory to allocate).
|
||||
* @xfrm_policy_free_security:
|
||||
* @xp contains the xfrm_policy
|
||||
* Deallocate xp->selector.security.
|
||||
* @xfrm_state_alloc_security:
|
||||
* @x contains the xfrm_state being added to the Security Association
|
||||
* Database by the XFRM system.
|
||||
* @sec_ctx contains the security context information being provided by
|
||||
* the user-level SA generation program (e.g., setkey or racoon).
|
||||
* Allocate a security structure to the x->sel.security field. The
|
||||
* security field is initialized to NULL when the xfrm_state is
|
||||
* allocated.
|
||||
* Return 0 if operation was successful (memory to allocate, legal context).
|
||||
* @xfrm_state_free_security:
|
||||
* @x contains the xfrm_state.
|
||||
* Deallocate x>sel.security.
|
||||
* @xfrm_policy_lookup:
|
||||
* @xp contains the xfrm_policy for which the access control is being
|
||||
* checked.
|
||||
* @sk_sid contains the sock security label that is used to authorize
|
||||
* access to the policy xp.
|
||||
* @dir contains the direction of the flow (input or output).
|
||||
* Check permission when a sock selects a xfrm_policy for processing
|
||||
* XFRMs on a packet. The hook is called when selecting either a
|
||||
* per-socket policy or a generic xfrm policy.
|
||||
* Return 0 if permission is granted.
|
||||
*
|
||||
* Security hooks affecting all Key Management operations
|
||||
*
|
||||
@ -1237,8 +1289,18 @@ struct security_operations {
|
||||
int (*socket_getpeersec) (struct socket *sock, char __user *optval, int __user *optlen, unsigned len);
|
||||
int (*sk_alloc_security) (struct sock *sk, int family, gfp_t priority);
|
||||
void (*sk_free_security) (struct sock *sk);
|
||||
unsigned int (*sk_getsid) (struct sock *sk, struct flowi *fl, u8 dir);
|
||||
#endif /* CONFIG_SECURITY_NETWORK */
|
||||
|
||||
#ifdef CONFIG_SECURITY_NETWORK_XFRM
|
||||
int (*xfrm_policy_alloc_security) (struct xfrm_policy *xp, struct xfrm_user_sec_ctx *sec_ctx);
|
||||
int (*xfrm_policy_clone_security) (struct xfrm_policy *old, struct xfrm_policy *new);
|
||||
void (*xfrm_policy_free_security) (struct xfrm_policy *xp);
|
||||
int (*xfrm_state_alloc_security) (struct xfrm_state *x, struct xfrm_user_sec_ctx *sec_ctx);
|
||||
void (*xfrm_state_free_security) (struct xfrm_state *x);
|
||||
int (*xfrm_policy_lookup)(struct xfrm_policy *xp, u32 sk_sid, u8 dir);
|
||||
#endif /* CONFIG_SECURITY_NETWORK_XFRM */
|
||||
|
||||
/* key management security hooks */
|
||||
#ifdef CONFIG_KEYS
|
||||
int (*key_alloc)(struct key *key);
|
||||
@ -2679,6 +2741,11 @@ static inline void security_sk_free(struct sock *sk)
|
||||
{
|
||||
return security_ops->sk_free_security(sk);
|
||||
}
|
||||
|
||||
static inline unsigned int security_sk_sid(struct sock *sk, struct flowi *fl, u8 dir)
|
||||
{
|
||||
return security_ops->sk_getsid(sk, fl, dir);
|
||||
}
|
||||
#else /* CONFIG_SECURITY_NETWORK */
|
||||
static inline int security_unix_stream_connect(struct socket * sock,
|
||||
struct socket * other,
|
||||
@ -2795,8 +2862,73 @@ static inline int security_sk_alloc(struct sock *sk, int family, gfp_t priority)
|
||||
static inline void security_sk_free(struct sock *sk)
|
||||
{
|
||||
}
|
||||
|
||||
static inline unsigned int security_sk_sid(struct sock *sk, struct flowi *fl, u8 dir)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_SECURITY_NETWORK */
|
||||
|
||||
#ifdef CONFIG_SECURITY_NETWORK_XFRM
|
||||
static inline int security_xfrm_policy_alloc(struct xfrm_policy *xp, struct xfrm_user_sec_ctx *sec_ctx)
|
||||
{
|
||||
return security_ops->xfrm_policy_alloc_security(xp, sec_ctx);
|
||||
}
|
||||
|
||||
static inline int security_xfrm_policy_clone(struct xfrm_policy *old, struct xfrm_policy *new)
|
||||
{
|
||||
return security_ops->xfrm_policy_clone_security(old, new);
|
||||
}
|
||||
|
||||
static inline void security_xfrm_policy_free(struct xfrm_policy *xp)
|
||||
{
|
||||
security_ops->xfrm_policy_free_security(xp);
|
||||
}
|
||||
|
||||
static inline int security_xfrm_state_alloc(struct xfrm_state *x, struct xfrm_user_sec_ctx *sec_ctx)
|
||||
{
|
||||
return security_ops->xfrm_state_alloc_security(x, sec_ctx);
|
||||
}
|
||||
|
||||
static inline void security_xfrm_state_free(struct xfrm_state *x)
|
||||
{
|
||||
security_ops->xfrm_state_free_security(x);
|
||||
}
|
||||
|
||||
static inline int security_xfrm_policy_lookup(struct xfrm_policy *xp, u32 sk_sid, u8 dir)
|
||||
{
|
||||
return security_ops->xfrm_policy_lookup(xp, sk_sid, dir);
|
||||
}
|
||||
#else /* CONFIG_SECURITY_NETWORK_XFRM */
|
||||
static inline int security_xfrm_policy_alloc(struct xfrm_policy *xp, struct xfrm_user_sec_ctx *sec_ctx)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int security_xfrm_policy_clone(struct xfrm_policy *old, struct xfrm_policy *new)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void security_xfrm_policy_free(struct xfrm_policy *xp)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int security_xfrm_state_alloc(struct xfrm_state *x, struct xfrm_user_sec_ctx *sec_ctx)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void security_xfrm_state_free(struct xfrm_state *x)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int security_xfrm_policy_lookup(struct xfrm_policy *xp, u32 sk_sid, u8 dir)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_SECURITY_NETWORK_XFRM */
|
||||
|
||||
#ifdef CONFIG_KEYS
|
||||
#ifdef CONFIG_SECURITY
|
||||
static inline int security_key_alloc(struct key *key)
|
||||
|
@ -32,7 +32,6 @@
|
||||
|
||||
#define HAVE_ALLOC_SKB /* For the drivers to know */
|
||||
#define HAVE_ALIGNABLE_SKB /* Ditto 8) */
|
||||
#define SLAB_SKB /* Slabified skbuffs */
|
||||
|
||||
#define CHECKSUM_NONE 0
|
||||
#define CHECKSUM_HW 1
|
||||
@ -134,7 +133,7 @@ struct skb_frag_struct {
|
||||
*/
|
||||
struct skb_shared_info {
|
||||
atomic_t dataref;
|
||||
unsigned int nr_frags;
|
||||
unsigned short nr_frags;
|
||||
unsigned short tso_size;
|
||||
unsigned short tso_segs;
|
||||
unsigned short ufo_size;
|
||||
@ -1239,6 +1238,8 @@ extern int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb,
|
||||
int hlen,
|
||||
struct iovec *iov);
|
||||
extern void skb_free_datagram(struct sock *sk, struct sk_buff *skb);
|
||||
extern void skb_kill_datagram(struct sock *sk, struct sk_buff *skb,
|
||||
unsigned int flags);
|
||||
extern unsigned int skb_checksum(const struct sk_buff *skb, int offset,
|
||||
int len, unsigned int csum);
|
||||
extern int skb_copy_bits(const struct sk_buff *skb, int offset,
|
||||
|
@ -27,7 +27,6 @@ struct __kernel_sockaddr_storage {
|
||||
#include <linux/compiler.h> /* __user */
|
||||
|
||||
extern int sysctl_somaxconn;
|
||||
extern void sock_init(void);
|
||||
#ifdef CONFIG_PROC_FS
|
||||
struct seq_file;
|
||||
extern void socket_seq_show(struct seq_file *seq);
|
||||
|
@ -390,6 +390,7 @@ enum
|
||||
NET_IPV4_ICMP_ERRORS_USE_INBOUND_IFADDR=109,
|
||||
NET_TCP_CONG_CONTROL=110,
|
||||
NET_TCP_ABC=111,
|
||||
NET_IPV4_IPFRAG_MAX_DIST=112,
|
||||
};
|
||||
|
||||
enum {
|
||||
|
@ -55,22 +55,6 @@ struct tcphdr {
|
||||
__u16 urg_ptr;
|
||||
};
|
||||
|
||||
#define TCP_ACTION_FIN (1 << 7)
|
||||
|
||||
enum {
|
||||
TCPF_ESTABLISHED = (1 << 1),
|
||||
TCPF_SYN_SENT = (1 << 2),
|
||||
TCPF_SYN_RECV = (1 << 3),
|
||||
TCPF_FIN_WAIT1 = (1 << 4),
|
||||
TCPF_FIN_WAIT2 = (1 << 5),
|
||||
TCPF_TIME_WAIT = (1 << 6),
|
||||
TCPF_CLOSE = (1 << 7),
|
||||
TCPF_CLOSE_WAIT = (1 << 8),
|
||||
TCPF_LAST_ACK = (1 << 9),
|
||||
TCPF_LISTEN = (1 << 10),
|
||||
TCPF_CLOSING = (1 << 11)
|
||||
};
|
||||
|
||||
/*
|
||||
* The union cast uses a gcc extension to avoid aliasing problems
|
||||
* (union is compatible to any of its members)
|
||||
@ -254,10 +238,9 @@ struct tcp_sock {
|
||||
__u32 snd_wl1; /* Sequence for window update */
|
||||
__u32 snd_wnd; /* The window we expect to receive */
|
||||
__u32 max_window; /* Maximal window ever seen from peer */
|
||||
__u32 pmtu_cookie; /* Last pmtu seen by socket */
|
||||
__u32 mss_cache; /* Cached effective mss, not including SACKS */
|
||||
__u16 xmit_size_goal; /* Goal for segmenting output packets */
|
||||
__u16 ext_header_len; /* Network protocol overhead (IP/IPv6 options) */
|
||||
/* XXX Two bytes hole, try to pack */
|
||||
|
||||
__u32 window_clamp; /* Maximal window to advertise */
|
||||
__u32 rcv_ssthresh; /* Current window clamp */
|
||||
@ -295,8 +278,6 @@ struct tcp_sock {
|
||||
|
||||
struct sk_buff_head out_of_order_queue; /* Out of order segments go here */
|
||||
|
||||
struct tcp_func *af_specific; /* Operations which are AF_INET{4,6} specific */
|
||||
|
||||
__u32 rcv_wnd; /* Current receiver window */
|
||||
__u32 rcv_wup; /* rcv_nxt on last window update sent */
|
||||
__u32 write_seq; /* Tail(+1) of data held in tcp send buffer */
|
||||
|
@ -35,10 +35,10 @@ struct udphdr {
|
||||
#define UDP_ENCAP_ESPINUDP 2 /* draft-ietf-ipsec-udp-encaps-06 */
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <net/sock.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <net/inet_sock.h>
|
||||
|
||||
struct udp_sock {
|
||||
/* inet_sock has to be the first member */
|
||||
|
@ -27,6 +27,22 @@ struct xfrm_id
|
||||
__u8 proto;
|
||||
};
|
||||
|
||||
struct xfrm_sec_ctx {
|
||||
__u8 ctx_doi;
|
||||
__u8 ctx_alg;
|
||||
__u16 ctx_len;
|
||||
__u32 ctx_sid;
|
||||
char ctx_str[0];
|
||||
};
|
||||
|
||||
/* Security Context Domains of Interpretation */
|
||||
#define XFRM_SC_DOI_RESERVED 0
|
||||
#define XFRM_SC_DOI_LSM 1
|
||||
|
||||
/* Security Context Algorithms */
|
||||
#define XFRM_SC_ALG_RESERVED 0
|
||||
#define XFRM_SC_ALG_SELINUX 1
|
||||
|
||||
/* Selector, used as selector both on policy rules (SPD) and SAs. */
|
||||
|
||||
struct xfrm_selector
|
||||
@ -146,6 +162,18 @@ enum {
|
||||
|
||||
#define XFRM_NR_MSGTYPES (XFRM_MSG_MAX + 1 - XFRM_MSG_BASE)
|
||||
|
||||
/*
|
||||
* Generic LSM security context for comunicating to user space
|
||||
* NOTE: Same format as sadb_x_sec_ctx
|
||||
*/
|
||||
struct xfrm_user_sec_ctx {
|
||||
__u16 len;
|
||||
__u16 exttype;
|
||||
__u8 ctx_alg; /* LSMs: e.g., selinux == 1 */
|
||||
__u8 ctx_doi;
|
||||
__u16 ctx_len;
|
||||
};
|
||||
|
||||
struct xfrm_user_tmpl {
|
||||
struct xfrm_id id;
|
||||
__u16 family;
|
||||
@ -176,6 +204,7 @@ enum xfrm_attr_type_t {
|
||||
XFRMA_TMPL, /* 1 or more struct xfrm_user_tmpl */
|
||||
XFRMA_SA,
|
||||
XFRMA_POLICY,
|
||||
XFRMA_SEC_CTX, /* struct xfrm_sec_ctx */
|
||||
__XFRMA_MAX
|
||||
|
||||
#define XFRMA_MAX (__XFRMA_MAX - 1)
|
||||
|
@ -13,7 +13,7 @@ extern void unix_gc(void);
|
||||
#define UNIX_HASH_SIZE 256
|
||||
|
||||
extern struct hlist_head unix_socket_table[UNIX_HASH_SIZE + 1];
|
||||
extern rwlock_t unix_table_lock;
|
||||
extern spinlock_t unix_table_lock;
|
||||
|
||||
extern atomic_t unix_tot_inflight;
|
||||
|
||||
@ -58,10 +58,10 @@ struct unix_skb_parms {
|
||||
#define UNIXCB(skb) (*(struct unix_skb_parms*)&((skb)->cb))
|
||||
#define UNIXCREDS(skb) (&UNIXCB((skb)).creds)
|
||||
|
||||
#define unix_state_rlock(s) read_lock(&unix_sk(s)->lock)
|
||||
#define unix_state_runlock(s) read_unlock(&unix_sk(s)->lock)
|
||||
#define unix_state_wlock(s) write_lock(&unix_sk(s)->lock)
|
||||
#define unix_state_wunlock(s) write_unlock(&unix_sk(s)->lock)
|
||||
#define unix_state_rlock(s) spin_lock(&unix_sk(s)->lock)
|
||||
#define unix_state_runlock(s) spin_unlock(&unix_sk(s)->lock)
|
||||
#define unix_state_wlock(s) spin_lock(&unix_sk(s)->lock)
|
||||
#define unix_state_wunlock(s) spin_unlock(&unix_sk(s)->lock)
|
||||
|
||||
#ifdef __KERNEL__
|
||||
/* The AF_UNIX socket */
|
||||
@ -76,7 +76,7 @@ struct unix_sock {
|
||||
struct sock *other;
|
||||
struct sock *gc_tree;
|
||||
atomic_t inflight;
|
||||
rwlock_t lock;
|
||||
spinlock_t lock;
|
||||
wait_queue_head_t peer_wait;
|
||||
};
|
||||
#define unix_sk(__sk) ((struct unix_sock *)__sk)
|
||||
|
@ -7,7 +7,6 @@
|
||||
#define _ATMCLIP_H
|
||||
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/atm.h>
|
||||
#include <linux/atmdev.h>
|
||||
#include <linux/atmarp.h>
|
||||
@ -18,6 +17,7 @@
|
||||
#define CLIP_VCC(vcc) ((struct clip_vcc *) ((vcc)->user_back))
|
||||
#define NEIGH2ENTRY(neigh) ((struct atmarp_entry *) (neigh)->primary_key)
|
||||
|
||||
struct sk_buff;
|
||||
|
||||
struct clip_vcc {
|
||||
struct atm_vcc *vcc; /* VCC descriptor */
|
||||
|
@ -9,6 +9,7 @@
|
||||
#define _NET_DST_H
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/jiffies.h>
|
||||
|
@ -84,10 +84,11 @@ struct flowi {
|
||||
#define FLOW_DIR_OUT 1
|
||||
#define FLOW_DIR_FWD 2
|
||||
|
||||
typedef void (*flow_resolve_t)(struct flowi *key, u16 family, u8 dir,
|
||||
struct sock;
|
||||
typedef void (*flow_resolve_t)(struct flowi *key, u32 sk_sid, u16 family, u8 dir,
|
||||
void **objp, atomic_t **obj_refp);
|
||||
|
||||
extern void *flow_cache_lookup(struct flowi *key, u16 family, u8 dir,
|
||||
extern void *flow_cache_lookup(struct flowi *key, u32 sk_sid, u16 family, u8 dir,
|
||||
flow_resolve_t resolver);
|
||||
extern void flow_cache_flush(void);
|
||||
extern atomic_t flow_cache_genid;
|
||||
|
@ -60,7 +60,7 @@ struct genl_info
|
||||
*/
|
||||
struct genl_ops
|
||||
{
|
||||
unsigned int cmd;
|
||||
u8 cmd;
|
||||
unsigned int flags;
|
||||
struct nla_policy *policy;
|
||||
int (*doit)(struct sk_buff *skb,
|
||||
|
@ -20,12 +20,9 @@
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/icmp.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
#include <net/sock.h>
|
||||
#include <net/protocol.h>
|
||||
#include <net/inet_sock.h>
|
||||
#include <net/snmp.h>
|
||||
#include <linux/ip.h>
|
||||
|
||||
struct icmp_err {
|
||||
int errno;
|
||||
@ -38,6 +35,10 @@ DECLARE_SNMP_STAT(struct icmp_mib, icmp_statistics);
|
||||
#define ICMP_INC_STATS_BH(field) SNMP_INC_STATS_BH(icmp_statistics, field)
|
||||
#define ICMP_INC_STATS_USER(field) SNMP_INC_STATS_USER(icmp_statistics, field)
|
||||
|
||||
struct dst_entry;
|
||||
struct net_proto_family;
|
||||
struct sk_buff;
|
||||
|
||||
extern void icmp_send(struct sk_buff *skb_in, int type, int code, u32 info);
|
||||
extern int icmp_rcv(struct sk_buff *skb);
|
||||
extern int icmp_ioctl(struct sock *sk, int cmd, unsigned long arg);
|
||||
|
@ -23,12 +23,17 @@
|
||||
#ifndef IEEE80211_CRYPT_H
|
||||
#define IEEE80211_CRYPT_H
|
||||
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/list.h>
|
||||
#include <asm/atomic.h>
|
||||
|
||||
enum {
|
||||
IEEE80211_CRYPTO_TKIP_COUNTERMEASURES = (1 << 0),
|
||||
};
|
||||
|
||||
struct sk_buff;
|
||||
struct module;
|
||||
|
||||
struct ieee80211_crypto_ops {
|
||||
const char *name;
|
||||
struct list_head list;
|
||||
@ -87,6 +92,8 @@ struct ieee80211_crypt_data {
|
||||
atomic_t refcnt;
|
||||
};
|
||||
|
||||
struct ieee80211_device;
|
||||
|
||||
int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops);
|
||||
int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops);
|
||||
struct ieee80211_crypto_ops *ieee80211_get_crypto_ops(const char *name);
|
||||
|
42
include/net/inet6_connection_sock.h
Normal file
42
include/net/inet6_connection_sock.h
Normal file
@ -0,0 +1,42 @@
|
||||
/*
|
||||
* NET Generic infrastructure for INET6 connection oriented protocols.
|
||||
*
|
||||
* Authors: Many people, see the TCPv6 sources
|
||||
*
|
||||
* From code originally in TCPv6
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
#ifndef _INET6_CONNECTION_SOCK_H
|
||||
#define _INET6_CONNECTION_SOCK_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct in6_addr;
|
||||
struct inet_bind_bucket;
|
||||
struct request_sock;
|
||||
struct sk_buff;
|
||||
struct sock;
|
||||
struct sockaddr;
|
||||
|
||||
extern int inet6_csk_bind_conflict(const struct sock *sk,
|
||||
const struct inet_bind_bucket *tb);
|
||||
|
||||
extern struct request_sock *inet6_csk_search_req(const struct sock *sk,
|
||||
struct request_sock ***prevp,
|
||||
const __u16 rport,
|
||||
const struct in6_addr *raddr,
|
||||
const struct in6_addr *laddr,
|
||||
const int iif);
|
||||
|
||||
extern void inet6_csk_reqsk_queue_hash_add(struct sock *sk,
|
||||
struct request_sock *req,
|
||||
const unsigned long timeout);
|
||||
|
||||
extern void inet6_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr);
|
||||
|
||||
extern int inet6_csk_xmit(struct sk_buff *skb, int ipfragok);
|
||||
#endif /* _INET6_CONNECTION_SOCK_H */
|
@ -48,6 +48,32 @@ static inline int inet6_sk_ehashfn(const struct sock *sk)
|
||||
return inet6_ehashfn(laddr, lport, faddr, fport);
|
||||
}
|
||||
|
||||
static inline void __inet6_hash(struct inet_hashinfo *hashinfo,
|
||||
struct sock *sk)
|
||||
{
|
||||
struct hlist_head *list;
|
||||
rwlock_t *lock;
|
||||
|
||||
BUG_TRAP(sk_unhashed(sk));
|
||||
|
||||
if (sk->sk_state == TCP_LISTEN) {
|
||||
list = &hashinfo->listening_hash[inet_sk_listen_hashfn(sk)];
|
||||
lock = &hashinfo->lhash_lock;
|
||||
inet_listen_wlock(hashinfo);
|
||||
} else {
|
||||
unsigned int hash;
|
||||
sk->sk_hash = hash = inet6_sk_ehashfn(sk);
|
||||
hash &= (hashinfo->ehash_size - 1);
|
||||
list = &hashinfo->ehash[hash].chain;
|
||||
lock = &hashinfo->ehash[hash].lock;
|
||||
write_lock(lock);
|
||||
}
|
||||
|
||||
__sk_add_node(sk, list);
|
||||
sock_prot_inc_use(sk->sk_prot);
|
||||
write_unlock(lock);
|
||||
}
|
||||
|
||||
/*
|
||||
* Sockets in TCP_CLOSE state are _always_ taken out of the hash, so
|
||||
* we need not check it for TCP lookups anymore, thanks Alexey. -DaveM
|
||||
@ -84,10 +110,10 @@ static inline struct sock *
|
||||
|
||||
if(*((__u32 *)&(tw->tw_dport)) == ports &&
|
||||
sk->sk_family == PF_INET6) {
|
||||
const struct tcp6_timewait_sock *tcp6tw = tcp6_twsk(sk);
|
||||
const struct inet6_timewait_sock *tw6 = inet6_twsk(sk);
|
||||
|
||||
if (ipv6_addr_equal(&tcp6tw->tw_v6_daddr, saddr) &&
|
||||
ipv6_addr_equal(&tcp6tw->tw_v6_rcv_saddr, daddr) &&
|
||||
if (ipv6_addr_equal(&tw6->tw_v6_daddr, saddr) &&
|
||||
ipv6_addr_equal(&tw6->tw_v6_rcv_saddr, daddr) &&
|
||||
(!sk->sk_bound_dev_if || sk->sk_bound_dev_if == dif))
|
||||
goto hit;
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
#ifndef _INET_COMMON_H
|
||||
#define _INET_COMMON_H
|
||||
|
||||
extern struct proto_ops inet_stream_ops;
|
||||
extern struct proto_ops inet_dgram_ops;
|
||||
extern const struct proto_ops inet_stream_ops;
|
||||
extern const struct proto_ops inet_dgram_ops;
|
||||
|
||||
/*
|
||||
* INET4 prototypes used by INET6
|
||||
|
@ -15,9 +15,11 @@
|
||||
#ifndef _INET_CONNECTION_SOCK_H
|
||||
#define _INET_CONNECTION_SOCK_H
|
||||
|
||||
#include <linux/ip.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/timer.h>
|
||||
|
||||
#include <net/inet_sock.h>
|
||||
#include <net/request_sock.h>
|
||||
|
||||
#define INET_CSK_DEBUG 1
|
||||
@ -29,6 +31,29 @@ struct inet_bind_bucket;
|
||||
struct inet_hashinfo;
|
||||
struct tcp_congestion_ops;
|
||||
|
||||
/*
|
||||
* Pointers to address related TCP functions
|
||||
* (i.e. things that depend on the address family)
|
||||
*/
|
||||
struct inet_connection_sock_af_ops {
|
||||
int (*queue_xmit)(struct sk_buff *skb, int ipfragok);
|
||||
void (*send_check)(struct sock *sk, int len,
|
||||
struct sk_buff *skb);
|
||||
int (*rebuild_header)(struct sock *sk);
|
||||
int (*conn_request)(struct sock *sk, struct sk_buff *skb);
|
||||
struct sock *(*syn_recv_sock)(struct sock *sk, struct sk_buff *skb,
|
||||
struct request_sock *req,
|
||||
struct dst_entry *dst);
|
||||
int (*remember_stamp)(struct sock *sk);
|
||||
__u16 net_header_len;
|
||||
int (*setsockopt)(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int optlen);
|
||||
int (*getsockopt)(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int __user *optlen);
|
||||
void (*addr2sockaddr)(struct sock *sk, struct sockaddr *);
|
||||
int sockaddr_len;
|
||||
};
|
||||
|
||||
/** inet_connection_sock - INET connection oriented sock
|
||||
*
|
||||
* @icsk_accept_queue: FIFO of established children
|
||||
@ -36,13 +61,16 @@ struct tcp_congestion_ops;
|
||||
* @icsk_timeout: Timeout
|
||||
* @icsk_retransmit_timer: Resend (no ack)
|
||||
* @icsk_rto: Retransmit timeout
|
||||
* @icsk_pmtu_cookie Last pmtu seen by socket
|
||||
* @icsk_ca_ops Pluggable congestion control hook
|
||||
* @icsk_af_ops Operations which are AF_INET{4,6} specific
|
||||
* @icsk_ca_state: Congestion control state
|
||||
* @icsk_retransmits: Number of unrecovered [RTO] timeouts
|
||||
* @icsk_pending: Scheduled timer event
|
||||
* @icsk_backoff: Backoff
|
||||
* @icsk_syn_retries: Number of allowed SYN (or equivalent) retries
|
||||
* @icsk_probes_out: unanswered 0 window probes
|
||||
* @icsk_ext_hdr_len: Network protocol overhead (IP/IPv6 options)
|
||||
* @icsk_ack: Delayed ACK control data
|
||||
*/
|
||||
struct inet_connection_sock {
|
||||
@ -54,14 +82,17 @@ struct inet_connection_sock {
|
||||
struct timer_list icsk_retransmit_timer;
|
||||
struct timer_list icsk_delack_timer;
|
||||
__u32 icsk_rto;
|
||||
__u32 icsk_pmtu_cookie;
|
||||
struct tcp_congestion_ops *icsk_ca_ops;
|
||||
struct inet_connection_sock_af_ops *icsk_af_ops;
|
||||
unsigned int (*icsk_sync_mss)(struct sock *sk, u32 pmtu);
|
||||
__u8 icsk_ca_state;
|
||||
__u8 icsk_retransmits;
|
||||
__u8 icsk_pending;
|
||||
__u8 icsk_backoff;
|
||||
__u8 icsk_syn_retries;
|
||||
__u8 icsk_probes_out;
|
||||
/* 2 BYTES HOLE, TRY TO PACK! */
|
||||
__u16 icsk_ext_hdr_len;
|
||||
struct {
|
||||
__u8 pending; /* ACK is pending */
|
||||
__u8 quick; /* Scheduled number of quick acks */
|
||||
@ -192,8 +223,12 @@ extern struct request_sock *inet_csk_search_req(const struct sock *sk,
|
||||
const __u16 rport,
|
||||
const __u32 raddr,
|
||||
const __u32 laddr);
|
||||
extern int inet_csk_bind_conflict(const struct sock *sk,
|
||||
const struct inet_bind_bucket *tb);
|
||||
extern int inet_csk_get_port(struct inet_hashinfo *hashinfo,
|
||||
struct sock *sk, unsigned short snum);
|
||||
struct sock *sk, unsigned short snum,
|
||||
int (*bind_conflict)(const struct sock *sk,
|
||||
const struct inet_bind_bucket *tb));
|
||||
|
||||
extern struct dst_entry* inet_csk_route_req(struct sock *sk,
|
||||
const struct request_sock *req);
|
||||
@ -207,7 +242,7 @@ static inline void inet_csk_reqsk_queue_add(struct sock *sk,
|
||||
|
||||
extern void inet_csk_reqsk_queue_hash_add(struct sock *sk,
|
||||
struct request_sock *req,
|
||||
const unsigned timeout);
|
||||
unsigned long timeout);
|
||||
|
||||
static inline void inet_csk_reqsk_queue_removed(struct sock *sk,
|
||||
struct request_sock *req)
|
||||
@ -273,4 +308,6 @@ static inline unsigned int inet_csk_listen_poll(const struct sock *sk)
|
||||
extern int inet_csk_listen_start(struct sock *sk, const int nr_table_entries);
|
||||
extern void inet_csk_listen_stop(struct sock *sk);
|
||||
|
||||
extern void inet_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr);
|
||||
|
||||
#endif /* _INET_CONNECTION_SOCK_H */
|
||||
|
@ -3,6 +3,8 @@
|
||||
|
||||
#include <linux/ip.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
#include <net/inet_sock.h>
|
||||
#include <net/dsfield.h>
|
||||
|
||||
enum {
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include <linux/wait.h>
|
||||
|
||||
#include <net/inet_connection_sock.h>
|
||||
#include <net/inet_sock.h>
|
||||
#include <net/route.h>
|
||||
#include <net/sock.h>
|
||||
#include <net/tcp_states.h>
|
||||
@ -128,26 +129,6 @@ struct inet_hashinfo {
|
||||
kmem_cache_t *bind_bucket_cachep;
|
||||
};
|
||||
|
||||
static inline unsigned int inet_ehashfn(const __u32 laddr, const __u16 lport,
|
||||
const __u32 faddr, const __u16 fport)
|
||||
{
|
||||
unsigned int h = (laddr ^ lport) ^ (faddr ^ fport);
|
||||
h ^= h >> 16;
|
||||
h ^= h >> 8;
|
||||
return h;
|
||||
}
|
||||
|
||||
static inline int inet_sk_ehashfn(const struct sock *sk)
|
||||
{
|
||||
const struct inet_sock *inet = inet_sk(sk);
|
||||
const __u32 laddr = inet->rcv_saddr;
|
||||
const __u16 lport = inet->num;
|
||||
const __u32 faddr = inet->daddr;
|
||||
const __u16 fport = inet->dport;
|
||||
|
||||
return inet_ehashfn(laddr, lport, faddr, fport);
|
||||
}
|
||||
|
||||
static inline struct inet_ehash_bucket *inet_ehash_bucket(
|
||||
struct inet_hashinfo *hashinfo,
|
||||
unsigned int hash)
|
||||
@ -434,4 +415,7 @@ static inline struct sock *inet_lookup(struct inet_hashinfo *hashinfo,
|
||||
|
||||
return sk;
|
||||
}
|
||||
|
||||
extern int inet_hash_connect(struct inet_timewait_death_row *death_row,
|
||||
struct sock *sk);
|
||||
#endif /* _INET_HASHTABLES_H */
|
||||
|
193
include/net/inet_sock.h
Normal file
193
include/net/inet_sock.h
Normal file
@ -0,0 +1,193 @@
|
||||
/*
|
||||
* INET An implementation of the TCP/IP protocol suite for the LINUX
|
||||
* operating system. INET is implemented using the BSD Socket
|
||||
* interface as the means of communication with the user level.
|
||||
*
|
||||
* Definitions for inet_sock
|
||||
*
|
||||
* Authors: Many, reorganised here by
|
||||
* Arnaldo Carvalho de Melo <acme@mandriva.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
#ifndef _INET_SOCK_H
|
||||
#define _INET_SOCK_H
|
||||
|
||||
#include <linux/config.h>
|
||||
|
||||
#include <linux/string.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <net/flow.h>
|
||||
#include <net/sock.h>
|
||||
#include <net/request_sock.h>
|
||||
|
||||
/** struct ip_options - IP Options
|
||||
*
|
||||
* @faddr - Saved first hop address
|
||||
* @is_setbyuser - Set by setsockopt?
|
||||
* @is_data - Options in __data, rather than skb
|
||||
* @is_strictroute - Strict source route
|
||||
* @srr_is_hit - Packet destination addr was our one
|
||||
* @is_changed - IP checksum more not valid
|
||||
* @rr_needaddr - Need to record addr of outgoing dev
|
||||
* @ts_needtime - Need to record timestamp
|
||||
* @ts_needaddr - Need to record addr of outgoing dev
|
||||
*/
|
||||
struct ip_options {
|
||||
__u32 faddr;
|
||||
unsigned char optlen;
|
||||
unsigned char srr;
|
||||
unsigned char rr;
|
||||
unsigned char ts;
|
||||
unsigned char is_setbyuser:1,
|
||||
is_data:1,
|
||||
is_strictroute:1,
|
||||
srr_is_hit:1,
|
||||
is_changed:1,
|
||||
rr_needaddr:1,
|
||||
ts_needtime:1,
|
||||
ts_needaddr:1;
|
||||
unsigned char router_alert;
|
||||
unsigned char __pad1;
|
||||
unsigned char __pad2;
|
||||
unsigned char __data[0];
|
||||
};
|
||||
|
||||
#define optlength(opt) (sizeof(struct ip_options) + opt->optlen)
|
||||
|
||||
struct inet_request_sock {
|
||||
struct request_sock req;
|
||||
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
|
||||
u16 inet6_rsk_offset;
|
||||
/* 2 bytes hole, try to pack */
|
||||
#endif
|
||||
u32 loc_addr;
|
||||
u32 rmt_addr;
|
||||
u16 rmt_port;
|
||||
u16 snd_wscale : 4,
|
||||
rcv_wscale : 4,
|
||||
tstamp_ok : 1,
|
||||
sack_ok : 1,
|
||||
wscale_ok : 1,
|
||||
ecn_ok : 1,
|
||||
acked : 1;
|
||||
struct ip_options *opt;
|
||||
};
|
||||
|
||||
static inline struct inet_request_sock *inet_rsk(const struct request_sock *sk)
|
||||
{
|
||||
return (struct inet_request_sock *)sk;
|
||||
}
|
||||
|
||||
struct ip_mc_socklist;
|
||||
struct ipv6_pinfo;
|
||||
struct rtable;
|
||||
|
||||
/** struct inet_sock - representation of INET sockets
|
||||
*
|
||||
* @sk - ancestor class
|
||||
* @pinet6 - pointer to IPv6 control block
|
||||
* @daddr - Foreign IPv4 addr
|
||||
* @rcv_saddr - Bound local IPv4 addr
|
||||
* @dport - Destination port
|
||||
* @num - Local port
|
||||
* @saddr - Sending source
|
||||
* @uc_ttl - Unicast TTL
|
||||
* @sport - Source port
|
||||
* @id - ID counter for DF pkts
|
||||
* @tos - TOS
|
||||
* @mc_ttl - Multicasting TTL
|
||||
* @is_icsk - is this an inet_connection_sock?
|
||||
* @mc_index - Multicast device index
|
||||
* @mc_list - Group array
|
||||
* @cork - info to build ip hdr on each ip frag while socket is corked
|
||||
*/
|
||||
struct inet_sock {
|
||||
/* sk and pinet6 has to be the first two members of inet_sock */
|
||||
struct sock sk;
|
||||
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
|
||||
struct ipv6_pinfo *pinet6;
|
||||
#endif
|
||||
/* Socket demultiplex comparisons on incoming packets. */
|
||||
__u32 daddr;
|
||||
__u32 rcv_saddr;
|
||||
__u16 dport;
|
||||
__u16 num;
|
||||
__u32 saddr;
|
||||
__s16 uc_ttl;
|
||||
__u16 cmsg_flags;
|
||||
struct ip_options *opt;
|
||||
__u16 sport;
|
||||
__u16 id;
|
||||
__u8 tos;
|
||||
__u8 mc_ttl;
|
||||
__u8 pmtudisc;
|
||||
__u8 recverr:1,
|
||||
is_icsk:1,
|
||||
freebind:1,
|
||||
hdrincl:1,
|
||||
mc_loop:1;
|
||||
int mc_index;
|
||||
__u32 mc_addr;
|
||||
struct ip_mc_socklist *mc_list;
|
||||
struct {
|
||||
unsigned int flags;
|
||||
unsigned int fragsize;
|
||||
struct ip_options *opt;
|
||||
struct rtable *rt;
|
||||
int length; /* Total length of all frames */
|
||||
u32 addr;
|
||||
struct flowi fl;
|
||||
} cork;
|
||||
};
|
||||
|
||||
#define IPCORK_OPT 1 /* ip-options has been held in ipcork.opt */
|
||||
#define IPCORK_ALLFRAG 2 /* always fragment (for ipv6 for now) */
|
||||
|
||||
static inline struct inet_sock *inet_sk(const struct sock *sk)
|
||||
{
|
||||
return (struct inet_sock *)sk;
|
||||
}
|
||||
|
||||
static inline void __inet_sk_copy_descendant(struct sock *sk_to,
|
||||
const struct sock *sk_from,
|
||||
const int ancestor_size)
|
||||
{
|
||||
memcpy(inet_sk(sk_to) + 1, inet_sk(sk_from) + 1,
|
||||
sk_from->sk_prot->obj_size - ancestor_size);
|
||||
}
|
||||
#if !(defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE))
|
||||
static inline void inet_sk_copy_descendant(struct sock *sk_to,
|
||||
const struct sock *sk_from)
|
||||
{
|
||||
__inet_sk_copy_descendant(sk_to, sk_from, sizeof(struct inet_sock));
|
||||
}
|
||||
#endif
|
||||
|
||||
extern int inet_sk_rebuild_header(struct sock *sk);
|
||||
|
||||
static inline unsigned int inet_ehashfn(const __u32 laddr, const __u16 lport,
|
||||
const __u32 faddr, const __u16 fport)
|
||||
{
|
||||
unsigned int h = (laddr ^ lport) ^ (faddr ^ fport);
|
||||
h ^= h >> 16;
|
||||
h ^= h >> 8;
|
||||
return h;
|
||||
}
|
||||
|
||||
static inline int inet_sk_ehashfn(const struct sock *sk)
|
||||
{
|
||||
const struct inet_sock *inet = inet_sk(sk);
|
||||
const __u32 laddr = inet->rcv_saddr;
|
||||
const __u16 lport = inet->num;
|
||||
const __u32 faddr = inet->daddr;
|
||||
const __u16 fport = inet->dport;
|
||||
|
||||
return inet_ehashfn(laddr, lport, faddr, fport);
|
||||
}
|
||||
|
||||
#endif /* _INET_SOCK_H */
|
@ -17,15 +17,16 @@
|
||||
|
||||
#include <linux/config.h>
|
||||
|
||||
#include <linux/ip.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
#include <net/inet_sock.h>
|
||||
#include <net/sock.h>
|
||||
#include <net/tcp_states.h>
|
||||
#include <net/timewait_sock.h>
|
||||
|
||||
#include <asm/atomic.h>
|
||||
|
||||
@ -127,7 +128,8 @@ struct inet_timewait_sock {
|
||||
__u16 tw_num;
|
||||
/* And these are ours. */
|
||||
__u8 tw_ipv6only:1;
|
||||
/* 31 bits hole, try to pack */
|
||||
/* 15 bits hole, try to pack */
|
||||
__u16 tw_ipv6_offset;
|
||||
int tw_timeout;
|
||||
unsigned long tw_ttd;
|
||||
struct inet_bind_bucket *tw_tb;
|
||||
@ -199,7 +201,7 @@ static inline void inet_twsk_put(struct inet_timewait_sock *tw)
|
||||
printk(KERN_DEBUG "%s timewait_sock %p released\n",
|
||||
tw->tw_prot->name, tw);
|
||||
#endif
|
||||
kmem_cache_free(tw->tw_prot->twsk_slab, tw);
|
||||
kmem_cache_free(tw->tw_prot->twsk_prot->twsk_slab, tw);
|
||||
module_put(owner);
|
||||
}
|
||||
}
|
||||
|
@ -25,6 +25,7 @@ struct inet_peer
|
||||
__u32 v4daddr; /* peer's address */
|
||||
__u16 avl_height;
|
||||
__u16 ip_id_count; /* IP ID for the next packet */
|
||||
atomic_t rid; /* Frag reception counter */
|
||||
__u32 tcp_ts;
|
||||
unsigned long tcp_ts_stamp;
|
||||
};
|
||||
|
@ -24,14 +24,10 @@
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/socket.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/in.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/inetdevice.h>
|
||||
#include <linux/in_route.h>
|
||||
#include <net/route.h>
|
||||
#include <net/arp.h>
|
||||
|
||||
#include <net/inet_sock.h>
|
||||
#include <net/snmp.h>
|
||||
|
||||
struct sock;
|
||||
@ -45,6 +41,7 @@ struct inet_skb_parm
|
||||
#define IPSKB_TRANSLATED 2
|
||||
#define IPSKB_FORWARDED 4
|
||||
#define IPSKB_XFRM_TUNNEL_SIZE 8
|
||||
#define IPSKB_FRAG_COMPLETE 16
|
||||
};
|
||||
|
||||
struct ipcm_cookie
|
||||
@ -74,6 +71,13 @@ extern rwlock_t ip_ra_lock;
|
||||
|
||||
#define IP_FRAG_TIME (30 * HZ) /* fragment lifetime */
|
||||
|
||||
struct msghdr;
|
||||
struct net_device;
|
||||
struct packet_type;
|
||||
struct rtable;
|
||||
struct sk_buff;
|
||||
struct sockaddr;
|
||||
|
||||
extern void ip_mc_dropsocket(struct sock *);
|
||||
extern void ip_mc_dropdevice(struct net_device *dev);
|
||||
extern int igmp_mc_proc_init(void);
|
||||
@ -168,6 +172,7 @@ extern int sysctl_ipfrag_high_thresh;
|
||||
extern int sysctl_ipfrag_low_thresh;
|
||||
extern int sysctl_ipfrag_time;
|
||||
extern int sysctl_ipfrag_secret_interval;
|
||||
extern int sysctl_ipfrag_max_dist;
|
||||
|
||||
/* From inetpeer.c */
|
||||
extern int inet_peer_threshold;
|
||||
@ -182,6 +187,8 @@ extern int sysctl_ip_dynaddr;
|
||||
extern void ipfrag_init(void);
|
||||
|
||||
#ifdef CONFIG_INET
|
||||
#include <net/dst.h>
|
||||
|
||||
/* The function in 2.2 was invalid, producing wrong result for
|
||||
* check=0xFEFF. It was noticed by Arthur Skawina _year_ ago. --ANK(000625) */
|
||||
static inline
|
||||
|
@ -238,6 +238,8 @@ extern int fib_validate_source(u32 src, u32 dst, u8 tos, int oif,
|
||||
struct net_device *dev, u32 *spec_dst, u32 *itag);
|
||||
extern void fib_select_multipath(const struct flowi *flp, struct fib_result *res);
|
||||
|
||||
struct rtentry;
|
||||
|
||||
/* Exported by fib_semantics.c */
|
||||
extern int ip_fib_check_default(u32 gw, struct net_device *dev);
|
||||
extern int fib_sync_down(u32 local, struct net_device *dev, int force);
|
||||
|
@ -251,16 +251,15 @@ struct ip_vs_daemon_user {
|
||||
#include <linux/config.h>
|
||||
#include <linux/list.h> /* for struct list_head */
|
||||
#include <linux/spinlock.h> /* for struct rwlock_t */
|
||||
#include <linux/skbuff.h> /* for struct sk_buff */
|
||||
#include <linux/ip.h> /* for struct iphdr */
|
||||
#include <asm/atomic.h> /* for struct atomic_t */
|
||||
#include <linux/netdevice.h> /* for struct neighbour */
|
||||
#include <net/dst.h> /* for struct dst_entry */
|
||||
#include <net/udp.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/timer.h>
|
||||
|
||||
#include <net/checksum.h>
|
||||
|
||||
#ifdef CONFIG_IP_VS_DEBUG
|
||||
#include <linux/net.h>
|
||||
|
||||
extern int ip_vs_get_debug_level(void);
|
||||
#define IP_VS_DBG(level, msg...) \
|
||||
do { \
|
||||
@ -429,8 +428,11 @@ struct ip_vs_stats
|
||||
spinlock_t lock; /* spin lock */
|
||||
};
|
||||
|
||||
struct dst_entry;
|
||||
struct iphdr;
|
||||
struct ip_vs_conn;
|
||||
struct ip_vs_app;
|
||||
struct sk_buff;
|
||||
|
||||
struct ip_vs_protocol {
|
||||
struct ip_vs_protocol *next;
|
||||
|
@ -240,6 +240,8 @@ extern struct ipv6_txoptions * ipv6_renew_options(struct sock *sk, struct ipv6_t
|
||||
struct ipv6_txoptions *ipv6_fixup_options(struct ipv6_txoptions *opt_space,
|
||||
struct ipv6_txoptions *opt);
|
||||
|
||||
extern int ipv6_opt_accepted(struct sock *sk, struct sk_buff *skb);
|
||||
|
||||
extern int ip6_frag_nqueues;
|
||||
extern atomic_t ip6_frag_mem;
|
||||
|
||||
@ -525,6 +527,9 @@ extern int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
|
||||
extern int inet6_ioctl(struct socket *sock, unsigned int cmd,
|
||||
unsigned long arg);
|
||||
|
||||
extern int inet6_hash_connect(struct inet_timewait_death_row *death_row,
|
||||
struct sock *sk);
|
||||
|
||||
/*
|
||||
* reassembly.c
|
||||
*/
|
||||
@ -533,8 +538,11 @@ extern int sysctl_ip6frag_low_thresh;
|
||||
extern int sysctl_ip6frag_time;
|
||||
extern int sysctl_ip6frag_secret_interval;
|
||||
|
||||
extern struct proto_ops inet6_stream_ops;
|
||||
extern struct proto_ops inet6_dgram_ops;
|
||||
extern const struct proto_ops inet6_stream_ops;
|
||||
extern const struct proto_ops inet6_dgram_ops;
|
||||
|
||||
struct group_source_req;
|
||||
struct group_filter;
|
||||
|
||||
extern int ip6_mc_source(int add, int omode, struct sock *sk,
|
||||
struct group_source_req *pgsr);
|
||||
|
@ -35,11 +35,20 @@ enum {
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/config.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/icmpv6.h>
|
||||
#include <linux/in6.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <net/neighbour.h>
|
||||
#include <asm/atomic.h>
|
||||
|
||||
struct ctl_table;
|
||||
struct file;
|
||||
struct inet6_dev;
|
||||
struct net_device;
|
||||
struct net_proto_family;
|
||||
struct sk_buff;
|
||||
|
||||
extern struct neigh_table nd_tbl;
|
||||
|
||||
@ -108,7 +117,7 @@ extern int igmp6_event_report(struct sk_buff *skb);
|
||||
extern void igmp6_cleanup(void);
|
||||
|
||||
#ifdef CONFIG_SYSCTL
|
||||
extern int ndisc_ifinfo_sysctl_change(ctl_table *ctl,
|
||||
extern int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl,
|
||||
int write,
|
||||
struct file * filp,
|
||||
void __user *buffer,
|
||||
|
@ -49,8 +49,8 @@
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <asm/atomic.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
||||
|
@ -15,7 +15,6 @@
|
||||
#include <linux/in.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <linux/module.h>
|
||||
|
@ -65,7 +65,7 @@ struct inet_protosw {
|
||||
int protocol; /* This is the L4 protocol number. */
|
||||
|
||||
struct proto *prot;
|
||||
struct proto_ops *ops;
|
||||
const struct proto_ops *ops;
|
||||
|
||||
int capability; /* Which (if any) capability do
|
||||
* we need to use this socket
|
||||
@ -76,6 +76,7 @@ struct inet_protosw {
|
||||
};
|
||||
#define INET_PROTOSW_REUSE 0x01 /* Are ports automatically reusable? */
|
||||
#define INET_PROTOSW_PERMANENT 0x02 /* Permanent protocols are unremovable. */
|
||||
#define INET_PROTOSW_ICSK 0x04 /* Is this an inet_connection_sock? */
|
||||
|
||||
extern struct net_protocol *inet_protocol_base;
|
||||
extern struct net_protocol *inet_protos[MAX_INET_PROTOS];
|
||||
|
@ -19,6 +19,8 @@
|
||||
|
||||
#include <linux/config.h>
|
||||
|
||||
#include <net/protocol.h>
|
||||
|
||||
extern struct proto raw_prot;
|
||||
|
||||
extern void raw_err(struct sock *, struct sk_buff *, u32 info);
|
||||
|
@ -244,7 +244,7 @@ static inline int reqsk_queue_is_full(const struct request_sock_queue *queue)
|
||||
|
||||
static inline void reqsk_queue_hash_req(struct request_sock_queue *queue,
|
||||
u32 hash, struct request_sock *req,
|
||||
unsigned timeout)
|
||||
unsigned long timeout)
|
||||
{
|
||||
struct listen_sock *lopt = queue->listen_opt;
|
||||
|
||||
|
@ -277,6 +277,24 @@ struct sctp_sock {
|
||||
__u32 default_context;
|
||||
__u32 default_timetolive;
|
||||
|
||||
/* Heartbeat interval: The endpoint sends out a Heartbeat chunk to
|
||||
* the destination address every heartbeat interval. This value
|
||||
* will be inherited by all new associations.
|
||||
*/
|
||||
__u32 hbinterval;
|
||||
|
||||
/* This is the max_retrans value for new associations. */
|
||||
__u16 pathmaxrxt;
|
||||
|
||||
/* The initial Path MTU to use for new associations. */
|
||||
__u32 pathmtu;
|
||||
|
||||
/* The default SACK delay timeout for new associations. */
|
||||
__u32 sackdelay;
|
||||
|
||||
/* Flags controling Heartbeat, SACK delay, and Path MTU Discovery. */
|
||||
__u32 param_flags;
|
||||
|
||||
struct sctp_initmsg initmsg;
|
||||
struct sctp_rtoinfo rtoinfo;
|
||||
struct sctp_paddrparams paddrparam;
|
||||
@ -845,9 +863,6 @@ struct sctp_transport {
|
||||
/* Data that has been sent, but not acknowledged. */
|
||||
__u32 flight_size;
|
||||
|
||||
/* PMTU : The current known path MTU. */
|
||||
__u32 pmtu;
|
||||
|
||||
/* Destination */
|
||||
struct dst_entry *dst;
|
||||
/* Source address. */
|
||||
@ -862,7 +877,22 @@ struct sctp_transport {
|
||||
/* Heartbeat interval: The endpoint sends out a Heartbeat chunk to
|
||||
* the destination address every heartbeat interval.
|
||||
*/
|
||||
int hb_interval;
|
||||
__u32 hbinterval;
|
||||
|
||||
/* This is the max_retrans value for the transport and will
|
||||
* be initialized from the assocs value. This can be changed
|
||||
* using SCTP_SET_PEER_ADDR_PARAMS socket option.
|
||||
*/
|
||||
__u16 pathmaxrxt;
|
||||
|
||||
/* PMTU : The current known path MTU. */
|
||||
__u32 pathmtu;
|
||||
|
||||
/* SACK delay timeout */
|
||||
__u32 sackdelay;
|
||||
|
||||
/* Flags controling Heartbeat, SACK delay, and Path MTU Discovery. */
|
||||
__u32 param_flags;
|
||||
|
||||
/* When was the last time (in jiffies) that we heard from this
|
||||
* transport? We use this to pick new active and retran paths.
|
||||
@ -882,22 +912,11 @@ struct sctp_transport {
|
||||
*/
|
||||
int state;
|
||||
|
||||
/* hb_allowed : The current heartbeat state of this destination,
|
||||
* : i.e. ALLOW-HB, NO-HEARTBEAT, etc.
|
||||
*/
|
||||
int hb_allowed;
|
||||
|
||||
/* These are the error stats for this destination. */
|
||||
|
||||
/* Error count : The current error count for this destination. */
|
||||
unsigned short error_count;
|
||||
|
||||
/* This is the max_retrans value for the transport and will
|
||||
* be initialized to proto.max_retrans.path. This can be changed
|
||||
* using SCTP_SET_PEER_ADDR_PARAMS socket option.
|
||||
*/
|
||||
int max_retrans;
|
||||
|
||||
/* Per : A timer used by each destination.
|
||||
* Destination :
|
||||
* Timer :
|
||||
@ -1502,6 +1521,28 @@ struct sctp_association {
|
||||
/* The largest timeout or RTO value to use in attempting an INIT */
|
||||
__u16 max_init_timeo;
|
||||
|
||||
/* Heartbeat interval: The endpoint sends out a Heartbeat chunk to
|
||||
* the destination address every heartbeat interval. This value
|
||||
* will be inherited by all new transports.
|
||||
*/
|
||||
__u32 hbinterval;
|
||||
|
||||
/* This is the max_retrans value for new transports in the
|
||||
* association.
|
||||
*/
|
||||
__u16 pathmaxrxt;
|
||||
|
||||
/* Association : The smallest PMTU discovered for all of the
|
||||
* PMTU : peer's transport addresses.
|
||||
*/
|
||||
__u32 pathmtu;
|
||||
|
||||
/* SACK delay timeout */
|
||||
__u32 sackdelay;
|
||||
|
||||
/* Flags controling Heartbeat, SACK delay, and Path MTU Discovery. */
|
||||
__u32 param_flags;
|
||||
|
||||
int timeouts[SCTP_NUM_TIMEOUT_TYPES];
|
||||
struct timer_list timers[SCTP_NUM_TIMEOUT_TYPES];
|
||||
|
||||
@ -1571,11 +1612,6 @@ struct sctp_association {
|
||||
*/
|
||||
wait_queue_head_t wait;
|
||||
|
||||
/* Association : The smallest PMTU discovered for all of the
|
||||
* PMTU : peer's transport addresses.
|
||||
*/
|
||||
__u32 pmtu;
|
||||
|
||||
/* The message size at which SCTP fragmentation will occur. */
|
||||
__u32 frag_point;
|
||||
|
||||
|
@ -93,6 +93,8 @@ enum sctp_optname {
|
||||
#define SCTP_STATUS SCTP_STATUS
|
||||
SCTP_GET_PEER_ADDR_INFO,
|
||||
#define SCTP_GET_PEER_ADDR_INFO SCTP_GET_PEER_ADDR_INFO
|
||||
SCTP_DELAYED_ACK_TIME,
|
||||
#define SCTP_DELAYED_ACK_TIME SCTP_DELAYED_ACK_TIME
|
||||
|
||||
/* Internal Socket Options. Some of the sctp library functions are
|
||||
* implemented using these socket options.
|
||||
@ -503,13 +505,41 @@ struct sctp_setadaption {
|
||||
* unreachable. The following structure is used to access and modify an
|
||||
* address's parameters:
|
||||
*/
|
||||
enum sctp_spp_flags {
|
||||
SPP_HB_ENABLE = 1, /*Enable heartbeats*/
|
||||
SPP_HB_DISABLE = 2, /*Disable heartbeats*/
|
||||
SPP_HB = SPP_HB_ENABLE | SPP_HB_DISABLE,
|
||||
SPP_HB_DEMAND = 4, /*Send heartbeat immediately*/
|
||||
SPP_PMTUD_ENABLE = 8, /*Enable PMTU discovery*/
|
||||
SPP_PMTUD_DISABLE = 16, /*Disable PMTU discovery*/
|
||||
SPP_PMTUD = SPP_PMTUD_ENABLE | SPP_PMTUD_DISABLE,
|
||||
SPP_SACKDELAY_ENABLE = 32, /*Enable SACK*/
|
||||
SPP_SACKDELAY_DISABLE = 64, /*Disable SACK*/
|
||||
SPP_SACKDELAY = SPP_SACKDELAY_ENABLE | SPP_SACKDELAY_DISABLE,
|
||||
};
|
||||
|
||||
struct sctp_paddrparams {
|
||||
sctp_assoc_t spp_assoc_id;
|
||||
struct sockaddr_storage spp_address;
|
||||
__u32 spp_hbinterval;
|
||||
__u16 spp_pathmaxrxt;
|
||||
__u32 spp_pathmtu;
|
||||
__u32 spp_sackdelay;
|
||||
__u32 spp_flags;
|
||||
} __attribute__((packed, aligned(4)));
|
||||
|
||||
/* 7.1.24. Delayed Ack Timer (SCTP_DELAYED_ACK_TIME)
|
||||
*
|
||||
* This options will get or set the delayed ack timer. The time is set
|
||||
* in milliseconds. If the assoc_id is 0, then this sets or gets the
|
||||
* endpoints default delayed ack timer value. If the assoc_id field is
|
||||
* non-zero, then the set or get effects the specified association.
|
||||
*/
|
||||
struct sctp_assoc_value {
|
||||
sctp_assoc_t assoc_id;
|
||||
uint32_t assoc_value;
|
||||
};
|
||||
|
||||
/*
|
||||
* 7.2.2 Peer Address Information
|
||||
*
|
||||
|
@ -493,6 +493,7 @@ extern void sk_stream_kill_queues(struct sock *sk);
|
||||
extern int sk_wait_data(struct sock *sk, long *timeo);
|
||||
|
||||
struct request_sock_ops;
|
||||
struct timewait_sock_ops;
|
||||
|
||||
/* Networking protocol blocks we attach to sockets.
|
||||
* socket layer -> transport layer interface
|
||||
@ -557,11 +558,10 @@ struct proto {
|
||||
kmem_cache_t *slab;
|
||||
unsigned int obj_size;
|
||||
|
||||
kmem_cache_t *twsk_slab;
|
||||
unsigned int twsk_obj_size;
|
||||
atomic_t *orphan_count;
|
||||
|
||||
struct request_sock_ops *rsk_prot;
|
||||
struct timewait_sock_ops *twsk_prot;
|
||||
|
||||
struct module *owner;
|
||||
|
||||
@ -926,6 +926,29 @@ static inline void sock_put(struct sock *sk)
|
||||
sk_free(sk);
|
||||
}
|
||||
|
||||
static inline int sk_receive_skb(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
int rc = NET_RX_SUCCESS;
|
||||
|
||||
if (sk_filter(sk, skb, 0))
|
||||
goto discard_and_relse;
|
||||
|
||||
skb->dev = NULL;
|
||||
|
||||
bh_lock_sock(sk);
|
||||
if (!sock_owned_by_user(sk))
|
||||
rc = sk->sk_backlog_rcv(sk, skb);
|
||||
else
|
||||
sk_add_backlog(sk, skb);
|
||||
bh_unlock_sock(sk);
|
||||
out:
|
||||
sock_put(sk);
|
||||
return rc;
|
||||
discard_and_relse:
|
||||
kfree_skb(skb);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Detach socket from process context.
|
||||
* Announce socket dead, detach it from wait queue and inode.
|
||||
* Note that parent inode held reference count on this struct sock,
|
||||
@ -1166,7 +1189,10 @@ static inline int sock_queue_err_skb(struct sock *sk, struct sk_buff *skb)
|
||||
|
||||
static inline int sock_error(struct sock *sk)
|
||||
{
|
||||
int err = xchg(&sk->sk_err, 0);
|
||||
int err;
|
||||
if (likely(!sk->sk_err))
|
||||
return 0;
|
||||
err = xchg(&sk->sk_err, 0);
|
||||
return -err;
|
||||
}
|
||||
|
||||
|
@ -224,53 +224,6 @@ extern atomic_t tcp_memory_allocated;
|
||||
extern atomic_t tcp_sockets_allocated;
|
||||
extern int tcp_memory_pressure;
|
||||
|
||||
/*
|
||||
* Pointers to address related TCP functions
|
||||
* (i.e. things that depend on the address family)
|
||||
*/
|
||||
|
||||
struct tcp_func {
|
||||
int (*queue_xmit) (struct sk_buff *skb,
|
||||
int ipfragok);
|
||||
|
||||
void (*send_check) (struct sock *sk,
|
||||
struct tcphdr *th,
|
||||
int len,
|
||||
struct sk_buff *skb);
|
||||
|
||||
int (*rebuild_header) (struct sock *sk);
|
||||
|
||||
int (*conn_request) (struct sock *sk,
|
||||
struct sk_buff *skb);
|
||||
|
||||
struct sock * (*syn_recv_sock) (struct sock *sk,
|
||||
struct sk_buff *skb,
|
||||
struct request_sock *req,
|
||||
struct dst_entry *dst);
|
||||
|
||||
int (*remember_stamp) (struct sock *sk);
|
||||
|
||||
__u16 net_header_len;
|
||||
|
||||
int (*setsockopt) (struct sock *sk,
|
||||
int level,
|
||||
int optname,
|
||||
char __user *optval,
|
||||
int optlen);
|
||||
|
||||
int (*getsockopt) (struct sock *sk,
|
||||
int level,
|
||||
int optname,
|
||||
char __user *optval,
|
||||
int __user *optlen);
|
||||
|
||||
|
||||
void (*addr2sockaddr) (struct sock *sk,
|
||||
struct sockaddr *);
|
||||
|
||||
int sockaddr_len;
|
||||
};
|
||||
|
||||
/*
|
||||
* The next routines deal with comparing 32 bit unsigned ints
|
||||
* and worry about wraparound (automatic with unsigned arithmetic).
|
||||
@ -334,6 +287,9 @@ extern int tcp_rcv_established(struct sock *sk,
|
||||
|
||||
extern void tcp_rcv_space_adjust(struct sock *sk);
|
||||
|
||||
extern int tcp_twsk_unique(struct sock *sk,
|
||||
struct sock *sktw, void *twp);
|
||||
|
||||
static inline void tcp_dec_quickack_mode(struct sock *sk,
|
||||
const unsigned int pkts)
|
||||
{
|
||||
@ -405,8 +361,7 @@ extern void tcp_parse_options(struct sk_buff *skb,
|
||||
* TCP v4 functions exported for the inet6 API
|
||||
*/
|
||||
|
||||
extern void tcp_v4_send_check(struct sock *sk,
|
||||
struct tcphdr *th, int len,
|
||||
extern void tcp_v4_send_check(struct sock *sk, int len,
|
||||
struct sk_buff *skb);
|
||||
|
||||
extern int tcp_v4_conn_request(struct sock *sk,
|
||||
@ -490,34 +445,16 @@ typedef int (*sk_read_actor_t)(read_descriptor_t *, struct sk_buff *,
|
||||
extern int tcp_read_sock(struct sock *sk, read_descriptor_t *desc,
|
||||
sk_read_actor_t recv_actor);
|
||||
|
||||
/* Initialize RCV_MSS value.
|
||||
* RCV_MSS is an our guess about MSS used by the peer.
|
||||
* We haven't any direct information about the MSS.
|
||||
* It's better to underestimate the RCV_MSS rather than overestimate.
|
||||
* Overestimations make us ACKing less frequently than needed.
|
||||
* Underestimations are more easy to detect and fix by tcp_measure_rcv_mss().
|
||||
*/
|
||||
extern void tcp_initialize_rcv_mss(struct sock *sk);
|
||||
|
||||
static inline void tcp_initialize_rcv_mss(struct sock *sk)
|
||||
{
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
unsigned int hint = min_t(unsigned int, tp->advmss, tp->mss_cache);
|
||||
|
||||
hint = min(hint, tp->rcv_wnd/2);
|
||||
hint = min(hint, TCP_MIN_RCVMSS);
|
||||
hint = max(hint, TCP_MIN_MSS);
|
||||
|
||||
inet_csk(sk)->icsk_ack.rcv_mss = hint;
|
||||
}
|
||||
|
||||
static __inline__ void __tcp_fast_path_on(struct tcp_sock *tp, u32 snd_wnd)
|
||||
static inline void __tcp_fast_path_on(struct tcp_sock *tp, u32 snd_wnd)
|
||||
{
|
||||
tp->pred_flags = htonl((tp->tcp_header_len << 26) |
|
||||
ntohl(TCP_FLAG_ACK) |
|
||||
snd_wnd);
|
||||
}
|
||||
|
||||
static __inline__ void tcp_fast_path_on(struct tcp_sock *tp)
|
||||
static inline void tcp_fast_path_on(struct tcp_sock *tp)
|
||||
{
|
||||
__tcp_fast_path_on(tp, tp->snd_wnd >> tp->rx_opt.snd_wscale);
|
||||
}
|
||||
@ -535,7 +472,7 @@ static inline void tcp_fast_path_check(struct sock *sk, struct tcp_sock *tp)
|
||||
* Rcv_nxt can be after the window if our peer push more data
|
||||
* than the offered window.
|
||||
*/
|
||||
static __inline__ u32 tcp_receive_window(const struct tcp_sock *tp)
|
||||
static inline u32 tcp_receive_window(const struct tcp_sock *tp)
|
||||
{
|
||||
s32 win = tp->rcv_wup + tp->rcv_wnd - tp->rcv_nxt;
|
||||
|
||||
@ -707,6 +644,7 @@ extern void tcp_cleanup_congestion_control(struct sock *sk);
|
||||
extern int tcp_set_default_congestion_control(const char *name);
|
||||
extern void tcp_get_default_congestion_control(char *name);
|
||||
extern int tcp_set_congestion_control(struct sock *sk, const char *name);
|
||||
extern void tcp_slow_start(struct tcp_sock *tp);
|
||||
|
||||
extern struct tcp_congestion_ops tcp_init_congestion_ops;
|
||||
extern u32 tcp_reno_ssthresh(struct sock *sk);
|
||||
@ -746,7 +684,7 @@ static inline void tcp_ca_event(struct sock *sk, const enum tcp_ca_event event)
|
||||
* "Packets left network, but not honestly ACKed yet" PLUS
|
||||
* "Packets fast retransmitted"
|
||||
*/
|
||||
static __inline__ unsigned int tcp_packets_in_flight(const struct tcp_sock *tp)
|
||||
static inline unsigned int tcp_packets_in_flight(const struct tcp_sock *tp)
|
||||
{
|
||||
return (tp->packets_out - tp->left_out + tp->retrans_out);
|
||||
}
|
||||
@ -766,33 +704,6 @@ static inline __u32 tcp_current_ssthresh(const struct sock *sk)
|
||||
(tp->snd_cwnd >> 2)));
|
||||
}
|
||||
|
||||
/*
|
||||
* Linear increase during slow start
|
||||
*/
|
||||
static inline void tcp_slow_start(struct tcp_sock *tp)
|
||||
{
|
||||
if (sysctl_tcp_abc) {
|
||||
/* RFC3465: Slow Start
|
||||
* TCP sender SHOULD increase cwnd by the number of
|
||||
* previously unacknowledged bytes ACKed by each incoming
|
||||
* acknowledgment, provided the increase is not more than L
|
||||
*/
|
||||
if (tp->bytes_acked < tp->mss_cache)
|
||||
return;
|
||||
|
||||
/* We MAY increase by 2 if discovered delayed ack */
|
||||
if (sysctl_tcp_abc > 1 && tp->bytes_acked > 2*tp->mss_cache) {
|
||||
if (tp->snd_cwnd < tp->snd_cwnd_clamp)
|
||||
tp->snd_cwnd++;
|
||||
}
|
||||
}
|
||||
tp->bytes_acked = 0;
|
||||
|
||||
if (tp->snd_cwnd < tp->snd_cwnd_clamp)
|
||||
tp->snd_cwnd++;
|
||||
}
|
||||
|
||||
|
||||
static inline void tcp_sync_left_out(struct tcp_sock *tp)
|
||||
{
|
||||
if (tp->rx_opt.sack_ok &&
|
||||
@ -801,34 +712,7 @@ static inline void tcp_sync_left_out(struct tcp_sock *tp)
|
||||
tp->left_out = tp->sacked_out + tp->lost_out;
|
||||
}
|
||||
|
||||
/* Set slow start threshold and cwnd not falling to slow start */
|
||||
static inline void __tcp_enter_cwr(struct sock *sk)
|
||||
{
|
||||
const struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
|
||||
tp->undo_marker = 0;
|
||||
tp->snd_ssthresh = icsk->icsk_ca_ops->ssthresh(sk);
|
||||
tp->snd_cwnd = min(tp->snd_cwnd,
|
||||
tcp_packets_in_flight(tp) + 1U);
|
||||
tp->snd_cwnd_cnt = 0;
|
||||
tp->high_seq = tp->snd_nxt;
|
||||
tp->snd_cwnd_stamp = tcp_time_stamp;
|
||||
TCP_ECN_queue_cwr(tp);
|
||||
}
|
||||
|
||||
static inline void tcp_enter_cwr(struct sock *sk)
|
||||
{
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
|
||||
tp->prior_ssthresh = 0;
|
||||
tp->bytes_acked = 0;
|
||||
if (inet_csk(sk)->icsk_ca_state < TCP_CA_CWR) {
|
||||
__tcp_enter_cwr(sk);
|
||||
tcp_set_ca_state(sk, TCP_CA_CWR);
|
||||
}
|
||||
}
|
||||
|
||||
extern void tcp_enter_cwr(struct sock *sk);
|
||||
extern __u32 tcp_init_cwnd(struct tcp_sock *tp, struct dst_entry *dst);
|
||||
|
||||
/* Slow start with delack produces 3 packets of burst, so that
|
||||
@ -860,14 +744,14 @@ static inline int tcp_is_cwnd_limited(const struct sock *sk, u32 in_flight)
|
||||
return left <= tcp_max_burst(tp);
|
||||
}
|
||||
|
||||
static __inline__ void tcp_minshall_update(struct tcp_sock *tp, int mss,
|
||||
static inline void tcp_minshall_update(struct tcp_sock *tp, int mss,
|
||||
const struct sk_buff *skb)
|
||||
{
|
||||
if (skb->len < mss)
|
||||
tp->snd_sml = TCP_SKB_CB(skb)->end_seq;
|
||||
}
|
||||
|
||||
static __inline__ void tcp_check_probe_timer(struct sock *sk, struct tcp_sock *tp)
|
||||
static inline void tcp_check_probe_timer(struct sock *sk, struct tcp_sock *tp)
|
||||
{
|
||||
const struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
if (!tp->packets_out && !icsk->icsk_pending)
|
||||
@ -875,18 +759,18 @@ static __inline__ void tcp_check_probe_timer(struct sock *sk, struct tcp_sock *t
|
||||
icsk->icsk_rto, TCP_RTO_MAX);
|
||||
}
|
||||
|
||||
static __inline__ void tcp_push_pending_frames(struct sock *sk,
|
||||
static inline void tcp_push_pending_frames(struct sock *sk,
|
||||
struct tcp_sock *tp)
|
||||
{
|
||||
__tcp_push_pending_frames(sk, tp, tcp_current_mss(sk, 1), tp->nonagle);
|
||||
}
|
||||
|
||||
static __inline__ void tcp_init_wl(struct tcp_sock *tp, u32 ack, u32 seq)
|
||||
static inline void tcp_init_wl(struct tcp_sock *tp, u32 ack, u32 seq)
|
||||
{
|
||||
tp->snd_wl1 = seq;
|
||||
}
|
||||
|
||||
static __inline__ void tcp_update_wl(struct tcp_sock *tp, u32 ack, u32 seq)
|
||||
static inline void tcp_update_wl(struct tcp_sock *tp, u32 ack, u32 seq)
|
||||
{
|
||||
tp->snd_wl1 = seq;
|
||||
}
|
||||
@ -894,19 +778,19 @@ static __inline__ void tcp_update_wl(struct tcp_sock *tp, u32 ack, u32 seq)
|
||||
/*
|
||||
* Calculate(/check) TCP checksum
|
||||
*/
|
||||
static __inline__ u16 tcp_v4_check(struct tcphdr *th, int len,
|
||||
static inline u16 tcp_v4_check(struct tcphdr *th, int len,
|
||||
unsigned long saddr, unsigned long daddr,
|
||||
unsigned long base)
|
||||
{
|
||||
return csum_tcpudp_magic(saddr,daddr,len,IPPROTO_TCP,base);
|
||||
}
|
||||
|
||||
static __inline__ int __tcp_checksum_complete(struct sk_buff *skb)
|
||||
static inline int __tcp_checksum_complete(struct sk_buff *skb)
|
||||
{
|
||||
return __skb_checksum_complete(skb);
|
||||
}
|
||||
|
||||
static __inline__ int tcp_checksum_complete(struct sk_buff *skb)
|
||||
static inline int tcp_checksum_complete(struct sk_buff *skb)
|
||||
{
|
||||
return skb->ip_summed != CHECKSUM_UNNECESSARY &&
|
||||
__tcp_checksum_complete(skb);
|
||||
@ -914,7 +798,7 @@ static __inline__ int tcp_checksum_complete(struct sk_buff *skb)
|
||||
|
||||
/* Prequeue for VJ style copy to user, combined with checksumming. */
|
||||
|
||||
static __inline__ void tcp_prequeue_init(struct tcp_sock *tp)
|
||||
static inline void tcp_prequeue_init(struct tcp_sock *tp)
|
||||
{
|
||||
tp->ucopy.task = NULL;
|
||||
tp->ucopy.len = 0;
|
||||
@ -930,7 +814,7 @@ static __inline__ void tcp_prequeue_init(struct tcp_sock *tp)
|
||||
*
|
||||
* NOTE: is this not too big to inline?
|
||||
*/
|
||||
static __inline__ int tcp_prequeue(struct sock *sk, struct sk_buff *skb)
|
||||
static inline int tcp_prequeue(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
|
||||
@ -971,7 +855,7 @@ static const char *statename[]={
|
||||
};
|
||||
#endif
|
||||
|
||||
static __inline__ void tcp_set_state(struct sock *sk, int state)
|
||||
static inline void tcp_set_state(struct sock *sk, int state)
|
||||
{
|
||||
int oldstate = sk->sk_state;
|
||||
|
||||
@ -1005,7 +889,7 @@ static __inline__ void tcp_set_state(struct sock *sk, int state)
|
||||
#endif
|
||||
}
|
||||
|
||||
static __inline__ void tcp_done(struct sock *sk)
|
||||
static inline void tcp_done(struct sock *sk)
|
||||
{
|
||||
tcp_set_state(sk, TCP_CLOSE);
|
||||
tcp_clear_xmit_timers(sk);
|
||||
@ -1018,81 +902,13 @@ static __inline__ void tcp_done(struct sock *sk)
|
||||
inet_csk_destroy_sock(sk);
|
||||
}
|
||||
|
||||
static __inline__ void tcp_sack_reset(struct tcp_options_received *rx_opt)
|
||||
static inline void tcp_sack_reset(struct tcp_options_received *rx_opt)
|
||||
{
|
||||
rx_opt->dsack = 0;
|
||||
rx_opt->eff_sacks = 0;
|
||||
rx_opt->num_sacks = 0;
|
||||
}
|
||||
|
||||
static __inline__ void tcp_build_and_update_options(__u32 *ptr, struct tcp_sock *tp, __u32 tstamp)
|
||||
{
|
||||
if (tp->rx_opt.tstamp_ok) {
|
||||
*ptr++ = __constant_htonl((TCPOPT_NOP << 24) |
|
||||
(TCPOPT_NOP << 16) |
|
||||
(TCPOPT_TIMESTAMP << 8) |
|
||||
TCPOLEN_TIMESTAMP);
|
||||
*ptr++ = htonl(tstamp);
|
||||
*ptr++ = htonl(tp->rx_opt.ts_recent);
|
||||
}
|
||||
if (tp->rx_opt.eff_sacks) {
|
||||
struct tcp_sack_block *sp = tp->rx_opt.dsack ? tp->duplicate_sack : tp->selective_acks;
|
||||
int this_sack;
|
||||
|
||||
*ptr++ = __constant_htonl((TCPOPT_NOP << 24) |
|
||||
(TCPOPT_NOP << 16) |
|
||||
(TCPOPT_SACK << 8) |
|
||||
(TCPOLEN_SACK_BASE +
|
||||
(tp->rx_opt.eff_sacks * TCPOLEN_SACK_PERBLOCK)));
|
||||
for(this_sack = 0; this_sack < tp->rx_opt.eff_sacks; this_sack++) {
|
||||
*ptr++ = htonl(sp[this_sack].start_seq);
|
||||
*ptr++ = htonl(sp[this_sack].end_seq);
|
||||
}
|
||||
if (tp->rx_opt.dsack) {
|
||||
tp->rx_opt.dsack = 0;
|
||||
tp->rx_opt.eff_sacks--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Construct a tcp options header for a SYN or SYN_ACK packet.
|
||||
* If this is every changed make sure to change the definition of
|
||||
* MAX_SYN_SIZE to match the new maximum number of options that you
|
||||
* can generate.
|
||||
*/
|
||||
static inline void tcp_syn_build_options(__u32 *ptr, int mss, int ts, int sack,
|
||||
int offer_wscale, int wscale, __u32 tstamp, __u32 ts_recent)
|
||||
{
|
||||
/* We always get an MSS option.
|
||||
* The option bytes which will be seen in normal data
|
||||
* packets should timestamps be used, must be in the MSS
|
||||
* advertised. But we subtract them from tp->mss_cache so
|
||||
* that calculations in tcp_sendmsg are simpler etc.
|
||||
* So account for this fact here if necessary. If we
|
||||
* don't do this correctly, as a receiver we won't
|
||||
* recognize data packets as being full sized when we
|
||||
* should, and thus we won't abide by the delayed ACK
|
||||
* rules correctly.
|
||||
* SACKs don't matter, we never delay an ACK when we
|
||||
* have any of those going out.
|
||||
*/
|
||||
*ptr++ = htonl((TCPOPT_MSS << 24) | (TCPOLEN_MSS << 16) | mss);
|
||||
if (ts) {
|
||||
if(sack)
|
||||
*ptr++ = __constant_htonl((TCPOPT_SACK_PERM << 24) | (TCPOLEN_SACK_PERM << 16) |
|
||||
(TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP);
|
||||
else
|
||||
*ptr++ = __constant_htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
|
||||
(TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP);
|
||||
*ptr++ = htonl(tstamp); /* TSVAL */
|
||||
*ptr++ = htonl(ts_recent); /* TSECR */
|
||||
} else if(sack)
|
||||
*ptr++ = __constant_htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
|
||||
(TCPOPT_SACK_PERM << 8) | TCPOLEN_SACK_PERM);
|
||||
if (offer_wscale)
|
||||
*ptr++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_WINDOW << 16) | (TCPOLEN_WINDOW << 8) | (wscale));
|
||||
}
|
||||
|
||||
/* Determine a window scaling and initial window to offer. */
|
||||
extern void tcp_select_initial_window(int __space, __u32 mss,
|
||||
__u32 *rcv_wnd, __u32 *window_clamp,
|
||||
@ -1117,7 +933,7 @@ static inline int tcp_full_space(const struct sock *sk)
|
||||
return tcp_win_from_space(sk->sk_rcvbuf);
|
||||
}
|
||||
|
||||
static __inline__ void tcp_openreq_init(struct request_sock *req,
|
||||
static inline void tcp_openreq_init(struct request_sock *req,
|
||||
struct tcp_options_received *rx_opt,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
|
@ -31,4 +31,20 @@ enum {
|
||||
|
||||
#define TCP_STATE_MASK 0xF
|
||||
|
||||
#define TCP_ACTION_FIN (1 << 7)
|
||||
|
||||
enum {
|
||||
TCPF_ESTABLISHED = (1 << 1),
|
||||
TCPF_SYN_SENT = (1 << 2),
|
||||
TCPF_SYN_RECV = (1 << 3),
|
||||
TCPF_FIN_WAIT1 = (1 << 4),
|
||||
TCPF_FIN_WAIT2 = (1 << 5),
|
||||
TCPF_TIME_WAIT = (1 << 6),
|
||||
TCPF_CLOSE = (1 << 7),
|
||||
TCPF_CLOSE_WAIT = (1 << 8),
|
||||
TCPF_LAST_ACK = (1 << 9),
|
||||
TCPF_LISTEN = (1 << 10),
|
||||
TCPF_CLOSING = (1 << 11)
|
||||
};
|
||||
|
||||
#endif /* _LINUX_TCP_STATES_H */
|
||||
|
31
include/net/timewait_sock.h
Normal file
31
include/net/timewait_sock.h
Normal file
@ -0,0 +1,31 @@
|
||||
/*
|
||||
* NET Generic infrastructure for Network protocols.
|
||||
*
|
||||
* Authors: Arnaldo Carvalho de Melo <acme@conectiva.com.br>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
#ifndef _TIMEWAIT_SOCK_H
|
||||
#define _TIMEWAIT_SOCK_H
|
||||
|
||||
#include <linux/slab.h>
|
||||
#include <net/sock.h>
|
||||
|
||||
struct timewait_sock_ops {
|
||||
kmem_cache_t *twsk_slab;
|
||||
unsigned int twsk_obj_size;
|
||||
int (*twsk_unique)(struct sock *sk,
|
||||
struct sock *sktw, void *twp);
|
||||
};
|
||||
|
||||
static inline int twsk_unique(struct sock *sk, struct sock *sktw, void *twp)
|
||||
{
|
||||
if (sk->sk_prot->twsk_prot->twsk_unique != NULL)
|
||||
return sk->sk_prot->twsk_prot->twsk_unique(sk, sktw, twp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* _TIMEWAIT_SOCK_H */
|
@ -44,7 +44,7 @@ extern int datagram_send_ctl(struct msghdr *msg,
|
||||
/*
|
||||
* address family specific functions
|
||||
*/
|
||||
extern struct tcp_func ipv4_specific;
|
||||
extern struct inet_connection_sock_af_ops ipv4_specific;
|
||||
|
||||
extern int inet6_destroy_sock(struct sock *sk);
|
||||
|
||||
|
@ -22,9 +22,8 @@
|
||||
#ifndef _UDP_H
|
||||
#define _UDP_H
|
||||
|
||||
#include <linux/udp.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/list.h>
|
||||
#include <net/inet_sock.h>
|
||||
#include <net/sock.h>
|
||||
#include <net/snmp.h>
|
||||
#include <linux/seq_file.h>
|
||||
@ -62,6 +61,7 @@ static inline int udp_lport_inuse(u16 num)
|
||||
|
||||
extern struct proto udp_prot;
|
||||
|
||||
struct sk_buff;
|
||||
|
||||
extern void udp_err(struct sk_buff *, u32);
|
||||
|
||||
|
@ -2,11 +2,12 @@
|
||||
#define _NET_XFRM_H
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/in.h>
|
||||
#include <linux/xfrm.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/socket.h>
|
||||
#include <linux/crypto.h>
|
||||
#include <linux/pfkeyv2.h>
|
||||
#include <linux/in6.h>
|
||||
@ -144,6 +145,9 @@ struct xfrm_state
|
||||
* transformer. */
|
||||
struct xfrm_type *type;
|
||||
|
||||
/* Security context */
|
||||
struct xfrm_sec_ctx *security;
|
||||
|
||||
/* Private data of this transformer, format is opaque,
|
||||
* interpreted by xfrm_type methods. */
|
||||
void *data;
|
||||
@ -298,6 +302,7 @@ struct xfrm_policy
|
||||
__u8 flags;
|
||||
__u8 dead;
|
||||
__u8 xfrm_nr;
|
||||
struct xfrm_sec_ctx *security;
|
||||
struct xfrm_tmpl xfrm_vec[XFRM_MAX_DEPTH];
|
||||
};
|
||||
|
||||
@ -510,6 +515,25 @@ xfrm_selector_match(struct xfrm_selector *sel, struct flowi *fl,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SECURITY_NETWORK_XFRM
|
||||
/* If neither has a context --> match
|
||||
* Otherwise, both must have a context and the sids, doi, alg must match
|
||||
*/
|
||||
static inline int xfrm_sec_ctx_match(struct xfrm_sec_ctx *s1, struct xfrm_sec_ctx *s2)
|
||||
{
|
||||
return ((!s1 && !s2) ||
|
||||
(s1 && s2 &&
|
||||
(s1->ctx_sid == s2->ctx_sid) &&
|
||||
(s1->ctx_doi == s2->ctx_doi) &&
|
||||
(s1->ctx_alg == s2->ctx_alg)));
|
||||
}
|
||||
#else
|
||||
static inline int xfrm_sec_ctx_match(struct xfrm_sec_ctx *s1, struct xfrm_sec_ctx *s2)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* A struct encoding bundle of transformations to apply to some set of flow.
|
||||
*
|
||||
* dst->child points to the next element of bundle.
|
||||
@ -878,8 +902,8 @@ static inline int xfrm_dst_lookup(struct xfrm_dst **dst, struct flowi *fl, unsig
|
||||
struct xfrm_policy *xfrm_policy_alloc(gfp_t gfp);
|
||||
extern int xfrm_policy_walk(int (*func)(struct xfrm_policy *, int, int, void*), void *);
|
||||
int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl);
|
||||
struct xfrm_policy *xfrm_policy_bysel(int dir, struct xfrm_selector *sel,
|
||||
int delete);
|
||||
struct xfrm_policy *xfrm_policy_bysel_ctx(int dir, struct xfrm_selector *sel,
|
||||
struct xfrm_sec_ctx *ctx, int delete);
|
||||
struct xfrm_policy *xfrm_policy_byid(int dir, u32 id, int delete);
|
||||
void xfrm_policy_flush(void);
|
||||
u32 xfrm_get_acqseq(void);
|
||||
|
@ -47,7 +47,6 @@
|
||||
#include <linux/rmap.h>
|
||||
#include <linux/mempolicy.h>
|
||||
#include <linux/key.h>
|
||||
#include <net/sock.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/bugs.h>
|
||||
@ -614,9 +613,6 @@ static void __init do_basic_setup(void)
|
||||
sysctl_init();
|
||||
#endif
|
||||
|
||||
/* Networking initialization needs a process context */
|
||||
sock_init();
|
||||
|
||||
do_initcalls();
|
||||
}
|
||||
|
||||
|
@ -63,7 +63,7 @@
|
||||
#include <linux/atalk.h>
|
||||
|
||||
struct datalink_proto *ddp_dl, *aarp_dl;
|
||||
static struct proto_ops atalk_dgram_ops;
|
||||
static const struct proto_ops atalk_dgram_ops;
|
||||
|
||||
/**************************************************************************\
|
||||
* *
|
||||
@ -1763,7 +1763,7 @@ static int atalk_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr
|
||||
*/
|
||||
static int atalk_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
int rc = -EINVAL;
|
||||
int rc = -ENOIOCTLCMD;
|
||||
struct sock *sk = sock->sk;
|
||||
void __user *argp = (void __user *)arg;
|
||||
|
||||
@ -1813,23 +1813,6 @@ static int atalk_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
||||
rc = atif_ioctl(cmd, argp);
|
||||
rtnl_unlock();
|
||||
break;
|
||||
/* Physical layer ioctl calls */
|
||||
case SIOCSIFLINK:
|
||||
case SIOCGIFHWADDR:
|
||||
case SIOCSIFHWADDR:
|
||||
case SIOCGIFFLAGS:
|
||||
case SIOCSIFFLAGS:
|
||||
case SIOCGIFTXQLEN:
|
||||
case SIOCSIFTXQLEN:
|
||||
case SIOCGIFMTU:
|
||||
case SIOCGIFCONF:
|
||||
case SIOCADDMULTI:
|
||||
case SIOCDELMULTI:
|
||||
case SIOCGIFCOUNT:
|
||||
case SIOCGIFINDEX:
|
||||
case SIOCGIFNAME:
|
||||
rc = dev_ioctl(cmd, argp);
|
||||
break;
|
||||
}
|
||||
|
||||
return rc;
|
||||
@ -1841,7 +1824,7 @@ static struct net_proto_family atalk_family_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
static struct proto_ops SOCKOPS_WRAPPED(atalk_dgram_ops) = {
|
||||
static const struct proto_ops SOCKOPS_WRAPPED(atalk_dgram_ops) = {
|
||||
.family = PF_APPLETALK,
|
||||
.owner = THIS_MODULE,
|
||||
.release = atalk_release,
|
||||
|
@ -102,7 +102,7 @@ static int pvc_getname(struct socket *sock,struct sockaddr *sockaddr,
|
||||
}
|
||||
|
||||
|
||||
static struct proto_ops pvc_proto_ops = {
|
||||
static const struct proto_ops pvc_proto_ops = {
|
||||
.family = PF_ATMPVC,
|
||||
.owner = THIS_MODULE,
|
||||
|
||||
|
@ -613,7 +613,7 @@ static int svc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
||||
return error;
|
||||
}
|
||||
|
||||
static struct proto_ops svc_proto_ops = {
|
||||
static const struct proto_ops svc_proto_ops = {
|
||||
.family = PF_ATMSVC,
|
||||
.owner = THIS_MODULE,
|
||||
|
||||
|
@ -54,7 +54,7 @@
|
||||
HLIST_HEAD(ax25_list);
|
||||
DEFINE_SPINLOCK(ax25_list_lock);
|
||||
|
||||
static struct proto_ops ax25_proto_ops;
|
||||
static const struct proto_ops ax25_proto_ops;
|
||||
|
||||
static void ax25_free_sock(struct sock *sk)
|
||||
{
|
||||
@ -1827,7 +1827,7 @@ static int ax25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
||||
break;
|
||||
|
||||
default:
|
||||
res = dev_ioctl(cmd, argp);
|
||||
res = -ENOIOCTLCMD;
|
||||
break;
|
||||
}
|
||||
release_sock(sk);
|
||||
@ -1944,7 +1944,7 @@ static struct net_proto_family ax25_family_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
static struct proto_ops ax25_proto_ops = {
|
||||
static const struct proto_ops ax25_proto_ops = {
|
||||
.family = PF_AX25,
|
||||
.owner = THIS_MODULE,
|
||||
.release = ax25_release,
|
||||
|
@ -287,11 +287,10 @@ int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo)
|
||||
timeo = schedule_timeout(timeo);
|
||||
lock_sock(sk);
|
||||
|
||||
if (sk->sk_err) {
|
||||
err = sock_error(sk);
|
||||
if (err)
|
||||
break;
|
||||
}
|
||||
}
|
||||
set_current_state(TASK_RUNNING);
|
||||
remove_wait_queue(sk->sk_sleep, &wait);
|
||||
return err;
|
||||
|
@ -146,7 +146,7 @@ static int bnep_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct proto_ops bnep_sock_ops = {
|
||||
static const struct proto_ops bnep_sock_ops = {
|
||||
.family = PF_BLUETOOTH,
|
||||
.owner = THIS_MODULE,
|
||||
.release = bnep_sock_release,
|
||||
|
@ -137,7 +137,7 @@ static int cmtp_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static struct proto_ops cmtp_sock_ops = {
|
||||
static const struct proto_ops cmtp_sock_ops = {
|
||||
.family = PF_BLUETOOTH,
|
||||
.owner = THIS_MODULE,
|
||||
.release = cmtp_sock_release,
|
||||
|
@ -575,7 +575,7 @@ static int hci_sock_getsockopt(struct socket *sock, int level, int optname, char
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct proto_ops hci_sock_ops = {
|
||||
static const struct proto_ops hci_sock_ops = {
|
||||
.family = PF_BLUETOOTH,
|
||||
.owner = THIS_MODULE,
|
||||
.release = hci_sock_release,
|
||||
|
@ -143,7 +143,7 @@ static int hidp_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static struct proto_ops hidp_sock_ops = {
|
||||
static const struct proto_ops hidp_sock_ops = {
|
||||
.family = PF_BLUETOOTH,
|
||||
.owner = THIS_MODULE,
|
||||
.release = hidp_sock_release,
|
||||
|
@ -57,7 +57,7 @@
|
||||
|
||||
#define VERSION "2.8"
|
||||
|
||||
static struct proto_ops l2cap_sock_ops;
|
||||
static const struct proto_ops l2cap_sock_ops;
|
||||
|
||||
static struct bt_sock_list l2cap_sk_list = {
|
||||
.lock = RW_LOCK_UNLOCKED
|
||||
@ -767,8 +767,9 @@ static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct ms
|
||||
|
||||
BT_DBG("sock %p, sk %p", sock, sk);
|
||||
|
||||
if (sk->sk_err)
|
||||
return sock_error(sk);
|
||||
err = sock_error(sk);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (msg->msg_flags & MSG_OOB)
|
||||
return -EOPNOTSUPP;
|
||||
@ -2160,7 +2161,7 @@ static ssize_t l2cap_sysfs_show(struct class *dev, char *buf)
|
||||
|
||||
static CLASS_ATTR(l2cap, S_IRUGO, l2cap_sysfs_show, NULL);
|
||||
|
||||
static struct proto_ops l2cap_sock_ops = {
|
||||
static const struct proto_ops l2cap_sock_ops = {
|
||||
.family = PF_BLUETOOTH,
|
||||
.owner = THIS_MODULE,
|
||||
.release = l2cap_sock_release,
|
||||
|
@ -58,7 +58,7 @@
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
static struct proto_ops rfcomm_sock_ops;
|
||||
static const struct proto_ops rfcomm_sock_ops;
|
||||
|
||||
static struct bt_sock_list rfcomm_sk_list = {
|
||||
.lock = RW_LOCK_UNLOCKED
|
||||
@ -907,7 +907,7 @@ static ssize_t rfcomm_sock_sysfs_show(struct class *dev, char *buf)
|
||||
|
||||
static CLASS_ATTR(rfcomm, S_IRUGO, rfcomm_sock_sysfs_show, NULL);
|
||||
|
||||
static struct proto_ops rfcomm_sock_ops = {
|
||||
static const struct proto_ops rfcomm_sock_ops = {
|
||||
.family = PF_BLUETOOTH,
|
||||
.owner = THIS_MODULE,
|
||||
.release = rfcomm_sock_release,
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user