Skip to content

Commit

Permalink
af_iucv: Add automatic (source) iucv_name to bind
Browse files Browse the repository at this point in the history
If a socket is bound to an address using before calling connect
it is usual to leave it to the network system to choose an appropriate
outgoing application name respective port address.
af_iucv on VM uses a counter and uses simple numbers as unique identifiers.
This behaviour was missing when af_iucv is used with HiperSockets.

This patch contains a simple approach to harmonize af_iucv's behaviour.

Signed-off-by: Philipp Hachtmann <[email protected]>
Signed-off-by: Frank Blaschka <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Philipp Hachtmann authored and davem330 committed May 31, 2014
1 parent 078252e commit 53a4b49
Showing 1 changed file with 18 additions and 11 deletions.
29 changes: 18 additions & 11 deletions net/iucv/af_iucv.c
Original file line number Diff line number Diff line change
Expand Up @@ -682,6 +682,18 @@ struct sock *iucv_accept_dequeue(struct sock *parent, struct socket *newsock)
return NULL;
}

static void __iucv_auto_name(struct iucv_sock *iucv)
{
char name[12];

sprintf(name, "%08x", atomic_inc_return(&iucv_sk_list.autobind_name));
while (__iucv_get_sock_by_name(name)) {
sprintf(name, "%08x",
atomic_inc_return(&iucv_sk_list.autobind_name));
}
memcpy(iucv->src_name, name, 8);
}

/* Bind an unbound socket */
static int iucv_sock_bind(struct socket *sock, struct sockaddr *addr,
int addr_len)
Expand Down Expand Up @@ -724,8 +736,12 @@ static int iucv_sock_bind(struct socket *sock, struct sockaddr *addr,
rcu_read_lock();
for_each_netdev_rcu(&init_net, dev) {
if (!memcmp(dev->perm_addr, uid, 8)) {
memcpy(iucv->src_name, sa->siucv_name, 8);
memcpy(iucv->src_user_id, sa->siucv_user_id, 8);
/* Check for unitialized siucv_name */
if (strncmp(sa->siucv_name, " ", 8) == 0)
__iucv_auto_name(iucv);
else
memcpy(iucv->src_name, sa->siucv_name, 8);
sk->sk_bound_dev_if = dev->ifindex;
iucv->hs_dev = dev;
dev_hold(dev);
Expand Down Expand Up @@ -763,7 +779,6 @@ static int iucv_sock_bind(struct socket *sock, struct sockaddr *addr,
static int iucv_sock_autobind(struct sock *sk)
{
struct iucv_sock *iucv = iucv_sk(sk);
char name[12];
int err = 0;

if (unlikely(!pr_iucv))
Expand All @@ -772,17 +787,9 @@ static int iucv_sock_autobind(struct sock *sk)
memcpy(iucv->src_user_id, iucv_userid, 8);

write_lock_bh(&iucv_sk_list.lock);

sprintf(name, "%08x", atomic_inc_return(&iucv_sk_list.autobind_name));
while (__iucv_get_sock_by_name(name)) {
sprintf(name, "%08x",
atomic_inc_return(&iucv_sk_list.autobind_name));
}

__iucv_auto_name(iucv);
write_unlock_bh(&iucv_sk_list.lock);

memcpy(&iucv->src_name, name, 8);

if (!iucv->msglimit)
iucv->msglimit = IUCV_QUEUELEN_DEFAULT;

Expand Down

0 comments on commit 53a4b49

Please sign in to comment.