Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts: drivers/net/wireless/rt2x00/rt2x00dev.c net/8021q/vlan_dev.c
This commit is contained in:
@@ -209,6 +209,7 @@ int sctp_add_bind_addr(struct sctp_bind_addr *bp, union sctp_addr *new,
|
||||
int sctp_del_bind_addr(struct sctp_bind_addr *bp, union sctp_addr *del_addr)
|
||||
{
|
||||
struct sctp_sockaddr_entry *addr, *temp;
|
||||
int found = 0;
|
||||
|
||||
/* We hold the socket lock when calling this function,
|
||||
* and that acts as a writer synchronizing lock.
|
||||
@@ -216,13 +217,14 @@ int sctp_del_bind_addr(struct sctp_bind_addr *bp, union sctp_addr *del_addr)
|
||||
list_for_each_entry_safe(addr, temp, &bp->address_list, list) {
|
||||
if (sctp_cmp_addr_exact(&addr->a, del_addr)) {
|
||||
/* Found the exact match. */
|
||||
found = 1;
|
||||
addr->valid = 0;
|
||||
list_del_rcu(&addr->list);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (addr && !addr->valid) {
|
||||
if (found) {
|
||||
call_rcu(&addr->rcu, sctp_local_addr_free);
|
||||
SCTP_DBG_OBJCNT_DEC(addr);
|
||||
return 0;
|
||||
|
@@ -944,7 +944,7 @@ static struct sctp_association *__sctp_rcv_init_lookup(struct sk_buff *skb,
|
||||
static struct sctp_association *__sctp_rcv_asconf_lookup(
|
||||
sctp_chunkhdr_t *ch,
|
||||
const union sctp_addr *laddr,
|
||||
__be32 peer_port,
|
||||
__be16 peer_port,
|
||||
struct sctp_transport **transportp)
|
||||
{
|
||||
sctp_addip_chunk_t *asconf = (struct sctp_addip_chunk *)ch;
|
||||
|
@@ -89,6 +89,7 @@ static int sctp_inet6addr_event(struct notifier_block *this, unsigned long ev,
|
||||
struct inet6_ifaddr *ifa = (struct inet6_ifaddr *)ptr;
|
||||
struct sctp_sockaddr_entry *addr = NULL;
|
||||
struct sctp_sockaddr_entry *temp;
|
||||
int found = 0;
|
||||
|
||||
switch (ev) {
|
||||
case NETDEV_UP:
|
||||
@@ -111,13 +112,14 @@ static int sctp_inet6addr_event(struct notifier_block *this, unsigned long ev,
|
||||
&sctp_local_addr_list, list) {
|
||||
if (ipv6_addr_equal(&addr->a.v6.sin6_addr,
|
||||
&ifa->addr)) {
|
||||
found = 1;
|
||||
addr->valid = 0;
|
||||
list_del_rcu(&addr->list);
|
||||
break;
|
||||
}
|
||||
}
|
||||
spin_unlock_bh(&sctp_local_addr_lock);
|
||||
if (addr && !addr->valid)
|
||||
if (found)
|
||||
call_rcu(&addr->rcu, sctp_local_addr_free);
|
||||
break;
|
||||
}
|
||||
|
@@ -337,14 +337,14 @@ static int sctp_v4_cmp_addr(const union sctp_addr *addr1,
|
||||
static void sctp_v4_inaddr_any(union sctp_addr *addr, __be16 port)
|
||||
{
|
||||
addr->v4.sin_family = AF_INET;
|
||||
addr->v4.sin_addr.s_addr = INADDR_ANY;
|
||||
addr->v4.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||
addr->v4.sin_port = port;
|
||||
}
|
||||
|
||||
/* Is this a wildcard address? */
|
||||
static int sctp_v4_is_any(const union sctp_addr *addr)
|
||||
{
|
||||
return INADDR_ANY == addr->v4.sin_addr.s_addr;
|
||||
return htonl(INADDR_ANY) == addr->v4.sin_addr.s_addr;
|
||||
}
|
||||
|
||||
/* This function checks if the address is a valid address to be used for
|
||||
@@ -375,7 +375,7 @@ static int sctp_v4_available(union sctp_addr *addr, struct sctp_sock *sp)
|
||||
int ret = inet_addr_type(&init_net, addr->v4.sin_addr.s_addr);
|
||||
|
||||
|
||||
if (addr->v4.sin_addr.s_addr != INADDR_ANY &&
|
||||
if (addr->v4.sin_addr.s_addr != htonl(INADDR_ANY) &&
|
||||
ret != RTN_LOCAL &&
|
||||
!sp->inet.freebind &&
|
||||
!sysctl_ip_nonlocal_bind)
|
||||
@@ -628,6 +628,7 @@ static int sctp_inetaddr_event(struct notifier_block *this, unsigned long ev,
|
||||
struct in_ifaddr *ifa = (struct in_ifaddr *)ptr;
|
||||
struct sctp_sockaddr_entry *addr = NULL;
|
||||
struct sctp_sockaddr_entry *temp;
|
||||
int found = 0;
|
||||
|
||||
if (ifa->ifa_dev->dev->nd_net != &init_net)
|
||||
return NOTIFY_DONE;
|
||||
@@ -650,13 +651,14 @@ static int sctp_inetaddr_event(struct notifier_block *this, unsigned long ev,
|
||||
list_for_each_entry_safe(addr, temp,
|
||||
&sctp_local_addr_list, list) {
|
||||
if (addr->a.v4.sin_addr.s_addr == ifa->ifa_local) {
|
||||
found = 1;
|
||||
addr->valid = 0;
|
||||
list_del_rcu(&addr->list);
|
||||
break;
|
||||
}
|
||||
}
|
||||
spin_unlock_bh(&sctp_local_addr_lock);
|
||||
if (addr && !addr->valid)
|
||||
if (found)
|
||||
call_rcu(&addr->rcu, sctp_local_addr_free);
|
||||
break;
|
||||
}
|
||||
@@ -786,8 +788,8 @@ static int sctp_inet_cmp_addr(const union sctp_addr *addr1,
|
||||
/* PF_INET only supports AF_INET addresses. */
|
||||
if (addr1->sa.sa_family != addr2->sa.sa_family)
|
||||
return 0;
|
||||
if (INADDR_ANY == addr1->v4.sin_addr.s_addr ||
|
||||
INADDR_ANY == addr2->v4.sin_addr.s_addr)
|
||||
if (htonl(INADDR_ANY) == addr1->v4.sin_addr.s_addr ||
|
||||
htonl(INADDR_ANY) == addr2->v4.sin_addr.s_addr)
|
||||
return 1;
|
||||
if (addr1->v4.sin_addr.s_addr == addr2->v4.sin_addr.s_addr)
|
||||
return 1;
|
||||
|
@@ -2375,6 +2375,14 @@ static int sctp_process_param(struct sctp_association *asoc,
|
||||
asoc->peer.ipv4_address = 0;
|
||||
asoc->peer.ipv6_address = 0;
|
||||
|
||||
/* Assume that peer supports the address family
|
||||
* by which it sends a packet.
|
||||
*/
|
||||
if (peer_addr->sa.sa_family == AF_INET6)
|
||||
asoc->peer.ipv6_address = 1;
|
||||
else if (peer_addr->sa.sa_family == AF_INET)
|
||||
asoc->peer.ipv4_address = 1;
|
||||
|
||||
/* Cycle through address types; avoid divide by 0. */
|
||||
sat = ntohs(param.p->length) - sizeof(sctp_paramhdr_t);
|
||||
if (sat)
|
||||
|
@@ -2933,17 +2933,39 @@ static int sctp_setsockopt_maxburst(struct sock *sk,
|
||||
char __user *optval,
|
||||
int optlen)
|
||||
{
|
||||
struct sctp_assoc_value params;
|
||||
struct sctp_sock *sp;
|
||||
struct sctp_association *asoc;
|
||||
int val;
|
||||
int assoc_id = 0;
|
||||
|
||||
if (optlen != sizeof(int))
|
||||
return -EINVAL;
|
||||
if (get_user(val, (int __user *)optval))
|
||||
return -EFAULT;
|
||||
|
||||
if (val < 0)
|
||||
if (optlen < sizeof(int))
|
||||
return -EINVAL;
|
||||
|
||||
sctp_sk(sk)->max_burst = val;
|
||||
if (optlen == sizeof(int)) {
|
||||
printk(KERN_WARNING
|
||||
"SCTP: Use of int in max_burst socket option deprecated\n");
|
||||
printk(KERN_WARNING
|
||||
"SCTP: Use struct sctp_assoc_value instead\n");
|
||||
if (copy_from_user(&val, optval, optlen))
|
||||
return -EFAULT;
|
||||
} else if (optlen == sizeof(struct sctp_assoc_value)) {
|
||||
if (copy_from_user(¶ms, optval, optlen))
|
||||
return -EFAULT;
|
||||
val = params.assoc_value;
|
||||
assoc_id = params.assoc_id;
|
||||
} else
|
||||
return -EINVAL;
|
||||
|
||||
sp = sctp_sk(sk);
|
||||
|
||||
if (assoc_id != 0) {
|
||||
asoc = sctp_id2assoc(sk, assoc_id);
|
||||
if (!asoc)
|
||||
return -EINVAL;
|
||||
asoc->max_burst = val;
|
||||
} else
|
||||
sp->max_burst = val;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -5005,20 +5027,45 @@ static int sctp_getsockopt_maxburst(struct sock *sk, int len,
|
||||
char __user *optval,
|
||||
int __user *optlen)
|
||||
{
|
||||
int val;
|
||||
struct sctp_assoc_value params;
|
||||
struct sctp_sock *sp;
|
||||
struct sctp_association *asoc;
|
||||
|
||||
if (len < sizeof(int))
|
||||
return -EINVAL;
|
||||
|
||||
len = sizeof(int);
|
||||
if (len == sizeof(int)) {
|
||||
printk(KERN_WARNING
|
||||
"SCTP: Use of int in max_burst socket option deprecated\n");
|
||||
printk(KERN_WARNING
|
||||
"SCTP: Use struct sctp_assoc_value instead\n");
|
||||
params.assoc_id = 0;
|
||||
} else if (len == sizeof (struct sctp_assoc_value)) {
|
||||
if (copy_from_user(¶ms, optval, len))
|
||||
return -EFAULT;
|
||||
} else
|
||||
return -EINVAL;
|
||||
|
||||
val = sctp_sk(sk)->max_burst;
|
||||
if (put_user(len, optlen))
|
||||
return -EFAULT;
|
||||
if (copy_to_user(optval, &val, len))
|
||||
return -EFAULT;
|
||||
sp = sctp_sk(sk);
|
||||
|
||||
if (params.assoc_id != 0) {
|
||||
asoc = sctp_id2assoc(sk, params.assoc_id);
|
||||
if (!asoc)
|
||||
return -EINVAL;
|
||||
params.assoc_value = asoc->max_burst;
|
||||
} else
|
||||
params.assoc_value = sp->max_burst;
|
||||
|
||||
if (len == sizeof(int)) {
|
||||
if (copy_to_user(optval, ¶ms.assoc_value, len))
|
||||
return -EFAULT;
|
||||
} else {
|
||||
if (copy_to_user(optval, ¶ms, len))
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static int sctp_getsockopt_hmac_ident(struct sock *sk, int len,
|
||||
|
Reference in New Issue
Block a user