Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
authorLinus Torvalds <torvalds@woody.linux-foundation.org>
Fri, 7 Dec 2007 18:59:48 +0000 (10:59 -0800)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Fri, 7 Dec 2007 18:59:48 +0000 (10:59 -0800)
* 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6:
  [AF_RXRPC]: Add a missing goto
  [VLAN]: Lost rtnl_unlock() in vlan_ioctl()
  [SCTP]: Fix the bind_addr info during migration.
  [SCTP]: Add bind hash locking to the migrate code
  [IPV4]: Remove prototype of ip_rt_advice
  [IPv4]: Reply net unreachable ICMP message
  [IPv6] SNMP: Increment OutNoRoutes when connecting to unreachable network
  [BRIDGE]: Section fix.
  [NIU]: Fix link LED handling.

drivers/net/niu.c
include/net/route.h
include/net/sctp/structs.h
net/8021q/vlan.c
net/bridge/br_fdb.c
net/ipv4/route.c
net/ipv6/ip6_output.c
net/rxrpc/rxkad.c
net/sctp/bind_addr.c
net/sctp/socket.c

index 112ab07..abfc61c 100644 (file)
@@ -1045,6 +1045,7 @@ static int niu_serdes_init(struct niu *np)
 }
 
 static void niu_init_xif(struct niu *);
+static void niu_handle_led(struct niu *, int status);
 
 static int niu_link_status_common(struct niu *np, int link_up)
 {
@@ -1066,11 +1067,15 @@ static int niu_link_status_common(struct niu *np, int link_up)
 
                spin_lock_irqsave(&np->lock, flags);
                niu_init_xif(np);
+               niu_handle_led(np, 1);
                spin_unlock_irqrestore(&np->lock, flags);
 
                netif_carrier_on(dev);
        } else if (netif_carrier_ok(dev) && !link_up) {
                niuwarn(LINK, "%s: Link is down\n", dev->name);
+               spin_lock_irqsave(&np->lock, flags);
+               niu_handle_led(np, 0);
+               spin_unlock_irqrestore(&np->lock, flags);
                netif_carrier_off(dev);
        }
 
@@ -3915,16 +3920,14 @@ static int niu_init_ipp(struct niu *np)
        return 0;
 }
 
