static int bind(struct socket *sock, struct sockaddr *uaddr, int uaddr_len) { struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr; u32 portref = tipc_sk_port(sock->sk)->ref; if (unlikely(!uaddr_len)) return tipc_withdraw(portref, 0, NULL); if (uaddr_len < sizeof(struct sockaddr_tipc)) return -EINVAL; if (addr->family != AF_TIPC) return -EAFNOSUPPORT; if (addr->addrtype == TIPC_ADDR_NAME) addr->addr.nameseq.upper = addr->addr.nameseq.lower; else if (addr->addrtype != TIPC_ADDR_NAMESEQ) return -EAFNOSUPPORT; if (addr->addr.nameseq.type < TIPC_RESERVED_TYPES) return -EACCES; return (addr->scope > 0) ? tipc_publish(portref, addr->scope, &addr->addr.nameseq) : tipc_withdraw(portref, -addr->scope, &addr->addr.nameseq); }
static int bind(struct socket *sock, struct sockaddr *uaddr, int uaddr_len) { struct tipc_sock *tsock = tipc_sk(sock->sk); struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr; int res; if (down_interruptible(&tsock->sem)) return -ERESTARTSYS; if (unlikely(!uaddr_len)) { res = tipc_withdraw(tsock->p->ref, 0, NULL); goto exit; } if (uaddr_len < sizeof(struct sockaddr_tipc)) { res = -EINVAL; goto exit; } if (addr->family != AF_TIPC) { res = -EAFNOSUPPORT; goto exit; } if (addr->addrtype == TIPC_ADDR_NAME) addr->addr.nameseq.upper = addr->addr.nameseq.lower; else if (addr->addrtype != TIPC_ADDR_NAMESEQ) { res = -EAFNOSUPPORT; goto exit; } if (addr->scope > 0) res = tipc_publish(tsock->p->ref, addr->scope, &addr->addr.nameseq); else res = tipc_withdraw(tsock->p->ref, -addr->scope, &addr->addr.nameseq); exit: up(&tsock->sem); return res; }
void tipc_cfg_reinit(void) { struct tipc_name_seq seq; int res; seq.type = TIPC_CFG_SRV; seq.lower = seq.upper = 0; tipc_withdraw(config_port_ref, TIPC_ZONE_SCOPE, &seq); seq.lower = seq.upper = tipc_own_addr; res = tipc_publish(config_port_ref, TIPC_ZONE_SCOPE, &seq); if (res) pr_err("Unable to reinitialize configuration service\n"); }