*/
static int llc_ui_send_data(struct sock* sk, struct sk_buff *skb, int noblock)
{
- struct llc_opt* llc = llc_sk(sk);
+ struct llc_sock* llc = llc_sk(sk);
int rc = 0;
if (llc_data_accept_state(llc->state) || llc->p_flag) {
sock->ops = &llc_ui_ops;
}
+static struct proto llc_proto = {
+ .name = "DDP",
+ .owner = THIS_MODULE,
+ .obj_size = sizeof(struct llc_sock),
+};
+
/**
* llc_ui_create - alloc and init a new llc_ui socket
* @sock: Socket to initialize and attach allocated sk to.
if (sock->type == SOCK_DGRAM || sock->type == SOCK_STREAM) {
rc = -ENOMEM;
- sk = llc_sk_alloc(PF_LLC, GFP_KERNEL);
+ sk = llc_sk_alloc(PF_LLC, GFP_KERNEL, &llc_proto);
if (sk) {
rc = 0;
llc_ui_sk_init(sock, sk);
static int llc_ui_release(struct socket *sock)
{
struct sock *sk = sock->sk;
- struct llc_opt *llc;
+ struct llc_sock *llc;
if (!sk)
goto out;
llc->laddr.lsap, llc->daddr.lsap);
if (!llc_send_disc(sk))
llc_ui_wait_for_disc(sk, sk->sk_rcvtimeo);
- if (!sk->sk_zapped)
+ if (!sock_flag(sk, SOCK_ZAPPED))
llc_sap_remove_socket(llc->sap, sk);
release_sock(sk);
if (llc->sap && hlist_empty(&llc->sap->sk_list.list)) {
static int llc_ui_autobind(struct socket *sock, struct sockaddr_llc *addr)
{
struct sock *sk = sock->sk;
- struct llc_opt *llc = llc_sk(sk);
+ struct llc_sock *llc = llc_sk(sk);
struct llc_sap *sap;
int rc = -EINVAL;
- if (!sk->sk_zapped)
+ if (!sock_flag(sk, SOCK_ZAPPED))
goto out;
rc = -ENODEV;
llc->dev = dev_getfirstbyhwtype(addr->sllc_arphrd);
memcpy(&llc->addr, addr, sizeof(llc->addr));
/* assign new connection to its SAP */
llc_sap_add_socket(sap, sk);
- rc = sk->sk_zapped = 0;
+ sock_reset_flag(sk, SOCK_ZAPPED);
+ rc = 0;
out:
return rc;
}
{
struct sockaddr_llc *addr = (struct sockaddr_llc *)uaddr;
struct sock *sk = sock->sk;
- struct llc_opt *llc = llc_sk(sk);
+ struct llc_sock *llc = llc_sk(sk);
struct llc_sap *sap;
int rc = -EINVAL;
dprintk("%s: binding %02X\n", __FUNCTION__, addr->sllc_sap);
- if (!sk->sk_zapped || addrlen != sizeof(*addr))
+ if (!sock_flag(sk, SOCK_ZAPPED) || addrlen != sizeof(*addr))
goto out;
rc = -EAFNOSUPPORT;
if (addr->sllc_family != AF_LLC)
memcpy(&llc->addr, addr, sizeof(llc->addr));
/* assign new connection to its SAP */
llc_sap_add_socket(sap, sk);
- rc = sk->sk_zapped = 0;
+ sock_reset_flag(sk, SOCK_ZAPPED);
+ rc = 0;
out:
return rc;
}
int addrlen, int flags)
{
struct sock *sk = sock->sk;
- struct llc_opt *llc = llc_sk(sk);
+ struct llc_sock *llc = llc_sk(sk);
struct sockaddr_llc *addr = (struct sockaddr_llc *)uaddr;
struct net_device *dev;
int rc = -EINVAL;
if (addr->sllc_family != AF_LLC)
goto out;
/* bind connection to sap if user hasn't done it. */
- if (sk->sk_zapped) {
+ if (sock_flag(sk, SOCK_ZAPPED)) {
/* bind to sap with null dev, exclusive */
rc = llc_ui_autobind(sock, addr);
if (rc)
if (sk->sk_type != SOCK_STREAM)
goto out;
rc = -EAGAIN;
- if (sk->sk_zapped)
+ if (sock_flag(sk, SOCK_ZAPPED))
goto out;
rc = 0;
if (!(unsigned)backlog) /* BSDism */
static int llc_ui_wait_for_busy_core(struct sock *sk, int timeout)
{
DECLARE_WAITQUEUE(wait, current);
- struct llc_opt *llc = llc_sk(sk);
+ struct llc_sock *llc = llc_sk(sk);
int rc;
add_wait_queue_exclusive(sk->sk_sleep, &wait);
static int llc_ui_accept(struct socket *sock, struct socket *newsock, int flags)
{
struct sock *sk = sock->sk, *newsk;
- struct llc_opt *llc, *newllc;
+ struct llc_sock *llc, *newllc;
struct sk_buff *skb;
int rc = -EOPNOTSUPP;
newsk = skb->sk;
/* attach connection to a new socket. */
llc_ui_sk_init(newsock, newsk);
- newsk->sk_zapped = 0;
+ sock_reset_flag(newsk, SOCK_ZAPPED);
newsk->sk_state = TCP_ESTABLISHED;
newsock->state = SS_CONNECTED;
llc = llc_sk(sk);
struct msghdr *msg, size_t len)
{
struct sock *sk = sock->sk;
- struct llc_opt *llc = llc_sk(sk);
+ struct llc_sock *llc = llc_sk(sk);
struct sockaddr_llc *addr = (struct sockaddr_llc *)msg->msg_name;
int flags = msg->msg_flags;
int noblock = flags & MSG_DONTWAIT;
addr = &llc->addr;
}
/* must bind connection to sap if user hasn't done it. */
- if (sk->sk_zapped) {
+ if (sock_flag(sk, SOCK_ZAPPED)) {
/* bind to sap with null dev, exclusive. */
rc = llc_ui_autobind(sock, addr);
if (rc)
{
struct sockaddr_llc sllc;
struct sock *sk = sock->sk;
- struct llc_opt *llc = llc_sk(sk);
+ struct llc_sock *llc = llc_sk(sk);
int rc = 0;
lock_sock(sk);
- if (sk->sk_zapped)
+ if (sock_flag(sk, SOCK_ZAPPED))
goto out;
*uaddrlen = sizeof(sllc);
memset(uaddr, 0, *uaddrlen);
char __user *optval, int optlen)
{
struct sock *sk = sock->sk;
- struct llc_opt *llc = llc_sk(sk);
+ struct llc_sock *llc = llc_sk(sk);
int rc = -EINVAL, opt;
lock_sock(sk);
char __user *optval, int __user *optlen)
{
struct sock *sk = sock->sk;
- struct llc_opt *llc = llc_sk(sk);
+ struct llc_sock *llc = llc_sk(sk);
int val = 0, len = 0, rc = -EINVAL;
lock_sock(sk);
static int __init llc2_init(void)
{
- int rc;
+ int rc = proto_register(&llc_proto, 0);
+
+ if (rc != 0)
+ goto out;
llc_build_offset_table();
llc_station_init();
llc_ui_sap_last_autoport = LLC_SAP_DYN_START;
rc = llc_proc_init();
- if (!rc) {
- sock_register(&llc_ui_family_ops);
- llc_add_pack(LLC_DEST_SAP, llc_sap_handler);
- llc_add_pack(LLC_DEST_CONN, llc_conn_handler);
- }
+ if (rc != 0)
+ goto out_unregister_llc_proto;
+ sock_register(&llc_ui_family_ops);
+ llc_add_pack(LLC_DEST_SAP, llc_sap_handler);
+ llc_add_pack(LLC_DEST_CONN, llc_conn_handler);
+out:
return rc;
+out_unregister_llc_proto:
+ proto_unregister(&llc_proto);
+ goto out;
}
static void __exit llc2_exit(void)
llc_remove_pack(LLC_DEST_CONN);
sock_unregister(PF_LLC);
llc_proc_exit();
+ proto_unregister(&llc_proto);
}
module_init(llc2_init);