chan->lcn = mbox_ptr->cmd.lcn;
card->u.x.svc_to_dev_map[(chan->lcn%MAX_X25_LCN)] = dev;
- newsk->sk_zapped = 0;
+ sock_reset_flag(newsk, SOCK_ZAPPED);
newwp->num = htons(X25_PROT);
if (wanpipe_do_bind(newsk, dev, newwp->num)) {
wp_sk(sk)->num = wp_sk(osk)->num;
sk->sk_rcvbuf = osk->sk_rcvbuf;
sk->sk_sndbuf = osk->sk_sndbuf;
- sk->sk_debug = osk->sk_debug;
sk->sk_state = WANSOCK_CONNECTING;
sk->sk_sleep = osk->sk_sleep;
+ if (sock_flag(osk, SOCK_DBG))
+ sock_set_flag(sk, SOCK_DBG);
+
return sk;
}
+/*
+ * FIXME: wanpipe_opt has to include a sock in its definition and stop using
+ * sk_protinfo, but this code is not even compilable now, so lets leave it for
+ * later.
+ */
+static struct proto wanpipe_proto = {
+ .name = "WANPIPE",
+ .owner = THIS_MODULE,
+ .obj_size = sizeof(struct sock),
+};
+
/*============================================================
* wanpipe_make_new
*
struct sock *sk;
struct wanpipe_opt *wan_opt;
- if ((sk = sk_alloc(PF_WANPIPE, GFP_ATOMIC, 1, NULL)) == NULL)
+ if ((sk = sk_alloc(PF_WANPIPE, GFP_ATOMIC, &wanpipe_proto, 1)) == NULL)
return NULL;
if ((wan_opt = kmalloc(sizeof(struct wanpipe_opt), GFP_ATOMIC)) == NULL) {
int ifindex, err, reserve = 0;
- if (!sk->sk_zapped)
+ if (!sock_flag(sk, SOCK_ZAPPED))
return -ENETDOWN;
if (sk->sk_state != WANSOCK_CONNECTED)
return;
}
- if (sk->sk_state != WANSOCK_CONNECTED || !sk->sk_zapped) {
+ if (sk->sk_state != WANSOCK_CONNECTED || !sock_flag(sk, SOCK_ZAPPED)) {
clear_bit(0, &wp->timer);
DBG_PRINTK(KERN_INFO "wansock: Tx Timer, State not CONNECTED\n");
return;
struct net_device *dev;
wanpipe_common_t *chan=NULL;
- sk->sk_zapped = 0;
+ sock_reset_flag(sk, SOCK_ZAPPED);
sk->sk_state = WANSOCK_DISCONNECTED;
wp_sk(sk)->dev = NULL;
chan->mbox = wp->mbox;
chan->tx_timer = &wp->tx_timer;
wp->dev = dev;
- sk->sk_zapped = 1;
+ sock_set_flag(sk, SOCK_ZAPPED);
clear_bit(0,&chan->common_critical);
}
*/
if (wp->num == htons(X25_PROT) &&
- sk->sk_state != WANSOCK_DISCONNECTED && sk->sk_zapped) {
+ sk->sk_state != WANSOCK_DISCONNECTED && sock_flag(sk, SOCK_ZAPPED)) {
struct net_device *dev = dev_get_by_index(sk->sk_bound_dev_if);
wanpipe_common_t *chan;
if (dev){
}
kfree_skb(skb);
}
- if (sk->sk_zapped)
+ if (sock_flag(sk, SOCK_ZAPPED))
wanpipe_unlink_card(sk);
}else{
- if (sk->sk_zapped)
+ if (sock_flag(sk, SOCK_ZAPPED))
wanpipe_unlink_driver(sk);
}
sk->sk_state = WANSOCK_DISCONNECTED;
sk->sk_bound_dev_if = 0;
- sk->sk_zapped = 0;
+ sock_reset_flag(sk, SOCK_ZAPPED);
wp = wp_sk(sk);
if (wp && wp->mbox) {
wanpipe_common_t *chan=NULL;
int err=0;
- if (sk->sk_zapped) {
+ if (sock_flag(sk, SOCK_ZAPPED)) {
err = -EALREADY;
goto bind_unlock_exit;
}
sock->ops = &wanpipe_ops;
sock_init_data(sock,sk);
- sk->sk_zapped = 0;
+ sock_reset_flag(sk, SOCK_ZAPPED);
sk->sk_family = PF_WANPIPE;
wp_sk(sk)->num = protocol;
sk->sk_state = WANSOCK_DISCONNECTED;
case NETDEV_UNREGISTER:
if (dev->ifindex == sk->sk_bound_dev_if) {
printk(KERN_INFO "wansock: Device down %s\n",dev->name);
- if (sk->sk_zapped) {
+ if (sock_flag(sk, SOCK_ZAPPED)) {
wanpipe_unlink_driver(sk);
sk->sk_err = ENETDOWN;
sk->sk_error_report(sk);
break;
case NETDEV_UP:
if (dev->ifindex == sk->sk_bound_dev_if &&
- po->num && !sk->sk_zapped) {
+ po->num && !sock_flag(sk, SOCK_ZAPPED)) {
printk(KERN_INFO "wansock: Registering Device: %s\n",
dev->name);
wanpipe_link_driver(dev,sk);
card->sk=sk;
card->func=wanpipe_listen_rcv;
- sk->sk_zapped = 1;
+ sock_set_flag(sk, SOCK_ZAPPED);
return 0;
}
dev_put(dev);
- if (!sk->sk_zapped) /* Must bind first - autobinding does not work */
+ if (!sock_flag(sk, SOCK_ZAPPED)) /* Must bind first - autobinding does not work */
return -EINVAL;
sock->state = SS_CONNECTING;
printk(KERN_INFO "wansock: Cleaning up \n");
unregister_netdevice_notifier(&wanpipe_netdev_notifier);
sock_unregister(PF_WANPIPE);
- return;
+ proto_unregister(&wanpipe_proto);
}
-
int init_module(void)
{
+ int rc;
printk(KERN_INFO "wansock: Registering Socket \n");
+
+ rc = proto_register(&wanpipe_proto, 0);
+ if (rc != 0)
+ goto out;
+
sock_register(&wanpipe_family_ops);
register_netdevice_notifier(&wanpipe_netdev_notifier);
- return 0;
+out:
+ return rc;
}
#endif
MODULE_LICENSE("GPL");