]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - net/sctp/associola.c
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6
[mv-sheeva.git] / net / sctp / associola.c
index 22c2519d3fd84e7bc32dde22c4e9bb6c5f38a0bb..fca6f75b0a0d8b553ea4c55f2484538f304e69ce 100644 (file)
@@ -61,7 +61,7 @@
 #include <net/sctp/sm.h>
 
 /* Forward declarations for internal functions. */
-static void sctp_assoc_bh_rcv(struct sctp_association *asoc);
+static void sctp_assoc_bh_rcv(struct work_struct *work);
 
 
 /* 1st Level Abstractions. */
@@ -158,14 +158,14 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a
         * If the 'T5-shutdown-guard' timer is used, it SHOULD be set to the
         * recommended value of 5 times 'RTO.Max'.
         */
-        asoc->timeouts[SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD]
+       asoc->timeouts[SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD]
                = 5 * asoc->rto_max;
 
        asoc->timeouts[SCTP_EVENT_TIMEOUT_HEARTBEAT] = 0;
        asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] = asoc->sackdelay;
        asoc->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE] =
                sp->autoclose * HZ;
-       
+
        /* Initilizes the timers */
        for (i = SCTP_EVENT_TIMEOUT_NONE; i < SCTP_NUM_TIMEOUT_TYPES; ++i) {
                init_timer(&asoc->timers[i]);
@@ -269,9 +269,7 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a
 
        /* Create an input queue.  */
        sctp_inq_init(&asoc->base.inqueue);
-       sctp_inq_set_th_handler(&asoc->base.inqueue,
-                                   (void (*)(void *))sctp_assoc_bh_rcv,
-                                   asoc);
+       sctp_inq_set_th_handler(&asoc->base.inqueue, sctp_assoc_bh_rcv);
 
        /* Create an output queue.  */
        sctp_outq_init(asoc, &asoc->outqueue);
@@ -300,6 +298,7 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a
        asoc->default_flags = sp->default_flags;
        asoc->default_context = sp->default_context;
        asoc->default_timetolive = sp->default_timetolive;
+       asoc->default_rcv_context = sp->default_rcv_context;
 
        return asoc;
 
@@ -487,8 +486,8 @@ void sctp_assoc_rm_peer(struct sctp_association *asoc,
        SCTP_DEBUG_PRINTK_IPADDR("sctp_assoc_rm_peer:association %p addr: ",
                                 " port: %d\n",
                                 asoc,
-                                (&peer->ipaddr_h),
-                                peer->ipaddr_h.v4.sin_port);
+                                (&peer->ipaddr),
+                                ntohs(peer->ipaddr.v4.sin_port));
 
        /* If we are to remove the current retran_path, update it
         * to the next peer before removing this peer from the list.
@@ -537,13 +536,13 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc,
        sp = sctp_sk(asoc->base.sk);
 
        /* AF_INET and AF_INET6 share common port field. */
-       port = addr->v4.sin_port;
+       port = ntohs(addr->v4.sin_port);
 
        SCTP_DEBUG_PRINTK_IPADDR("sctp_assoc_add_peer:association %p addr: ",
                                 " port: %d state:%d\n",
                                 asoc,
                                 addr,
-                                addr->v4.sin_port,
+                                port,
                                 peer_state);
 
        /* Set the port if it has not been set yet.  */
@@ -666,13 +665,10 @@ void sctp_assoc_del_peer(struct sctp_association *asoc,
        struct list_head        *pos;
        struct list_head        *temp;
        struct sctp_transport   *transport;
-       union sctp_addr tmp;
-
-       flip_to_n(&tmp, addr);
 
        list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) {
                transport = list_entry(pos, struct sctp_transport, transports);
-               if (sctp_cmp_addr_exact(&tmp, &transport->ipaddr)) {
+               if (sctp_cmp_addr_exact(addr, &transport->ipaddr)) {
                        /* Do book keeping for removing the peer and free it. */
                        sctp_assoc_rm_peer(asoc, transport);
                        break;
@@ -687,14 +683,12 @@ struct sctp_transport *sctp_assoc_lookup_paddr(
 {
        struct sctp_transport *t;
        struct list_head *pos;
-       union sctp_addr tmp;
 
-       flip_to_n(&tmp, address);
        /* Cycle through all transports searching for a peer address. */
 
        list_for_each(pos, &asoc->peer.transport_addr_list) {
                t = list_entry(pos, struct sctp_transport, transports);
-               if (sctp_cmp_addr_exact(&tmp, &t->ipaddr))
+               if (sctp_cmp_addr_exact(address, &t->ipaddr))
                        return t;
        }
 
@@ -738,7 +732,7 @@ void sctp_assoc_control_transport(struct sctp_association *asoc,
         * user.
         */
        memset(&addr, 0, sizeof(struct sockaddr_storage));
-       flip_to_n((union sctp_addr *)&addr, &transport->ipaddr_h);
+       memcpy(&addr, &transport->ipaddr, transport->af_specific->sockaddr_len);
        event = sctp_ulpevent_make_peer_addr_change(asoc, &addr,
                                0, spc_state, error, GFP_ATOMIC);
        if (event)
@@ -930,18 +924,16 @@ struct sctp_transport *sctp_assoc_is_match(struct sctp_association *asoc,
                                           const union sctp_addr *paddr)
 {
        struct sctp_transport *transport;
-       union sctp_addr tmp;
-       flip_to_n(&tmp, laddr);
 
        sctp_read_lock(&asoc->base.addr_lock);
 
-       if ((asoc->base.bind_addr.port == laddr->v4.sin_port) &&
-           (asoc->peer.port == paddr->v4.sin_port)) {
+       if ((htons(asoc->base.bind_addr.port) == laddr->v4.sin_port) &&
+           (htons(asoc->peer.port) == paddr->v4.sin_port)) {
                transport = sctp_assoc_lookup_paddr(asoc, paddr);
                if (!transport)
                        goto out;
 
-               if (sctp_bind_addr_match(&asoc->base.bind_addr, &tmp,
+               if (sctp_bind_addr_match(&asoc->base.bind_addr, laddr,
                                         sctp_sk(asoc->base.sk)))
                        goto out;
        }
@@ -953,8 +945,11 @@ out:
 }
 
 /* Do delayed input processing.  This is scheduled by sctp_rcv(). */
-static void sctp_assoc_bh_rcv(struct sctp_association *asoc)
+static void sctp_assoc_bh_rcv(struct work_struct *work)
 {
+       struct sctp_association *asoc =
+               container_of(work, struct sctp_association,
+                            base.inqueue.immediate);
        struct sctp_endpoint *ep;
        struct sctp_chunk *chunk;
        struct sock *sk;
@@ -1050,8 +1045,8 @@ void sctp_assoc_update(struct sctp_association *asoc,
        /* Remove any peer addresses not present in the new association. */
        list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) {
                trans = list_entry(pos, struct sctp_transport, transports);
-               if (!sctp_assoc_lookup_paddr(new, &trans->ipaddr_h))
-                       sctp_assoc_del_peer(asoc, &trans->ipaddr_h);
+               if (!sctp_assoc_lookup_paddr(new, &trans->ipaddr))
+                       sctp_assoc_del_peer(asoc, &trans->ipaddr);
        }
 
        /* If the case is A (association restart), use
@@ -1074,8 +1069,8 @@ void sctp_assoc_update(struct sctp_association *asoc,
                list_for_each(pos, &new->peer.transport_addr_list) {
                        trans = list_entry(pos, struct sctp_transport,
                                           transports);
-                       if (!sctp_assoc_lookup_paddr(asoc, &trans->ipaddr_h))
-                               sctp_assoc_add_peer(asoc, &trans->ipaddr_h,
+                       if (!sctp_assoc_lookup_paddr(asoc, &trans->ipaddr))
+                               sctp_assoc_add_peer(asoc, &trans->ipaddr,
                                                    GFP_ATOMIC, trans->state);
                }
 
@@ -1143,8 +1138,8 @@ void sctp_assoc_update_retran_path(struct sctp_association *asoc)
                                 " %p addr: ",
                                 " port: %d\n",
                                 asoc,
-                                (&t->ipaddr_h),
-                                t->ipaddr_h.v4.sin_port);
+                                (&t->ipaddr),
+                                ntohs(t->ipaddr.v4.sin_port));
 }
 
 /* Choose the transport for sending a INIT packet.  */
@@ -1168,8 +1163,8 @@ struct sctp_transport *sctp_assoc_choose_init_transport(
                                 " %p addr: ",
                                 " port: %d\n",
                                 asoc,
-                                (&t->ipaddr_h),
-                                t->ipaddr_h.v4.sin_port);
+                                (&t->ipaddr),
+                                ntohs(t->ipaddr.v4.sin_port));
 
        return t;
 }
@@ -1314,7 +1309,7 @@ int sctp_assoc_set_bind_addr_from_ep(struct sctp_association *asoc,
        /* Use scoping rules to determine the subset of addresses from
         * the endpoint.
         */
-       scope = sctp_scope(&asoc->peer.active_path->ipaddr_h);
+       scope = sctp_scope(&asoc->peer.active_path->ipaddr);
        flags = (PF_INET6 == asoc->base.sk->sk_family) ? SCTP_ADDR6_ALLOWED : 0;
        if (asoc->peer.ipv4_address)
                flags |= SCTP_ADDR4_PEERSUPP;
@@ -1339,8 +1334,8 @@ int sctp_assoc_set_bind_addr_from_cookie(struct sctp_association *asoc,
                                      asoc->ep->base.bind_addr.port, gfp);
 }
 
-/* Lookup laddr in the bind address list of an association. */ 
-int sctp_assoc_lookup_laddr(struct sctp_association *asoc, 
+/* Lookup laddr in the bind address list of an association. */
+int sctp_assoc_lookup_laddr(struct sctp_association *asoc,
                            const union sctp_addr *laddr)
 {
        int found;
@@ -1348,7 +1343,7 @@ int sctp_assoc_lookup_laddr(struct sctp_association *asoc,
        sctp_read_lock(&asoc->base.addr_lock);
        if ((asoc->base.bind_addr.port == ntohs(laddr->v4.sin_port)) &&
            sctp_bind_addr_match(&asoc->base.bind_addr, laddr,
-                                sctp_sk(asoc->base.sk))) {
+                                sctp_sk(asoc->base.sk))) {
                found = 1;
                goto out;
        }