-static void niu_init_xif_xmac(struct niu *np)
+static void niu_handle_led(struct niu *np, int status)
 {
-       struct niu_link_config *lp = &np->link_config;
        u64 val;
-
        val = nr64_mac(XMAC_CONFIG);
 
        if ((np->flags & NIU_FLAGS_10G) != 0 &&
            (np->flags & NIU_FLAGS_FIBER) != 0) {
-               if (netif_carrier_ok(np->dev)) {
+               if (status) {
                        val |= XMAC_CONFIG_LED_POLARITY;
                        val &= ~XMAC_CONFIG_FORCE_LED_ON;
                } else {
@@ -3933,6 +3936,15 @@ static void niu_init_xif_xmac(struct niu *np)
                }
        }
 
+       nw64_mac(XMAC_CONFIG, val);
+}
+
+static void niu_init_xif_xmac(struct niu *np)
+{
+       struct niu_link_config *lp = &np->link_config;
+       u64 val;
+
+       val = nr64_mac(XMAC_CONFIG);
        val &= ~XMAC_CONFIG_SEL_POR_CLK_SRC;
 
        val |= XMAC_CONFIG_TX_OUTPUT_EN;
@@ -4776,6 +4788,8 @@ static int niu_close(struct net_device *dev)
 
        niu_free_channels(np);
 
+       niu_handle_led(np, 0);
+
        return 0;
 }
 
index f7ce625..59b0b19 100644 (file)
@@ -109,7 +109,6 @@ struct in_device;
 extern int             ip_rt_init(void);
 extern void            ip_rt_redirect(__be32 old_gw, __be32 dst, __be32 new_gw,
                                       __be32 src, struct net_device *dev);
-extern void            ip_rt_advice(struct rtable **rp, int advice);
 extern void            rt_cache_flush(int how);
 extern int             __ip_route_output_key(struct rtable **, const struct flowi *flp);
 extern int             ip_route_output_key(struct rtable **, struct flowi *flp);
index eb3113c..002a00a 100644 (file)
@@ -1184,6 +1184,9 @@ int sctp_bind_addr_copy(struct sctp_bind_addr *dest,
                        const struct sctp_bind_addr *src,
                        sctp_scope_t scope, gfp_t gfp,
                        int flags);
+int sctp_bind_addr_dup(struct sctp_bind_addr *dest,
+                       const struct sctp_bind_addr *src,
+                       gfp_t gfp);
 int sctp_add_bind_addr(struct sctp_bind_addr *, union sctp_addr *,
                       __u8 use_as_src, gfp_t gfp);
 int sctp_del_bind_addr(struct sctp_bind_addr *, union sctp_addr *);
index 6567213..5b18315 100644 (file)
@@ -776,7 +776,7 @@ static int vlan_ioctl_handler(struct net *net, void __user *arg)
        case SET_VLAN_NAME_TYPE_CMD:
                err = -EPERM;
                if (!capable(CAP_NET_ADMIN))
-                       return -EPERM;
+                       break;
                if ((args.u.name_type >= 0) &&
                    (args.u.name_type < VLAN_NAME_TYPE_HIGHEST)) {
                        vlan_name_type = args.u.name_type;
index eb57502..bc40377 100644 (file)
@@ -44,7 +44,7 @@ int __init br_fdb_init(void)
        return 0;
 }
 
-void __exit br_fdb_fini(void)
+void br_fdb_fini(void)
 {
        kmem_cache_destroy(br_fdb_cache);
 }
index c426dec..d2bc614 100644 (file)
@@ -1161,7 +1161,7 @@ static struct dst_entry *ipv4_negative_advice(struct dst_entry *dst)
                        unsigned hash = rt_hash(rt->fl.fl4_dst, rt->fl.fl4_src,
                                                rt->fl.oif);
 #if RT_CACHE_DEBUG >= 1
-                       printk(KERN_DEBUG "ip_rt_advice: redirect to "
+                       printk(KERN_DEBUG "ipv4_negative_advice: redirect to "
                                          "%u.%u.%u.%u/%02x dropped\n",
                                NIPQUAD(rt->rt_dst), rt->fl.fl4_tos);
 #endif
@@ -1252,6 +1252,7 @@ static int ip_error(struct sk_buff *skb)
                        break;
                case ENETUNREACH:
                        code = ICMP_NET_UNREACH;
+                       IP_INC_STATS_BH(IPSTATS_MIB_INNOROUTES);
                        break;
                case EACCES:
                        code = ICMP_PKT_FILTERED;
@@ -1881,6 +1882,8 @@ no_route:
        RT_CACHE_STAT_INC(in_no_route);
        spec_dst = inet_select_addr(dev, 0, RT_SCOPE_UNIVERSE);
        res.type = RTN_UNREACHABLE;
+       if (err == -ESRCH)
+               err = -ENETUNREACH;
        goto local_input;
 
        /*
index 86e1835..6338a9c 100644 (file)
@@ -933,6 +933,8 @@ static int ip6_dst_lookup_tail(struct sock *sk,
        return 0;
 
 out_err_release:
+       if (err == -ENETUNREACH)
+               IP6_INC_STATS_BH(NULL, IPSTATS_MIB_OUTNOROUTES);
        dst_release(*dst);
        *dst = NULL;
        return err;
index e09a95a..8e69d69 100644 (file)
@@ -1021,6 +1021,7 @@ static int rxkad_verify_response(struct rxrpc_connection *conn,
 
        abort_code = RXKADINCONSISTENCY;
        if (version != RXKAD_VERSION)
+               goto protocol_error;
 
        abort_code = RXKADTICKETLEN;
        if (ticket_len < 4 || ticket_len > MAXKRB5TICKETLEN)
index cae95af..6a7d010 100644 (file)
@@ -105,6 +105,32 @@ out:
        return error;
 }
 
+/* Exactly duplicate the address lists.  This is necessary when doing
+ * peer-offs and accepts.  We don't want to put all the current system
+ * addresses into the endpoint.  That's useless.  But we do want duplicat
+ * the list of bound addresses that the older endpoint used.
+ */
+int sctp_bind_addr_dup(struct sctp_bind_addr *dest,
+                       const struct sctp_bind_addr *src,
+                       gfp_t gfp)
+{
+       struct sctp_sockaddr_entry *addr;
+       struct list_head *pos;
+       int error = 0;
+
+       /* All addresses share the same port.  */
+       dest->port = src->port;
+
+       list_for_each(pos, &src->address_list) {
+               addr = list_entry(pos, struct sctp_sockaddr_entry, list);
+               error = sctp_add_bind_addr(dest, &addr->a, 1, gfp);
+               if (error < 0)
+                       break;
+       }
+
+       return error;
+}
+
 /* Initialize the SCTP_bind_addr structure for either an endpoint or
  * an association.
  */
index ff8bc95..ea9649c 100644 (file)
@@ -6325,7 +6325,7 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
        struct sctp_endpoint *newep = newsp->ep;
        struct sk_buff *skb, *tmp;
        struct sctp_ulpevent *event;
-       int flags = 0;
+       struct sctp_bind_hashbucket *head;
 
        /* Migrate socket buffer sizes and all the socket level options to the
         * new socket.
@@ -6342,23 +6342,21 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
        newsp->hmac = NULL;
 
        /* Hook this new socket in to the bind_hash list. */
+       head = &sctp_port_hashtable[sctp_phashfn(inet_sk(oldsk)->num)];
+       sctp_local_bh_disable();
+       sctp_spin_lock(&head->lock);
        pp = sctp_sk(oldsk)->bind_hash;
        sk_add_bind_node(newsk, &pp->owner);
        sctp_sk(newsk)->bind_hash = pp;
        inet_sk(newsk)->num = inet_sk(oldsk)->num;
+       sctp_spin_unlock(&head->lock);
+       sctp_local_bh_enable();
 
        /* Copy the bind_addr list from the original endpoint to the new
         * endpoint so that we can handle restarts properly
         */
-       if (PF_INET6 == assoc->base.sk->sk_family)
-               flags = SCTP_ADDR6_ALLOWED;
-       if (assoc->peer.ipv4_address)
-               flags |= SCTP_ADDR4_PEERSUPP;
-       if (assoc->peer.ipv6_address)
-               flags |= SCTP_ADDR6_PEERSUPP;
-       sctp_bind_addr_copy(&newsp->ep->base.bind_addr,
-                            &oldsp->ep->base.bind_addr,
-                            SCTP_SCOPE_GLOBAL, GFP_KERNEL, flags);
+       sctp_bind_addr_dup(&newsp->ep->base.bind_addr,
+                               &oldsp->ep->base.bind_addr, GFP_KERNEL);
 
        /* Move any messages in the old socket's receive queue that are for the
         * peeled off association to the new socket's receive queue.