if (!sk->sk_zapped)
goto out;
- /* bind to a specific sap, optional. */
- if (!addr->sllc_sap) {
- rc = -EUSERS;
- addr->sllc_sap = llc_ui_autoport();
- if (!addr->sllc_sap)
- goto out;
- }
- sap = llc_sap_find(addr->sllc_sap);
- if (!sap) {
- sap = llc_sap_open(addr->sllc_sap, NULL);
- rc = -EBUSY; /* some other network layer is using the sap */
- if (!sap)
- goto out;
- } else {
- struct llc_addr laddr, daddr;
- struct sock *ask;
-
- memset(&laddr, 0, sizeof(laddr));
- memset(&daddr, 0, sizeof(daddr));
- /*
- * FIXME: check if the the address is multicast,
- * only SOCK_DGRAM can do this.
- */
- memcpy(laddr.mac, addr->sllc_mac, IFHWADDRLEN);
- laddr.lsap = addr->sllc_sap;
- rc = -EADDRINUSE; /* mac + sap clash. */
- ask = llc_lookup_established(sap, &daddr, &laddr);
- if (ask) {
- sock_put(ask);
- goto out;
- }
- }
- llc->laddr.lsap = addr->sllc_sap;
- if (llc->dev)
- memcpy(llc->laddr.mac, llc->dev->dev_addr, IFHWADDRLEN);
+ rc = -ENODEV;
+ llc->dev = dev_getfirstbyhwtype(addr->sllc_arphrd);
+ if (!llc->dev)
+ goto out;
+ rc = -EUSERS;
+ llc->laddr.lsap = llc_ui_autoport();
+ if (!llc->laddr.lsap)
+ goto out;
+ rc = -EBUSY; /* some other network layer is using the sap */
+ sap = llc_sap_open(llc->laddr.lsap, NULL);
+ if (!sap)
+ goto out;
+ memcpy(llc->laddr.mac, llc->dev->dev_addr, IFHWADDRLEN);
memcpy(&llc->addr, addr, sizeof(llc->addr));
/* assign new connection to its SAP */
llc_sap_add_socket(sap, sk);
{
struct sockaddr_llc *addr = (struct sockaddr_llc *)uaddr;
struct sock *sk = sock->sk;
+ struct llc_opt *llc = llc_sk(sk);
+ struct llc_sap *sap;
int rc = -EINVAL;
dprintk("%s: binding %02X\n", __FUNCTION__, addr->sllc_sap);
rc = -EAFNOSUPPORT;
if (addr->sllc_family != AF_LLC)
goto out;
- /* use autobind, to avoid code replication. */
- rc = llc_ui_autobind(sock, addr);
+ if (!addr->sllc_sap) {
+ rc = -EUSERS;
+ addr->sllc_sap = llc_ui_autoport();
+ if (!addr->sllc_sap)
+ goto out;
+ }
+ sap = llc_sap_find(addr->sllc_sap);
+ if (!sap) {
+ sap = llc_sap_open(addr->sllc_sap, NULL);
+ rc = -EBUSY; /* some other network layer is using the sap */
+ if (!sap)
+ goto out;
+ } else {
+ struct llc_addr laddr, daddr;
+ struct sock *ask;
+
+ memset(&laddr, 0, sizeof(laddr));
+ memset(&daddr, 0, sizeof(daddr));
+ /*
+ * FIXME: check if the the address is multicast,
+ * only SOCK_DGRAM can do this.
+ */
+ memcpy(laddr.mac, addr->sllc_mac, IFHWADDRLEN);
+ laddr.lsap = addr->sllc_sap;
+ rc = -EADDRINUSE; /* mac + sap clash. */
+ ask = llc_lookup_established(sap, &daddr, &laddr);
+ if (ask) {
+ sock_put(ask);
+ goto out;
+ }
+ }
+ llc->laddr.lsap = addr->sllc_sap;
+ memcpy(llc->laddr.mac, addr->sllc_mac, IFHWADDRLEN);
+ memcpy(&llc->addr, addr, sizeof(llc->addr));
+ /* assign new connection to its SAP */
+ llc_sap_add_socket(sap, sk);
+ rc = sk->sk_zapped = 0;
out:
return rc;
}
llc->daddr.lsap = addr->sllc_sap;
memcpy(llc->daddr.mac, addr->sllc_mac, IFHWADDRLEN);
}
- if (!llc->dev) {
- rc = -ENODEV;
- dev = dev_getfirstbyhwtype(addr->sllc_arphrd);
- if (!dev)
- goto out;
- llc->dev = dev;
- memcpy(llc->laddr.mac, llc->dev->dev_addr, IFHWADDRLEN);
- } else
- dev = llc->dev;
+ dev = llc->dev;
if (sk->sk_type != SOCK_STREAM)
goto out;
rc = -EALREADY;
int rc = -EOPNOTSUPP;
dprintk("%s: accepting on %02X\n", __FUNCTION__,
- llc_sk(sk)->addr.sllc_sap);
+ llc_sk(sk)->laddr.lsap);
lock_sock(sk);
if (sk->sk_type != SOCK_STREAM)
goto out;
if (rc)
goto out;
dprintk("%s: got a new connection on %02X\n", __FUNCTION__,
- llc_sk(sk)->addr.sllc_sap);
+ llc_sk(sk)->laddr.lsap);
skb = skb_dequeue(&sk->sk_receive_queue);
rc = -EINVAL;
if (!skb->sk)
if (rc)
goto release;
}
- if (!llc->dev) {
- rc = -ENODEV;
- dev = dev_getfirstbyhwtype(addr->sllc_arphrd);
- if (!dev)
- goto release;
- } else
- dev = llc->dev;
+ dev = llc->dev;
hdrlen = dev->hard_header_len + llc_ui_header_len(sk, addr);
size = hdrlen + len;
if (size > dev->mtu)