aboutsummaryrefslogtreecommitdiffstats
path: root/net/rxrpc/af_rxrpc.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/rxrpc/af_rxrpc.c')
-rw-r--r--net/rxrpc/af_rxrpc.c39
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;
37static const struct proto_ops rxrpc_rpc_ops; 37static 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; 40u32 rxrpc_epoch;
41 41
42/* current debugging ID */ 42/* current debugging ID */
43atomic_t rxrpc_debug_id; 43atomic_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 */
122static int rxrpc_bind(struct socket *sock, struct sockaddr *saddr, int len) 124static 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
328EXPORT_SYMBOL(rxrpc_kernel_begin_call); 323EXPORT_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
344EXPORT_SYMBOL(rxrpc_kernel_end_call); 338EXPORT_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 */
756static const struct proto_ops rxrpc_rpc_ops = { 749static 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
784static const struct net_proto_family rxrpc_family_ops = { 777static 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(