Problem with UDP and SAMR21-XPRO

Hi RIOTers! I’ve discovered a possible bug in RIOT. I’m working with 2 samr21-xpro: on the first is running gnrc_border_router (I’ll call it A) and on the other (I’ll call it B) is running gnrc_networking. I’ve well configured my scenario infact I can ping both my nodes from linux shell. But, when I send a UDP packet to B (with nc) it is forwarded correctly on tap interface (I seen it on wireshark) but it arrives corrupted (wrong checksum) to B and it is dropped by UDP thread. I’ve enabled packet dump and the packet arrives with different packet lengths in ipv6 and udp headers (fixed to 8, it is the UDP header length) and the udp payload is removed.

How can I fix this problem? Has anyone this problem?

I’m looking forward for a reply

Cheers,

Mattia Antonini

Hi Mattia,

Thanks for reporting this issue.

I've discovered a possible bug in RIOT. I'm working with 2 samr21-xpro: on the first is running gnrc_border_router (I'll call it A) and on the other (I'll call it B) is running gnrc_networking. I've well configured my scenario infact I can ping both my nodes from linux shell. But, when I send a UDP packet to B (with nc) it is forwarded correctly on tap interface (I seen it on wireshark) but it arrives corrupted (wrong checksum) to B and it is dropped by UDP thread. I've enabled packet dump and the packet arrives with different packet lengths in ipv6 and udp headers (fixed to 8, it is the UDP header length) and the udp payload is removed.

I have the exact same problem although I didn't track it as deep as you did.

How can I fix this problem?

A regression was introduced 2 or 3 weeks ago in master and you could first "git bisect" to try to identify the incriminated commit.

Thanks,

Alex

Hi all,

though I do not have the same setup ready for testing, I _cannot_ confirm any problems with UDP on latest RIOT master branch.

I just tested UDP on a SAMR21-XPRO running gnrc_networking example and successfully send and received UDP data from and to a RasPi with Openlabs transceiver running netcat on latest Raspbian-Linux.

Could you clarify which RIOT branch/commit you use?

Best,   Sebastian

Hi,

though I do not have the same setup ready for testing, I _cannot_ confirm any problems with UDP on latest RIOT master branch.

I just tested UDP on a SAMR21-XPRO running gnrc_networking example and successfully send and received UDP data from and to a RasPi with Openlabs transceiver running netcat on latest Raspbian-Linux.

Could you clarify which RIOT branch/commit you use?

Latest master. From what you say, the problem comes from the RIOT BR.

Cheers,

Alex

Hi all! I found the problem in the commit 0de34c9 [1]. Can anyone check this commit? I’ve also tried the commit before ( f7bd237) and everything works.

Cheers,

Mattia

[1] https://github.com/RIOT-OS/RIOT/commit/0de34c91c618829a845feef753b3ea32683365ed

Hi Mattia, hi Alex, due to having my head mostly on the defense of my master thesis I have next monday I wasn't able to look into this as promised. :frowning:

Thanks however Mattia for the in-depth analysis and the bisect! As soon as I find some head space I will look into it, too.

Cheers, Martine

Hi, I finally will have some time to look into it, but it would also be great if there would be an issue for that on GitHub and maybe to involve Takuo, since it is their PR that seem to have broken it.

Cheers, Martine

Hi Martine, I think I’ve fixed this problem. I’ve tested my scenario with gnr_networking and microcoap_server and all is working :slight_smile: Which is the procedure to push the code? I’ve never done it before :slight_smile:

Cheers, Mattia

Hi, make a fork of master on GitHub [1] (hit the fork button in the upper right corner) and clone the fork to your local machine:

$ git clone git@github.com:<your_username>/RIOT.git

or, if you already cloned the RIOT-OS repository just add it as another remote

$ git remote add mine git@github.com:<your_username>/RIOT.git $ git fetch mine

It's important to use the SSH-URL here so you have push rights to that remote (I think instead of SSH you can actually also use the HTTP-URL for push rights, but I'm not sure and never tried that).

Create a new branch from master

$ git checkout -b gnrc_ipv6/pr/udp-fix master

Apply your changes and commit them

$ git commit -am "gnrc_ipv6: fix UDP issue"

Maybe describe the fix a little bit better but keep it under 72 characters in the subject line

Push to your repo:

$ git push -u mine gnrc_ipv6/pr/udp-fix

Ideally there is a new button on GitHub [1] now, that gives you the ability to create a Pull Request to the main repository for your branch, but if not (might happen if your master branch was a little older). You have two ways of fixing this. The harder, but cleaner approach (which you might need to do anyways so better do it), would be to rebase:

$ git fetch origin $ git rebase origin/master # fix merge conflicts that might occure using if you are on ubuntu: installing Meld (`sudo apt-get install meld`) provides a nice GUI to resolve them $ git mergetool # ... resolve merge-conflict (1) $ git rebase --continue # ... resolve merge-conflict (2) # you might have to repeat that step several times depending on the number of commits that end up in your branch $ git push -f # force-push to your branch

The easier way is just to follow this piece of instruction [2]. But if there is a merge conflict the reviewer might ask you to rebase anyway.

[1] https://github.com/RIOT-OS/RIOT [2] https://help.github.com/articles/creating-a-pull-request/

Done! I hope I’ve done well, I followed your instructions.

Cheers, Mattia

Yes, well done +1 :slight_smile:

Cheers, Martine

(remarks see PR)