> As a workaround, run the kernel with nosmap. OK, I guessed it correctly and tried with kernel commandline "nosmap". Because it works normally on virtual box.
With "nosmap" I don't see any kernel oops, but there are no prints either. I mean in my rtnet-server/client, I have given some print statement. But I am not seeing those print statement coming on the console now. The print statements are coming for normal "xeno_task" application. Is there any clue for this ? Thanks, Pintu On Thu, Jun 21, 2018 at 8:27 PM Jan Kiszka <[email protected]> wrote: > > On 2018-06-21 15:41, Jan Kiszka wrote: > > On 2018-06-21 13:55, Jan Kiszka wrote: > >> On 2018-06-21 13:20, Pintu Kumar wrote: > >>> Dear Jan, Greg, > >>> > >>> Is there any pointer about this issue? > >>> This is blocking my next work.. > >> > >> Does this solve the issue AND still generate valid UDP checksums (please > >> check with wireshark or against a normal networking stack? > >> > >> diff --git a/kernel/drivers/net/stack/ipv4/udp/udp.c > >> b/kernel/drivers/net/stack/ipv4/udp/udp.c > >> index 8e80d3e0b..bb0b0fc12 100644 > >> --- a/kernel/drivers/net/stack/ipv4/udp/udp.c > >> +++ b/kernel/drivers/net/stack/ipv4/udp/udp.c > >> @@ -556,18 +556,17 @@ static int rt_udp_getfrag(const void *p, unsigned > >> char *to, > >> if (offset) > >> return rtnet_read_from_iov(ufh->fd, ufh->iov, ufh->iovlen, to, > >> fraglen); > >> > >> - /* Checksum of the complete data part of the UDP message: */ > >> - for (i = 0; i < ufh->iovlen; i++) { > >> - ufh->wcheck = csum_partial(ufh->iov[i].iov_base, > >> ufh->iov[i].iov_len, > >> - ufh->wcheck); > >> - } > >> - > >> ret = rtnet_read_from_iov(ufh->fd, ufh->iov, ufh->iovlen, > >> to + sizeof(struct udphdr), > >> fraglen - sizeof(struct udphdr)); > >> if (ret) > >> return ret; > >> > >> + /* Checksum of the complete data part of the UDP message: */ > >> + ufh->wcheck = csum_partial(to + sizeof(struct udphdr), > >> + fraglen - sizeof(struct udphdr), > >> + ufh->wcheck); > >> + > >> /* Checksum of the udp header: */ > >> ufh->wcheck = csum_partial((unsigned char *)ufh, > >> sizeof(struct udphdr), ufh->wcheck); > >> > > > > This was definitely wrong. Here is another try: > > > > diff --git a/kernel/drivers/net/stack/ipv4/udp/udp.c > > b/kernel/drivers/net/stack/ipv4/udp/udp.c > > index 8e80d3e0b..6cf1d369e 100644 > > --- a/kernel/drivers/net/stack/ipv4/udp/udp.c > > +++ b/kernel/drivers/net/stack/ipv4/udp/udp.c > > @@ -549,6 +549,7 @@ static int rt_udp_getfrag(const void *p, unsigned char > > *to, > > unsigned int offset, unsigned int fraglen) > > { > > struct udpfakehdr *ufh = (struct udpfakehdr *)p; > > + unsigned int datalen = 0; > > int i, ret; > > > > > > @@ -556,18 +557,18 @@ static int rt_udp_getfrag(const void *p, unsigned > > char *to, > > if (offset) > > return rtnet_read_from_iov(ufh->fd, ufh->iov, ufh->iovlen, to, > > fraglen); > > > > - /* Checksum of the complete data part of the UDP message: */ > > - for (i = 0; i < ufh->iovlen; i++) { > > - ufh->wcheck = csum_partial(ufh->iov[i].iov_base, > > ufh->iov[i].iov_len, > > - ufh->wcheck); > > - } > > - > > ret = rtnet_read_from_iov(ufh->fd, ufh->iov, ufh->iovlen, > > to + sizeof(struct udphdr), > > fraglen - sizeof(struct udphdr)); > > if (ret) > > return ret; > > > > + /* Checksum of the complete data part of the UDP message: */ > > + for (i = 0; i < ufh->iovlen; i++) > > + datalen += ufh->iov[i].iov_len; > > + ufh->wcheck = csum_partial(to + sizeof(struct udphdr), datalen, > > + ufh->wcheck); > > + > > /* Checksum of the udp header: */ > > ufh->wcheck = csum_partial((unsigned char *)ufh, > > sizeof(struct udphdr), ufh->wcheck); > > > > OK, this won't work either if fraglen < datalen. We have to rework this > more fundamentally. > > As a workaround, run the kernel with nosmap. > > Jan _______________________________________________ Xenomai mailing list [email protected] https://xenomai.org/mailman/listinfo/xenomai
