/* Fill in the routing entry */
rt->target = ta->sat_addr;
+ dev_hold(devhint);
rt->dev = devhint;
rt->flags = r->rt_flags;
rt->gateway = ga->sat_addr;
return sum ? htons((unsigned short)sum) : 0xFFFF;
}
+static struct proto ddp_proto = {
+ .name = "DDP",
+ .owner = THIS_MODULE,
+ .obj_size = sizeof(struct atalk_sock),
+};
+
/*
* Create a socket. Initialise the socket, blank the addresses
* set the state.
static int atalk_create(struct socket *sock, int protocol)
{
struct sock *sk;
- struct atalk_sock *at;
int rc = -ESOCKTNOSUPPORT;
/*
if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM)
goto out;
rc = -ENOMEM;
- sk = sk_alloc(PF_APPLETALK, GFP_KERNEL, 1, NULL);
+ sk = sk_alloc(PF_APPLETALK, GFP_KERNEL, &ddp_proto, 1);
if (!sk)
goto out;
- at = sk->sk_protinfo = kmalloc(sizeof(*at), GFP_KERNEL);
- if (!at)
- goto outsk;
- memset(at, 0, sizeof(*at));
rc = 0;
sock->ops = &atalk_dgram_ops;
sock_init_data(sock, sk);
- sk_set_owner(sk, THIS_MODULE);
/* Checksums on by default */
- sk->sk_zapped = 1;
+ sock_set_flag(sk, SOCK_ZAPPED);
out:
return rc;
-outsk:
- sk_free(sk);
- goto out;
}
/* Free a socket. No work needed */
n = atalk_pick_and_bind_port(sk, &sat);
if (!n)
- sk->sk_zapped = 0;
+ sock_reset_flag(sk, SOCK_ZAPPED);
out:
return n;
}
struct sock *sk = sock->sk;
struct atalk_sock *at = at_sk(sk);
- if (!sk->sk_zapped || addr_len != sizeof(struct sockaddr_at))
+ if (!sock_flag(sk, SOCK_ZAPPED) ||
+ addr_len != sizeof(struct sockaddr_at))
return -EINVAL;
if (addr->sat_family != AF_APPLETALK)
return -EADDRINUSE;
}
- sk->sk_zapped = 0;
+ sock_reset_flag(sk, SOCK_ZAPPED);
return 0;
}
#endif
}
- if (sk->sk_zapped)
+ if (sock_flag(sk, SOCK_ZAPPED))
if (atalk_autobind(sk) < 0)
return -EBUSY;
struct sock *sk = sock->sk;
struct atalk_sock *at = at_sk(sk);
- if (sk->sk_zapped)
+ if (sock_flag(sk, SOCK_ZAPPED))
if (atalk_autobind(sk) < 0)
return -ENOBUFS;
return -EMSGSIZE;
if (usat) {
- if (sk->sk_zapped)
+ if (sock_flag(sk, SOCK_ZAPPED))
if (atalk_autobind(sk) < 0)
return -EBUSY;
/* Called by proto.c on kernel start up */
static int __init atalk_init(void)
{
+ int rc = proto_register(&ddp_proto, 0);
+
+ if (rc != 0)
+ goto out;
+
(void)sock_register(&atalk_family_ops);
ddp_dl = register_snap_client(ddp_snap_id, atalk_rcv);
if (!ddp_dl)
aarp_proto_init();
atalk_proc_init();
atalk_register_sysctl();
- return 0;
+out:
+ return rc;
}
module_init(atalk_init);
dev_remove_pack(&ppptalk_packet_type);
unregister_snap_client(ddp_dl);
sock_unregister(PF_APPLETALK);
+ proto_unregister(&ddp_proto);
}
module_exit(atalk_exit);