Merge tag 'for-linus-4.6-rc0-tag' of git://git.kernel.org/pub/scm/linux/kernel/git...
[deliverable/linux.git] / net / rxrpc / af_rxrpc.c
index 7e2d1057d8bc1cd89ed9041b4c658b58626f26aa..9d935fa5a2a98884beca08329433cf66dbafebdc 100644 (file)
@@ -37,7 +37,7 @@ static struct proto rxrpc_proto;
 static const struct proto_ops rxrpc_rpc_ops;
 
 /* local epoch for detecting local-end reset */
-__be32 rxrpc_epoch;
+u32 rxrpc_epoch;
 
 /* current debugging ID */
 atomic_t rxrpc_debug_id;
@@ -81,6 +81,8 @@ static int rxrpc_validate_address(struct rxrpc_sock *rx,
                                  struct sockaddr_rxrpc *srx,
                                  int len)
 {
+       unsigned int tail;
+
        if (len < sizeof(struct sockaddr_rxrpc))
                return -EINVAL;
 
@@ -103,9 +105,7 @@ static int rxrpc_validate_address(struct rxrpc_sock *rx,
                _debug("INET: %x @ %pI4",
                       ntohs(srx->transport.sin.sin_port),
                       &srx->transport.sin.sin_addr);
-               if (srx->transport_len > 8)
-                       memset((void *)&srx->transport + 8, 0,
-                              srx->transport_len - 8);
+               tail = offsetof(struct sockaddr_rxrpc, transport.sin.__pad);
                break;
 
        case AF_INET6:
@@ -113,6 +113,8 @@ static int rxrpc_validate_address(struct rxrpc_sock *rx,
                return -EAFNOSUPPORT;
        }
 
+       if (tail < len)
+               memset((void *)srx + tail, 0, len - tail);
        return 0;
 }
 
@@ -121,11 +123,10 @@ static int rxrpc_validate_address(struct rxrpc_sock *rx,
  */
 static int rxrpc_bind(struct socket *sock, struct sockaddr *saddr, int len)
 {
-       struct sockaddr_rxrpc *srx = (struct sockaddr_rxrpc *) saddr;
+       struct sockaddr_rxrpc *srx = (struct sockaddr_rxrpc *)saddr;
        struct sock *sk = sock->sk;
        struct rxrpc_local *local;
        struct rxrpc_sock *rx = rxrpc_sk(sk), *prx;
-       __be16 service_id;
        int ret;
 
        _enter("%p,%p,%d", rx, saddr, len);
@@ -143,7 +144,7 @@ static int rxrpc_bind(struct socket *sock, struct sockaddr *saddr, int len)
 
        memcpy(&rx->srx, srx, sizeof(rx->srx));
 
-       /* find a local transport endpoint if we don't have one already */
+       /* Find or create a local transport endpoint to use */
        local = rxrpc_lookup_local(&rx->srx);
        if (IS_ERR(local)) {
                ret = PTR_ERR(local);
@@ -152,14 +153,12 @@ static int rxrpc_bind(struct socket *sock, struct sockaddr *saddr, int len)
 
        rx->local = local;
        if (srx->srx_service) {
-               service_id = htons(srx->srx_service);
                write_lock_bh(&local->services_lock);
                list_for_each_entry(prx, &local->services, listen_link) {
-                       if (prx->service_id == service_id)
+                       if (prx->srx.srx_service == srx->srx_service)
                                goto service_in_use;
                }
 
-               rx->service_id = service_id;
                list_add_tail(&rx->listen_link, &local->services);
                write_unlock_bh(&local->services_lock);
 
@@ -276,7 +275,6 @@ struct rxrpc_call *rxrpc_kernel_begin_call(struct socket *sock,
        struct rxrpc_transport *trans;
        struct rxrpc_call *call;
        struct rxrpc_sock *rx = rxrpc_sk(sock->sk);
-       __be16 service_id;
 
        _enter(",,%x,%lx", key_serial(key), user_call_ID);
 
@@ -299,16 +297,14 @@ struct rxrpc_call *rxrpc_kernel_begin_call(struct socket *sock,
                atomic_inc(&trans->usage);
        }
 
-       service_id = rx->service_id;
-       if (srx)
-               service_id = htons(srx->srx_service);
-
+       if (!srx)
+               srx = &rx->srx;
        if (!key)
                key = rx->key;
        if (key && !key->payload.data[0])
                key = NULL; /* a no-security key */
 
-       bundle = rxrpc_get_bundle(rx, trans, key, service_id, gfp);
+       bundle = rxrpc_get_bundle(rx, trans, key, srx->srx_service, gfp);
        if (IS_ERR(bundle)) {
                call = ERR_CAST(bundle);
                goto out;
@@ -324,7 +320,6 @@ out_notrans:
        _leave(" = %p", call);
        return call;
 }
-
 EXPORT_SYMBOL(rxrpc_kernel_begin_call);
 
 /**
@@ -340,7 +335,6 @@ void rxrpc_kernel_end_call(struct rxrpc_call *call)
        rxrpc_remove_user_ID(call->socket, call);
        rxrpc_put_call(call);
 }
-
 EXPORT_SYMBOL(rxrpc_kernel_end_call);
 
 /**
@@ -425,7 +419,6 @@ static int rxrpc_connect(struct socket *sock, struct sockaddr *addr,
        }
 
        rx->trans = trans;
-       rx->service_id = htons(srx->srx_service);
        rx->sk.sk_state = RXRPC_CLIENT_CONNECTED;
 
        release_sock(&rx->sk);
@@ -622,7 +615,7 @@ static int rxrpc_create(struct net *net, struct socket *sock, int protocol,
        if (!net_eq(net, &init_net))
                return -EAFNOSUPPORT;
 
-       /* we support transport protocol UDP only */
+       /* we support transport protocol UDP/UDP6 only */
        if (protocol != PF_INET)
                return -EPROTONOSUPPORT;
 
@@ -754,7 +747,7 @@ static int rxrpc_release(struct socket *sock)
  * RxRPC network protocol
  */
 static const struct proto_ops rxrpc_rpc_ops = {
-       .family         = PF_UNIX,
+       .family         = PF_RXRPC,
        .owner          = THIS_MODULE,
        .release        = rxrpc_release,
        .bind           = rxrpc_bind,
@@ -778,7 +771,7 @@ static struct proto rxrpc_proto = {
        .name           = "RXRPC",
        .owner          = THIS_MODULE,
        .obj_size       = sizeof(struct rxrpc_sock),
-       .max_header     = sizeof(struct rxrpc_header),
+       .max_header     = sizeof(struct rxrpc_wire_header),
 };
 
 static const struct net_proto_family rxrpc_family_ops = {
@@ -796,7 +789,7 @@ static int __init af_rxrpc_init(void)
 
        BUILD_BUG_ON(sizeof(struct rxrpc_skb_priv) > FIELD_SIZEOF(struct sk_buff, cb));
 
-       rxrpc_epoch = htonl(get_seconds());
+       rxrpc_epoch = get_seconds();
 
        ret = -ENOMEM;
        rxrpc_call_jar = kmem_cache_create(
This page took 0.02705 seconds and 5 git commands to generate.