From: <ps...@se...> - 2007-08-03 12:27:28
|
Hi All, i am working on IrDA sockets support for Portable.NET (www.dotgnu.org). The code uses MSG_NOSIGNAL flag when sending data on socket. This works for standard unix socket, but when i have an IrDA socket it returns with errno EINVAL. Without the MSG_NOSIGNAL everything works even on IrDA sockets normally. Does anybody knows answer to the following questions, please? 1/ Is MSG_NOSIGNAL flag supported or IrDA sockets? 2/ If it is supported - am i missing something? 3/ If it is not supported - is there any reason why it's not supported? Thanks Radek |
From: Samuel O. <sa...@so...> - 2007-08-06 00:00:25
|
Hi Radek, On Fri, Aug 03, 2007 at 02:27:18PM +0200, radek polak wrote: > Hi All, > i am working on IrDA sockets support for Portable.NET (www.dotgnu.org). The code uses MSG_NOSIGNAL flag when sending data on socket. This works for standard unix socket, but when i have an IrDA socket it returns with errno EINVAL. Without the MSG_NOSIGNAL everything works even on IrDA sockets normally. > > Does anybody knows answer to the following questions, please? > > 1/ Is MSG_NOSIGNAL flag supported or IrDA sockets? No, it's currently not. If you set the MSG_NOSIGNAL flag you will get an EINVAL. > 2/ If it is supported - am i missing something? > 3/ If it is not supported - is there any reason why it's not supported? Not to my knowledge, no. I didn't write the code, but I guess it's a missing feature. I'll double check with the original author of the code, but meanwhile could you patch your kernel with the following patch ? It should enable MSG_NOSIGNAL support...If it works for you and I get a confirmation from Jean that there is no particular reason for leaving out MSG_NOSIGNAL support, I'll push the patch upstream. Here goes the patch: diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c index 4c670cf..dce2661 100644 --- a/net/irda/af_irda.c +++ b/net/irda/af_irda.c @@ -1245,18 +1245,17 @@ static int irda_sendmsg(struct kiocb *iocb, struct socket *sock, struct sock *sk = sock->sk; struct irda_sock *self; struct sk_buff *skb; - int err; + int err = -EPIPE; 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|MSG_CMSG_COMPAT)) + if (msg->msg_flags & + ~(MSG_DONTWAIT | MSG_EOR | MSG_CMSG_COMPAT | MSG_NOSIGNAL)) return -EINVAL; - if (sk->sk_shutdown & SEND_SHUTDOWN) { - send_sig(SIGPIPE, current, 0); - return -EPIPE; - } + if (sk->sk_shutdown & SEND_SHUTDOWN) + goto out_err; if (sk->sk_state != TCP_ESTABLISHED) return -ENOTCONN; @@ -1283,7 +1282,7 @@ static int irda_sendmsg(struct kiocb *iocb, struct socket *sock, skb = sock_alloc_send_skb(sk, len + self->max_header_size + 16, msg->msg_flags & MSG_DONTWAIT, &err); if (!skb) - return -ENOBUFS; + goto out_err; skb_reserve(skb, self->max_header_size + 16); skb_reset_transport_header(skb); @@ -1291,7 +1290,7 @@ static int irda_sendmsg(struct kiocb *iocb, struct socket *sock, err = memcpy_fromiovec(skb_transport_header(skb), msg->msg_iov, len); if (err) { kfree_skb(skb); - return err; + goto out_err; } /* @@ -1301,10 +1300,14 @@ static int irda_sendmsg(struct kiocb *iocb, struct socket *sock, err = irttp_data_request(self->tsap, skb); if (err) { IRDA_DEBUG(0, "%s(), err=%d\n", __FUNCTION__, err); - return err; + goto out_err; } /* Tell client how much data we actually sent */ return len; + + out_err: + return sk_stream_error(sk, msg->msg_flags, err); + } /* > > Thanks > > Radek > > ------------------------------------------------------------------------- > This SF.net email is sponsored by: Splunk Inc. > Still grepping through log files to find problems? Stop. > Now Search log events and configuration files using AJAX and a browser. > Download your FREE copy of Splunk now >> http://get.splunk.com/ > _______________________________________________ > irda-users mailing list > ird...@li... > http://lists.sourceforge.net/lists/listinfo/irda-users |
From: Radek P. <ps...@se...> - 2007-08-07 07:54:07
|
Hi Samuel, you patch works here. Now i can use MSG_NOSIGNAL flag without error. I'll use patched kernel and i hope it will make it's way into vanilla kernel. Thanks! Radek > Hi Radek, > > On Fri, Aug 03, 2007 at 02:27:18PM +0200, radek polak wrote: > >> Hi All, >> i am working on IrDA sockets support for Portable.NET (www.dotgnu.org). The code uses MSG_NOSIGNAL flag when sending data on socket. This works for standard unix socket, but when i have an IrDA socket it returns with errno EINVAL. Without the MSG_NOSIGNAL everything works even on IrDA sockets normally. >> >> Does anybody knows answer to the following questions, please? >> >> 1/ Is MSG_NOSIGNAL flag supported or IrDA sockets? >> > No, it's currently not. If you set the MSG_NOSIGNAL flag you will get an > EINVAL. > > >> 2/ If it is supported - am i missing something? >> 3/ If it is not supported - is there any reason why it's not supported? >> > Not to my knowledge, no. I didn't write the code, but I guess it's a > missing feature. I'll double check with the original author of the code, > but meanwhile could you patch your kernel with the following patch ? It > should enable MSG_NOSIGNAL support...If it works for you and I get a > confirmation from Jean that there is no particular reason for leaving > out MSG_NOSIGNAL support, I'll push the patch upstream. > Here goes the patch: > > diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c > index 4c670cf..dce2661 100644 > --- a/net/irda/af_irda.c > +++ b/net/irda/af_irda.c > @@ -1245,18 +1245,17 @@ static int irda_sendmsg(struct kiocb *iocb, struct socket *sock, > struct sock *sk = sock->sk; > struct irda_sock *self; > struct sk_buff *skb; > - int err; > + int err = -EPIPE; > > 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|MSG_CMSG_COMPAT)) > + if (msg->msg_flags & > + ~(MSG_DONTWAIT | MSG_EOR | MSG_CMSG_COMPAT | MSG_NOSIGNAL)) > return -EINVAL; > > - if (sk->sk_shutdown & SEND_SHUTDOWN) { > - send_sig(SIGPIPE, current, 0); > - return -EPIPE; > - } > + if (sk->sk_shutdown & SEND_SHUTDOWN) > + goto out_err; > > if (sk->sk_state != TCP_ESTABLISHED) > return -ENOTCONN; > @@ -1283,7 +1282,7 @@ static int irda_sendmsg(struct kiocb *iocb, struct socket *sock, > skb = sock_alloc_send_skb(sk, len + self->max_header_size + 16, > msg->msg_flags & MSG_DONTWAIT, &err); > if (!skb) > - return -ENOBUFS; > + goto out_err; > > skb_reserve(skb, self->max_header_size + 16); > skb_reset_transport_header(skb); > @@ -1291,7 +1290,7 @@ static int irda_sendmsg(struct kiocb *iocb, struct socket *sock, > err = memcpy_fromiovec(skb_transport_header(skb), msg->msg_iov, len); > if (err) { > kfree_skb(skb); > - return err; > + goto out_err; > } > > /* > @@ -1301,10 +1300,14 @@ static int irda_sendmsg(struct kiocb *iocb, struct socket *sock, > err = irttp_data_request(self->tsap, skb); > if (err) { > IRDA_DEBUG(0, "%s(), err=%d\n", __FUNCTION__, err); > - return err; > + goto out_err; > } > /* Tell client how much data we actually sent */ > return len; > + > + out_err: > + return sk_stream_error(sk, msg->msg_flags, err); > + > } > > /* > > >> Thanks >> >> Radek >> >> ------------------------------------------------------------------------- >> This SF.net email is sponsored by: Splunk Inc. >> Still grepping through log files to find problems? Stop. >> Now Search log events and configuration files using AJAX and a browser. >> Download your FREE copy of Splunk now >> http://get.splunk.com/ >> _______________________________________________ >> irda-users mailing list >> ird...@li... >> http://lists.sourceforge.net/lists/listinfo/irda-users >> > > > |