diff options
Diffstat (limited to 'net/rxrpc/af_rxrpc.c')
-rw-r--r-- | net/rxrpc/af_rxrpc.c | 39 |
1 files changed, 16 insertions, 23 deletions
diff --git a/net/rxrpc/af_rxrpc.c b/net/rxrpc/af_rxrpc.c index 7e2d1057d8bc..9d935fa5a2a9 100644 --- a/net/rxrpc/af_rxrpc.c +++ b/net/rxrpc/af_rxrpc.c | |||
@@ -37,7 +37,7 @@ static struct proto rxrpc_proto; | |||
37 | static const struct proto_ops rxrpc_rpc_ops; | 37 | static const struct proto_ops rxrpc_rpc_ops; |
38 | 38 | ||
39 | /* local epoch for detecting local-end reset */ | 39 | /* local epoch for detecting local-end reset */ |
40 | __be32 rxrpc_epoch; | 40 | u32 rxrpc_epoch; |
41 | 41 | ||
42 | /* current debugging ID */ | 42 | /* current debugging ID */ |
43 | atomic_t rxrpc_debug_id; | 43 | atomic_t rxrpc_debug_id; |
@@ -81,6 +81,8 @@ static int rxrpc_validate_address(struct rxrpc_sock *rx, | |||
81 | struct sockaddr_rxrpc *srx, | 81 | struct sockaddr_rxrpc *srx, |
82 | int len) | 82 | int len) |
83 | { | 83 | { |
84 | unsigned int tail; | ||
85 | |||
84 | if (len < sizeof(struct sockaddr_rxrpc)) | 86 | if (len < sizeof(struct sockaddr_rxrpc)) |
85 | return -EINVAL; | 87 | return -EINVAL; |
86 | 88 | ||
@@ -103,9 +105,7 @@ static int rxrpc_validate_address(struct rxrpc_sock *rx, | |||
103 | _debug("INET: %x @ %pI4", | 105 | _debug("INET: %x @ %pI4", |
104 | ntohs(srx->transport.sin.sin_port), | 106 | ntohs(srx->transport.sin.sin_port), |
105 | &srx->transport.sin.sin_addr); | 107 | &srx->transport.sin.sin_addr); |
106 | if (srx->transport_len > 8) | 108 | tail = offsetof(struct sockaddr_rxrpc, transport.sin.__pad); |
107 | memset((void *)&srx->transport + 8, 0, | ||
108 | srx->transport_len - 8); | ||
109 | break; | 109 | break; |
110 | 110 | ||
111 | case AF_INET6: | 111 | case AF_INET6: |
@@ -113,6 +113,8 @@ static int rxrpc_validate_address(struct rxrpc_sock *rx, | |||
113 | return -EAFNOSUPPORT; | 113 | return -EAFNOSUPPORT; |
114 | } | 114 | } |
115 | 115 | ||
116 | if (tail < len) | ||
117 | memset((void *)srx + tail, 0, len - tail); | ||
116 | return 0; | 118 | return 0; |
117 | } | 119 | } |
118 | 120 | ||
@@ -121,11 +123,10 @@ static int rxrpc_validate_address(struct rxrpc_sock *rx, | |||
121 | */ | 123 | */ |
122 | static int rxrpc_bind(struct socket *sock, struct sockaddr *saddr, int len) | 124 | static int rxrpc_bind(struct socket *sock, struct sockaddr *saddr, int len) |
123 | { | 125 | { |
124 | struct sockaddr_rxrpc *srx = (struct sockaddr_rxrpc *) saddr; | 126 | struct sockaddr_rxrpc *srx = (struct sockaddr_rxrpc *)saddr; |
125 | struct sock *sk = sock->sk; | 127 | struct sock *sk = sock->sk; |
126 | struct rxrpc_local *local; | 128 | struct rxrpc_local *local; |
127 | struct rxrpc_sock *rx = rxrpc_sk(sk), *prx; | 129 | struct rxrpc_sock *rx = rxrpc_sk(sk), *prx; |
128 | __be16 service_id; | ||
129 | int ret; | 130 | int ret; |
130 | 131 | ||
131 | _enter("%p,%p,%d", rx, saddr, len); | 132 | _enter("%p,%p,%d", rx, saddr, len); |
@@ -143,7 +144,7 @@ static int rxrpc_bind(struct socket *sock, struct sockaddr *saddr, int len) | |||
143 | 144 | ||
144 | memcpy(&rx->srx, srx, sizeof(rx->srx)); | 145 | memcpy(&rx->srx, srx, sizeof(rx->srx)); |
145 | 146 | ||
146 | /* find a local transport endpoint if we don't have one already */ | 147 | /* Find or create a local transport endpoint to use */ |
147 | local = rxrpc_lookup_local(&rx->srx); | 148 | local = rxrpc_lookup_local(&rx->srx); |
148 | if (IS_ERR(local)) { | 149 | if (IS_ERR(local)) { |
149 | ret = PTR_ERR(local); | 150 | ret = PTR_ERR(local); |
@@ -152,14 +153,12 @@ static int rxrpc_bind(struct socket *sock, struct sockaddr *saddr, int len) | |||
152 | 153 | ||
153 | rx->local = local; | 154 | rx->local = local; |
154 | if (srx->srx_service) { | 155 | if (srx->srx_service) { |
155 | service_id = htons(srx->srx_service); | ||
156 | write_lock_bh(&local->services_lock); | 156 | write_lock_bh(&local->services_lock); |
157 | list_for_each_entry(prx, &local->services, listen_link) { | 157 | list_for_each_entry(prx, &local->services, listen_link) { |
158 | if (prx->service_id == service_id) | 158 | if (prx->srx.srx_service == srx->srx_service) |
159 | goto service_in_use; | 159 | goto service_in_use; |
160 | } | 160 | } |
161 | 161 | ||
162 | rx->service_id = service_id; | ||
163 | list_add_tail(&rx->listen_link, &local->services); | 162 | list_add_tail(&rx->listen_link, &local->services); |
164 | write_unlock_bh(&local->services_lock); | 163 | write_unlock_bh(&local->services_lock); |
165 | 164 | ||
@@ -276,7 +275,6 @@ struct rxrpc_call *rxrpc_kernel_begin_call(struct socket *sock, | |||
276 | struct rxrpc_transport *trans; | 275 | struct rxrpc_transport *trans; |
277 | struct rxrpc_call *call; | 276 | struct rxrpc_call *call; |
278 | struct rxrpc_sock *rx = rxrpc_sk(sock->sk); | 277 | struct rxrpc_sock *rx = rxrpc_sk(sock->sk); |
279 | __be16 service_id; | ||
280 | 278 | ||
281 | _enter(",,%x,%lx", key_serial(key), user_call_ID); | 279 | _enter(",,%x,%lx", key_serial(key), user_call_ID); |
282 | 280 | ||
@@ -299,16 +297,14 @@ struct rxrpc_call *rxrpc_kernel_begin_call(struct socket *sock, | |||
299 | atomic_inc(&trans->usage); | 297 | atomic_inc(&trans->usage); |
300 | } | 298 | } |
301 | 299 | ||
302 | service_id = rx->service_id; | 300 | if (!srx) |
303 | if (srx) | 301 | srx = &rx->srx; |
304 | service_id = htons(srx->srx_service); | ||
305 | |||
306 | if (!key) | 302 | if (!key) |
307 | key = rx->key; | 303 | key = rx->key; |
308 | if (key && !key->payload.data[0]) | 304 | if (key && !key->payload.data[0]) |
309 | key = NULL; /* a no-security key */ | 305 | key = NULL; /* a no-security key */ |
310 | 306 | ||
311 | bundle = rxrpc_get_bundle(rx, trans, key, service_id, gfp); | 307 | bundle = rxrpc_get_bundle(rx, trans, key, srx->srx_service, gfp); |
312 | if (IS_ERR(bundle)) { | 308 | if (IS_ERR(bundle)) { |
313 | call = ERR_CAST(bundle); | 309 | call = ERR_CAST(bundle); |
314 | goto out; | 310 | goto out; |
@@ -324,7 +320,6 @@ out_notrans: | |||
324 | _leave(" = %p", call); | 320 | _leave(" = %p", call); |
325 | return call; | 321 | return call; |
326 | } | 322 | } |
327 | |||
328 | EXPORT_SYMBOL(rxrpc_kernel_begin_call); | 323 | EXPORT_SYMBOL(rxrpc_kernel_begin_call); |
329 | 324 | ||
330 | /** | 325 | /** |
@@ -340,7 +335,6 @@ void rxrpc_kernel_end_call(struct rxrpc_call *call) | |||
340 | rxrpc_remove_user_ID(call->socket, call); | 335 | rxrpc_remove_user_ID(call->socket, call); |
341 | rxrpc_put_call(call); | 336 | rxrpc_put_call(call); |
342 | } | 337 | } |
343 | |||
344 | EXPORT_SYMBOL(rxrpc_kernel_end_call); | 338 | EXPORT_SYMBOL(rxrpc_kernel_end_call); |
345 | 339 | ||
346 | /** | 340 | /** |
@@ -425,7 +419,6 @@ static int rxrpc_connect(struct socket *sock, struct sockaddr *addr, | |||
425 | } | 419 | } |
426 | 420 | ||
427 | rx->trans = trans; | 421 | rx->trans = trans; |
428 | rx->service_id = htons(srx->srx_service); | ||
429 | rx->sk.sk_state = RXRPC_CLIENT_CONNECTED; | 422 | rx->sk.sk_state = RXRPC_CLIENT_CONNECTED; |
430 | 423 | ||
431 | release_sock(&rx->sk); | 424 | release_sock(&rx->sk); |
@@ -622,7 +615,7 @@ static int rxrpc_create(struct net *net, struct socket *sock, int protocol, | |||
622 | if (!net_eq(net, &init_net)) | 615 | if (!net_eq(net, &init_net)) |
623 | return -EAFNOSUPPORT; | 616 | return -EAFNOSUPPORT; |
624 | 617 | ||
625 | /* we support transport protocol UDP only */ | 618 | /* we support transport protocol UDP/UDP6 only */ |
626 | if (protocol != PF_INET) | 619 | if (protocol != PF_INET) |
627 | return -EPROTONOSUPPORT; | 620 | return -EPROTONOSUPPORT; |
628 | 621 | ||
@@ -754,7 +747,7 @@ static int rxrpc_release(struct socket *sock) | |||
754 | * RxRPC network protocol | 747 | * RxRPC network protocol |
755 | */ | 748 | */ |
756 | static const struct proto_ops rxrpc_rpc_ops = { | 749 | static const struct proto_ops rxrpc_rpc_ops = { |
757 | .family = PF_UNIX, | 750 | .family = PF_RXRPC, |
758 | .owner = THIS_MODULE, | 751 | .owner = THIS_MODULE, |
759 | .release = rxrpc_release, | 752 | .release = rxrpc_release, |
760 | .bind = rxrpc_bind, | 753 | .bind = rxrpc_bind, |
@@ -778,7 +771,7 @@ static struct proto rxrpc_proto = { | |||
778 | .name = "RXRPC", | 771 | .name = "RXRPC", |
779 | .owner = THIS_MODULE, | 772 | .owner = THIS_MODULE, |
780 | .obj_size = sizeof(struct rxrpc_sock), | 773 | .obj_size = sizeof(struct rxrpc_sock), |
781 | .max_header = sizeof(struct rxrpc_header), | 774 | .max_header = sizeof(struct rxrpc_wire_header), |
782 | }; | 775 | }; |
783 | 776 | ||
784 | static const struct net_proto_family rxrpc_family_ops = { | 777 | static const struct net_proto_family rxrpc_family_ops = { |
@@ -796,7 +789,7 @@ static int __init af_rxrpc_init(void) | |||
796 | 789 | ||
797 | BUILD_BUG_ON(sizeof(struct rxrpc_skb_priv) > FIELD_SIZEOF(struct sk_buff, cb)); | 790 | BUILD_BUG_ON(sizeof(struct rxrpc_skb_priv) > FIELD_SIZEOF(struct sk_buff, cb)); |
798 | 791 | ||
799 | rxrpc_epoch = htonl(get_seconds()); | 792 | rxrpc_epoch = get_seconds(); |
800 | 793 | ||
801 | ret = -ENOMEM; | 794 | ret = -ENOMEM; |
802 | rxrpc_call_jar = kmem_cache_create( | 795 | rxrpc_call_jar = kmem_cache_create( |