X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=net%2Firda%2Faf_irda.c;h=17699eeb64d78274481bca74888dfc41313fb548;hb=16c70f8c1b54b61c3b951b6fb220df250fe09b32;hp=9e56f712e45dbef9d7d15eb0219fe6e0b1be4ee7;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c index 9e56f712e..17699eeb6 100644 --- a/net/irda/af_irda.c +++ b/net/irda/af_irda.c @@ -42,7 +42,7 @@ * ********************************************************************/ -#include +#include #include #include #include @@ -56,18 +56,18 @@ #include #include -#include +#include #include static int irda_create(struct socket *sock, int protocol); -static struct proto_ops irda_stream_ops; -static struct proto_ops irda_seqpacket_ops; -static struct proto_ops irda_dgram_ops; +static const struct proto_ops irda_stream_ops; +static const struct proto_ops irda_seqpacket_ops; +static const struct proto_ops irda_dgram_ops; #ifdef CONFIG_IRDA_ULTRA -static struct proto_ops irda_ultra_ops; +static const struct proto_ops irda_ultra_ops; #define ULTRA_MAX_DATA 382 #endif /* CONFIG_IRDA_ULTRA */ @@ -87,11 +87,9 @@ static int irda_data_indication(void *instance, void *sap, struct sk_buff *skb) IRDA_DEBUG(3, "%s()\n", __FUNCTION__); - self = (struct irda_sock *) instance; - ASSERT(self != NULL, return -1;); - - sk = self->sk; - ASSERT(sk != NULL, return -1;); + self = instance; + sk = instance; + IRDA_ASSERT(sk != NULL, return -1;); err = sock_queue_rcv_skb(sk, skb); if (err) { @@ -117,7 +115,7 @@ static void irda_disconnect_indication(void *instance, void *sap, struct irda_sock *self; struct sock *sk; - self = (struct irda_sock *) instance; + self = instance; IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); @@ -125,7 +123,7 @@ static void irda_disconnect_indication(void *instance, void *sap, if(skb) dev_kfree_skb(skb); - sk = self->sk; + sk = instance; if (sk == NULL) { IRDA_DEBUG(0, "%s(%p) : BUG : sk is NULL\n", __FUNCTION__, self); @@ -183,11 +181,11 @@ static void irda_connect_confirm(void *instance, void *sap, struct irda_sock *self; struct sock *sk; - self = (struct irda_sock *) instance; + self = instance; IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); - sk = self->sk; + sk = instance; if (sk == NULL) { dev_kfree_skb(skb); return; @@ -206,14 +204,16 @@ static void irda_connect_confirm(void *instance, void *sap, switch (sk->sk_type) { case SOCK_STREAM: if (max_sdu_size != 0) { - ERROR("%s: max_sdu_size must be 0\n", __FUNCTION__); + IRDA_ERROR("%s: max_sdu_size must be 0\n", + __FUNCTION__); return; } self->max_data_size = irttp_get_max_seg_size(self->tsap); break; case SOCK_SEQPACKET: if (max_sdu_size == 0) { - ERROR("%s: max_sdu_size cannot be 0\n", __FUNCTION__); + IRDA_ERROR("%s: max_sdu_size cannot be 0\n", + __FUNCTION__); return; } self->max_data_size = max_sdu_size; @@ -245,11 +245,11 @@ static void irda_connect_indication(void *instance, void *sap, struct irda_sock *self; struct sock *sk; - self = (struct irda_sock *) instance; + self = instance; IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); - sk = self->sk; + sk = instance; if (sk == NULL) { dev_kfree_skb(skb); return; @@ -265,7 +265,8 @@ static void irda_connect_indication(void *instance, void *sap, switch (sk->sk_type) { case SOCK_STREAM: if (max_sdu_size != 0) { - ERROR("%s: max_sdu_size must be 0\n", __FUNCTION__); + IRDA_ERROR("%s: max_sdu_size must be 0\n", + __FUNCTION__); kfree_skb(skb); return; } @@ -273,7 +274,8 @@ static void irda_connect_indication(void *instance, void *sap, break; case SOCK_SEQPACKET: if (max_sdu_size == 0) { - ERROR("%s: max_sdu_size cannot be 0\n", __FUNCTION__); + IRDA_ERROR("%s: max_sdu_size cannot be 0\n", + __FUNCTION__); kfree_skb(skb); return; } @@ -298,15 +300,15 @@ static void irda_connect_indication(void *instance, void *sap, * Accept incoming connection * */ -void irda_connect_response(struct irda_sock *self) +static void irda_connect_response(struct irda_sock *self) { struct sk_buff *skb; IRDA_DEBUG(2, "%s()\n", __FUNCTION__); - ASSERT(self != NULL, return;); + IRDA_ASSERT(self != NULL, return;); - skb = dev_alloc_skb(64); + skb = alloc_skb(64, GFP_ATOMIC); if (skb == NULL) { IRDA_DEBUG(0, "%s() Unable to allocate sk_buff!\n", __FUNCTION__); @@ -332,11 +334,9 @@ static void irda_flow_indication(void *instance, void *sap, LOCAL_FLOW flow) IRDA_DEBUG(2, "%s()\n", __FUNCTION__); - self = (struct irda_sock *) instance; - ASSERT(self != NULL, return;); - - sk = self->sk; - ASSERT(sk != NULL, return;); + self = instance; + sk = instance; + IRDA_ASSERT(sk != NULL, return;); switch (flow) { case FLOW_STOP: @@ -373,7 +373,7 @@ static void irda_getvalue_confirm(int result, __u16 obj_id, self = (struct irda_sock *) priv; if (!self) { - WARNING("%s: lost myself!\n", __FUNCTION__); + IRDA_WARNING("%s: lost myself!\n", __FUNCTION__); return; } @@ -422,7 +422,7 @@ static void irda_selective_discovery_indication(discinfo_t *discovery, self = (struct irda_sock *) priv; if (!self) { - WARNING("%s: lost myself!\n", __FUNCTION__); + IRDA_WARNING("%s: lost myself!\n", __FUNCTION__); return; } @@ -448,7 +448,7 @@ static void irda_discovery_timeout(u_long priv) IRDA_DEBUG(2, "%s()\n", __FUNCTION__); self = (struct irda_sock *) priv; - ASSERT(self != NULL, return;); + IRDA_ASSERT(self != NULL, return;); /* Nothing for the caller */ self->cachelog = NULL; @@ -470,7 +470,7 @@ static int irda_open_tsap(struct irda_sock *self, __u8 tsap_sel, char *name) notify_t notify; if (self->tsap) { - WARNING("%s: busy!\n", __FUNCTION__); + IRDA_WARNING("%s: busy!\n", __FUNCTION__); return -EBUSY; } @@ -510,7 +510,7 @@ static int irda_open_lsap(struct irda_sock *self, int pid) notify_t notify; if (self->lsap) { - WARNING("%s(), busy!\n", __FUNCTION__); + IRDA_WARNING("%s(), busy!\n", __FUNCTION__); return -EBUSY; } @@ -545,10 +545,11 @@ static int irda_find_lsap_sel(struct irda_sock *self, char *name) { IRDA_DEBUG(2, "%s(%p, %s)\n", __FUNCTION__, self, name); - ASSERT(self != NULL, return -1;); + IRDA_ASSERT(self != NULL, return -1;); if (self->iriap) { - WARNING("%s(): busy with a previous query\n", __FUNCTION__); + IRDA_WARNING("%s(): busy with a previous query\n", + __FUNCTION__); return -EBUSY; } @@ -633,7 +634,7 @@ static int irda_discover_daddr_and_lsap_sel(struct irda_sock *self, char *name) IRDA_DEBUG(2, "%s(), name=%s\n", __FUNCTION__, name); - ASSERT(self != NULL, return -1;); + IRDA_ASSERT(self != NULL, return -1;); /* Ask lmp for the current discovery log * Note : we have to use irlmp_get_discoveries(), as opposed @@ -782,7 +783,7 @@ static int irda_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) struct irda_sock *self = irda_sk(sk); int err; - ASSERT(self != NULL, return -1;); + IRDA_ASSERT(self != NULL, return -1;); IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); @@ -839,7 +840,7 @@ static int irda_accept(struct socket *sock, struct socket *newsock, int flags) IRDA_DEBUG(2, "%s()\n", __FUNCTION__); - ASSERT(self != NULL, return -1;); + IRDA_ASSERT(self != NULL, return -1;); err = irda_create(newsock, sk->sk_protocol); if (err) @@ -908,7 +909,7 @@ static int irda_accept(struct socket *sock, struct socket *newsock, int flags) newsk->sk_state = TCP_ESTABLISHED; new = irda_sk(newsk); - ASSERT(new != NULL, return -1;); + IRDA_ASSERT(new != NULL, return -1;); /* Now attach up the new socket */ new->tsap = irttp_dup(self->tsap, new); @@ -1012,11 +1013,23 @@ static int irda_connect(struct socket *sock, struct sockaddr *uaddr, self->daddr = addr->sir_addr; IRDA_DEBUG(1, "%s(), daddr = %08x\n", __FUNCTION__, self->daddr); - /* Query remote LM-IAS */ - err = irda_find_lsap_sel(self, addr->sir_name); - if (err) { - IRDA_DEBUG(0, "%s(), connect failed!\n", __FUNCTION__); - return err; + /* If we don't have a valid service name, we assume the + * user want to connect on a specific LSAP. Prevent + * the use of invalid LSAPs (IrLMP 1.1 p10). Jean II */ + if((addr->sir_name[0] != '\0') || + (addr->sir_lsap_sel >= 0x70)) { + /* Query remote LM-IAS using service name */ + err = irda_find_lsap_sel(self, addr->sir_name); + if (err) { + IRDA_DEBUG(0, "%s(), connect failed!\n", __FUNCTION__); + return err; + } + } else { + /* Directly connect to the remote LSAP + * specified by the sir_lsap field. + * Please use with caution, in IrDA LSAPs are + * dynamic and there is no "well-known" LSAP. */ + self->dtsap_sel = addr->sir_lsap_sel; } } @@ -1058,6 +1071,12 @@ static int irda_connect(struct socket *sock, struct sockaddr *uaddr, return 0; } +static struct proto irda_proto = { + .name = "IRDA", + .owner = THIS_MODULE, + .obj_size = sizeof(struct irda_sock), +}; + /* * Function irda_create (sock, protocol) * @@ -1082,28 +1101,19 @@ static int irda_create(struct socket *sock, int protocol) } /* Allocate networking socket */ - if ((sk = sk_alloc(PF_IRDA, GFP_ATOMIC, 1, NULL)) == NULL) - return -ENOMEM; - - /* Allocate IrDA socket */ - self = sk->sk_protinfo = kmalloc(sizeof(struct irda_sock), GFP_ATOMIC); - if (self == NULL) { - sk_free(sk); + sk = sk_alloc(PF_IRDA, GFP_ATOMIC, &irda_proto, 1); + if (sk == NULL) return -ENOMEM; - } - memset(self, 0, sizeof(struct irda_sock)); + self = irda_sk(sk); IRDA_DEBUG(2, "%s() : self is %p\n", __FUNCTION__, self); init_waitqueue_head(&self->query_wait); /* Initialise networking socket struct */ sock_init_data(sock, sk); /* Note : set sk->sk_refcnt to 1 */ - sk_set_owner(sk, THIS_MODULE); sk->sk_family = PF_IRDA; sk->sk_protocol = protocol; - /* Link networking socket and IrDA socket structs together */ - self->sk = sk; switch (sock->type) { case SOCK_STREAM: @@ -1131,7 +1141,8 @@ static int irda_create(struct socket *sock, int protocol) self->max_sdu_size_rx = TTP_SAR_UNBOUND; break; default: - ERROR("%s: protocol not supported!\n", __FUNCTION__); + IRDA_ERROR("%s: protocol not supported!\n", + __FUNCTION__); return -ESOCKTNOSUPPORT; } break; @@ -1155,11 +1166,11 @@ static int irda_create(struct socket *sock, int protocol) * Destroy socket * */ -void irda_destroy_socket(struct irda_sock *self) +static void irda_destroy_socket(struct irda_sock *self) { IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); - ASSERT(self != NULL, return;); + IRDA_ASSERT(self != NULL, return;); /* Unregister with IrLMP */ irlmp_unregister_client(self->ckey); @@ -1187,7 +1198,6 @@ void irda_destroy_socket(struct irda_sock *self) self->lsap = NULL; } #endif /* CONFIG_IRDA_ULTRA */ - kfree(self); } /* @@ -1208,8 +1218,6 @@ static int irda_release(struct socket *sock) /* Destroy IrDA socket */ irda_destroy_socket(irda_sk(sk)); - /* Prevent sock_def_destruct() to create havoc */ - sk->sk_protinfo = NULL; sock_orphan(sk); sock->sk = NULL; @@ -1266,10 +1274,10 @@ static int irda_sendmsg(struct kiocb *iocb, struct socket *sock, unsigned char *asmptr; int err; - IRDA_DEBUG(4, "%s(), len=%d\n", __FUNCTION__, len); + IRDA_DEBUG(4, "%s(), len=%zd\n", __FUNCTION__, len); /* Note : socket.c set MSG_EOR on SEQPACKET sockets */ - if (msg->msg_flags & ~(MSG_DONTWAIT | MSG_EOR)) + if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR|MSG_CMSG_COMPAT)) return -EINVAL; if (sk->sk_shutdown & SEND_SHUTDOWN) { @@ -1281,7 +1289,7 @@ static int irda_sendmsg(struct kiocb *iocb, struct socket *sock, return -ENOTCONN; self = irda_sk(sk); - ASSERT(self != NULL, return -1;); + IRDA_ASSERT(self != NULL, return -1;); /* Check if IrTTP is wants us to slow down */ @@ -1293,9 +1301,9 @@ static int irda_sendmsg(struct kiocb *iocb, struct socket *sock, if (sk->sk_state != TCP_ESTABLISHED) return -ENOTCONN; - /* Check that we don't send out to big frames */ + /* Check that we don't send out too big frames */ if (len > self->max_data_size) { - IRDA_DEBUG(2, "%s(), Chopping frame from %d to %d bytes!\n", + IRDA_DEBUG(2, "%s(), Chopping frame from %zd to %d bytes!\n", __FUNCTION__, len, self->max_data_size); len = self->max_data_size; } @@ -1344,7 +1352,7 @@ static int irda_recvmsg_dgram(struct kiocb *iocb, struct socket *sock, IRDA_DEBUG(4, "%s()\n", __FUNCTION__); - ASSERT(self != NULL, return -1;); + IRDA_ASSERT(self != NULL, return -1;); skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT, flags & MSG_DONTWAIT, &err); @@ -1355,7 +1363,7 @@ static int irda_recvmsg_dgram(struct kiocb *iocb, struct socket *sock, copied = skb->len; if (copied > size) { - IRDA_DEBUG(2, "%s(), Received truncated frame (%d < %d)!\n", + IRDA_DEBUG(2, "%s(), Received truncated frame (%zd < %zd)!\n", __FUNCTION__, copied, size); copied = size; msg->msg_flags |= MSG_TRUNC; @@ -1396,7 +1404,7 @@ static int irda_recvmsg_stream(struct kiocb *iocb, struct socket *sock, IRDA_DEBUG(3, "%s()\n", __FUNCTION__); - ASSERT(self != NULL, return -1;); + IRDA_ASSERT(self != NULL, return -1;); if (sock->flags & __SO_ACCEPTCON) return(-EINVAL); @@ -1430,8 +1438,9 @@ static int irda_recvmsg_stream(struct kiocb *iocb, struct socket *sock, /* * POSIX 1003.1g mandates this order. */ - if (sk->sk_err) - ret = sock_error(sk); + ret = sock_error(sk); + if (ret) + break; else if (sk->sk_shutdown & RCV_SHUTDOWN) ; else if (noblock) @@ -1519,9 +1528,9 @@ static int irda_sendmsg_dgram(struct kiocb *iocb, struct socket *sock, unsigned char *asmptr; int err; - IRDA_DEBUG(4, "%s(), len=%d\n", __FUNCTION__, len); + IRDA_DEBUG(4, "%s(), len=%zd\n", __FUNCTION__, len); - if (msg->msg_flags & ~MSG_DONTWAIT) + if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_CMSG_COMPAT)) return -EINVAL; if (sk->sk_shutdown & SEND_SHUTDOWN) { @@ -1533,15 +1542,15 @@ static int irda_sendmsg_dgram(struct kiocb *iocb, struct socket *sock, return -ENOTCONN; self = irda_sk(sk); - ASSERT(self != NULL, return -1;); + IRDA_ASSERT(self != NULL, return -1;); /* - * Check that we don't send out to big frames. This is an unreliable + * Check that we don't send out too big frames. This is an unreliable * service, so we have no fragmentation and no coalescence */ if (len > self->max_data_size) { IRDA_DEBUG(0, "%s(), Warning to much data! " - "Chopping frame from %d to %d bytes!\n", + "Chopping frame from %zd to %d bytes!\n", __FUNCTION__, len, self->max_data_size); len = self->max_data_size; } @@ -1591,9 +1600,9 @@ static int irda_sendmsg_ultra(struct kiocb *iocb, struct socket *sock, unsigned char *asmptr; int err; - IRDA_DEBUG(4, "%s(), len=%d\n", __FUNCTION__, len); + IRDA_DEBUG(4, "%s(), len=%zd\n", __FUNCTION__, len); - if (msg->msg_flags & ~MSG_DONTWAIT) + if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_CMSG_COMPAT)) return -EINVAL; if (sk->sk_shutdown & SEND_SHUTDOWN) { @@ -1602,7 +1611,7 @@ static int irda_sendmsg_ultra(struct kiocb *iocb, struct socket *sock, } self = irda_sk(sk); - ASSERT(self != NULL, return -1;); + IRDA_ASSERT(self != NULL, return -1;); /* Check if an address was specified with sendto. Jean II */ if (msg->msg_name) { @@ -1632,12 +1641,12 @@ static int irda_sendmsg_ultra(struct kiocb *iocb, struct socket *sock, } /* - * Check that we don't send out to big frames. This is an unreliable + * Check that we don't send out too big frames. This is an unreliable * service, so we have no fragmentation and no coalescence */ if (len > self->max_data_size) { IRDA_DEBUG(0, "%s(), Warning to much data! " - "Chopping frame from %d to %d bytes!\n", + "Chopping frame from %zd to %d bytes!\n", __FUNCTION__, len, self->max_data_size); len = self->max_data_size; } @@ -1675,7 +1684,7 @@ static int irda_shutdown(struct socket *sock, int how) struct sock *sk = sock->sk; struct irda_sock *self = irda_sk(sk); - ASSERT(self != NULL, return -1;); + IRDA_ASSERT(self != NULL, return -1;); IRDA_DEBUG(1, "%s(%p)\n", __FUNCTION__, self); @@ -1779,7 +1788,7 @@ static int irda_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) amount = sk->sk_sndbuf - atomic_read(&sk->sk_wmem_alloc); if (amount < 0) amount = 0; - if (put_user(amount, (unsigned int *)arg)) + if (put_user(amount, (unsigned int __user *)arg)) return -EFAULT; return 0; } @@ -1790,14 +1799,14 @@ static int irda_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) /* These two are safe on a single CPU system as only user tasks fiddle here */ if ((skb = skb_peek(&sk->sk_receive_queue)) != NULL) amount = skb->len; - if (put_user(amount, (unsigned int *)arg)) + if (put_user(amount, (unsigned int __user *)arg)) return -EFAULT; return 0; } case SIOCGSTAMP: if (sk != NULL) - return sock_get_timestamp(sk, (struct timeval *)arg); + return sock_get_timestamp(sk, (struct timeval __user *)arg); return -EINVAL; case SIOCGIFADDR: @@ -1813,13 +1822,26 @@ static int irda_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) return -EINVAL; default: IRDA_DEBUG(1, "%s(), doing device ioctl!\n", __FUNCTION__); - return dev_ioctl(cmd, (void *) arg); + return -ENOIOCTLCMD; } /*NOTREACHED*/ return 0; } +#ifdef CONFIG_COMPAT +/* + * Function irda_ioctl (sock, cmd, arg) + */ +static int irda_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) +{ + /* + * All IRDA's ioctl are standard ones. + */ + return -ENOIOCTLCMD; +} +#endif + /* * Function irda_setsockopt (sock, level, optname, optval, optlen) * @@ -1827,7 +1849,7 @@ static int irda_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) * */ static int irda_setsockopt(struct socket *sock, int level, int optname, - char *optval, int optlen) + char __user *optval, int optlen) { struct sock *sk = sock->sk; struct irda_sock *self = irda_sk(sk); @@ -1836,7 +1858,7 @@ static int irda_setsockopt(struct socket *sock, int level, int optname, struct ias_attrib * ias_attr; /* Attribute in IAS object */ int opt; - ASSERT(self != NULL, return -1;); + IRDA_ASSERT(self != NULL, return -1;); IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); @@ -1860,7 +1882,7 @@ static int irda_setsockopt(struct socket *sock, int level, int optname, return -ENOMEM; /* Copy query to the driver. */ - if (copy_from_user(ias_opt, (char *)optval, optlen)) { + if (copy_from_user(ias_opt, optval, optlen)) { kfree(ias_opt); return -EFAULT; } @@ -1962,7 +1984,7 @@ static int irda_setsockopt(struct socket *sock, int level, int optname, return -ENOMEM; /* Copy query to the driver. */ - if (copy_from_user(ias_opt, (char *)optval, optlen)) { + if (copy_from_user(ias_opt, optval, optlen)) { kfree(ias_opt); return -EFAULT; } @@ -2005,14 +2027,14 @@ static int irda_setsockopt(struct socket *sock, int level, int optname, } /* Remove the attribute (and maybe the object) */ - irias_delete_attrib(ias_obj, ias_attr); + irias_delete_attrib(ias_obj, ias_attr, 1); kfree(ias_opt); break; case IRLMP_MAX_SDU_SIZE: if (optlen < sizeof(int)) return -EINVAL; - if (get_user(opt, (int *)optval)) + if (get_user(opt, (int __user *)optval)) return -EFAULT; /* Only possible for a seqpacket service (TTP with SAR) */ @@ -2021,8 +2043,8 @@ static int irda_setsockopt(struct socket *sock, int level, int optname, __FUNCTION__, opt); self->max_sdu_size_rx = opt; } else { - WARNING("%s: not allowed to set MAXSDUSIZE for this socket type!\n", - __FUNCTION__); + IRDA_WARNING("%s: not allowed to set MAXSDUSIZE for this socket type!\n", + __FUNCTION__); return -ENOPROTOOPT; } break; @@ -2031,7 +2053,7 @@ static int irda_setsockopt(struct socket *sock, int level, int optname, return -EINVAL; /* The input is really a (__u8 hints[2]), easier as an int */ - if (get_user(opt, (int *)optval)) + if (get_user(opt, (int __user *)optval)) return -EFAULT; /* Unregister any old registration */ @@ -2050,7 +2072,7 @@ static int irda_setsockopt(struct socket *sock, int level, int optname, return -EINVAL; /* The input is really a (__u8 hints[2]), easier as an int */ - if (get_user(opt, (int *)optval)) + if (get_user(opt, (int __user *)optval)) return -EFAULT; /* Set the new hint mask */ @@ -2121,7 +2143,7 @@ static int irda_extract_ias_value(struct irda_ias_set *ias_opt, * Function irda_getsockopt (sock, level, optname, optval, optlen) */ static int irda_getsockopt(struct socket *sock, int level, int optname, - char *optval, int *optlen) + char __user *optval, int __user *optlen) { struct sock *sk = sock->sk; struct irda_sock *self = irda_sk(sk); @@ -2211,7 +2233,7 @@ bed: return -ENOMEM; /* Copy query to the driver. */ - if (copy_from_user((char *) ias_opt, (char *)optval, len)) { + if (copy_from_user(ias_opt, optval, len)) { kfree(ias_opt); return -EFAULT; } @@ -2245,7 +2267,7 @@ bed: } /* Copy reply to the user */ - if (copy_to_user((char *)optval, (char *) ias_opt, + if (copy_to_user(optval, ias_opt, sizeof(struct irda_ias_set))) { kfree(ias_opt); return -EFAULT; @@ -2267,7 +2289,7 @@ bed: return -ENOMEM; /* Copy query to the driver. */ - if (copy_from_user((char *) ias_opt, (char *)optval, len)) { + if (copy_from_user(ias_opt, optval, len)) { kfree(ias_opt); return -EFAULT; } @@ -2296,8 +2318,8 @@ bed: /* Check that we can proceed with IAP */ if (self->iriap) { - WARNING("%s: busy with a previous query\n", - __FUNCTION__); + IRDA_WARNING("%s: busy with a previous query\n", + __FUNCTION__); kfree(ias_opt); return -EBUSY; } @@ -2351,7 +2373,7 @@ bed: } /* Copy reply to the user */ - if (copy_to_user((char *)optval, (char *) ias_opt, + if (copy_to_user(optval, ias_opt, sizeof(struct irda_ias_set))) { kfree(ias_opt); return -EFAULT; @@ -2378,7 +2400,7 @@ bed: if (len != sizeof(int)) return -EINVAL; /* Get timeout in ms (max time we block the caller) */ - if (get_user(val, (int *)optval)) + if (get_user(val, (int __user *)optval)) return -EFAULT; /* Tell IrLMP we want to be notified */ @@ -2438,7 +2460,7 @@ bed: * If the user want more details, he should query * the whole discovery log and pick one device... */ - if (put_user(daddr, (int *)optval)) + if (put_user(daddr, (int __user *)optval)) return -EFAULT; break; @@ -2455,7 +2477,7 @@ static struct net_proto_family irda_family_ops = { .owner = THIS_MODULE, }; -static struct proto_ops SOCKOPS_WRAPPED(irda_stream_ops) = { +static const struct proto_ops SOCKOPS_WRAPPED(irda_stream_ops) = { .family = PF_IRDA, .owner = THIS_MODULE, .release = irda_release, @@ -2466,6 +2488,9 @@ static struct proto_ops SOCKOPS_WRAPPED(irda_stream_ops) = { .getname = irda_getname, .poll = irda_poll, .ioctl = irda_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = irda_compat_ioctl, +#endif .listen = irda_listen, .shutdown = irda_shutdown, .setsockopt = irda_setsockopt, @@ -2476,7 +2501,7 @@ static struct proto_ops SOCKOPS_WRAPPED(irda_stream_ops) = { .sendpage = sock_no_sendpage, }; -static struct proto_ops SOCKOPS_WRAPPED(irda_seqpacket_ops) = { +static const struct proto_ops SOCKOPS_WRAPPED(irda_seqpacket_ops) = { .family = PF_IRDA, .owner = THIS_MODULE, .release = irda_release, @@ -2487,6 +2512,9 @@ static struct proto_ops SOCKOPS_WRAPPED(irda_seqpacket_ops) = { .getname = irda_getname, .poll = datagram_poll, .ioctl = irda_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = irda_compat_ioctl, +#endif .listen = irda_listen, .shutdown = irda_shutdown, .setsockopt = irda_setsockopt, @@ -2497,7 +2525,7 @@ static struct proto_ops SOCKOPS_WRAPPED(irda_seqpacket_ops) = { .sendpage = sock_no_sendpage, }; -static struct proto_ops SOCKOPS_WRAPPED(irda_dgram_ops) = { +static const struct proto_ops SOCKOPS_WRAPPED(irda_dgram_ops) = { .family = PF_IRDA, .owner = THIS_MODULE, .release = irda_release, @@ -2508,6 +2536,9 @@ static struct proto_ops SOCKOPS_WRAPPED(irda_dgram_ops) = { .getname = irda_getname, .poll = datagram_poll, .ioctl = irda_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = irda_compat_ioctl, +#endif .listen = irda_listen, .shutdown = irda_shutdown, .setsockopt = irda_setsockopt, @@ -2519,7 +2550,7 @@ static struct proto_ops SOCKOPS_WRAPPED(irda_dgram_ops) = { }; #ifdef CONFIG_IRDA_ULTRA -static struct proto_ops SOCKOPS_WRAPPED(irda_ultra_ops) = { +static const struct proto_ops SOCKOPS_WRAPPED(irda_ultra_ops) = { .family = PF_IRDA, .owner = THIS_MODULE, .release = irda_release, @@ -2530,6 +2561,9 @@ static struct proto_ops SOCKOPS_WRAPPED(irda_ultra_ops) = { .getname = irda_getname, .poll = datagram_poll, .ioctl = irda_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = irda_compat_ioctl, +#endif .listen = sock_no_listen, .shutdown = irda_shutdown, .setsockopt = irda_setsockopt, @@ -2557,9 +2591,12 @@ SOCKOPS_WRAP(irda_ultra, PF_IRDA); */ int __init irsock_init(void) { - sock_register(&irda_family_ops); + int rc = proto_register(&irda_proto, 0); - return 0; + if (rc == 0) + rc = sock_register(&irda_family_ops); + + return rc; } /* @@ -2571,6 +2608,5 @@ int __init irsock_init(void) void __exit irsock_cleanup(void) { sock_unregister(PF_IRDA); - - return; + proto_unregister(&irda_proto); }