Project

General

Profile

Actions

Bug #1720

closed

Face closing in case of ICMP unreachable error message

Added by A K M Mahmudul Hoque almost 10 years ago. Updated almost 10 years ago.

Status:
Rejected
Priority:
High
Assignee:
Category:
Faces
Target version:
-
Start date:
07/01/2014
Due date:
% Done:

0%

Estimated time:

Description

Case Scenario:

NLSR creates faces to neighbor explicitly like nfdc create from the code. NLSR sends periodical "INFO" interest messages to neighbors even is neighbor is down ( can be just NLSR and/or NFD). What we observed is that if we take down NFD and NLSR on one machine, face pointing to this machine disappeared from its neighbor's nfd. This is not allowing NLSR to converge when NFD and NLSR is brought back live again, which is not desired behavior of NLSR.

How to reproduce the bug:

  1. Take two machines (A and B)
  2. Run NFD in both machines
  3. Run NLSR in both machines
    • this will create few faces pointing to each other
    • faces include (/ndn/NLSR/LSA, /ndn/NLSR/sync, /ndn/broadcast/KEYS, ...)
  4. Take down NLSR and NFD in one machine (A )
  5. Check nfd-status in machine B
    • Faces pointing to machine A disappear

-- For more information on running and configuring NLSR please communicate to ahoque1@memphis.edu


Related issues 1 (0 open1 closed)

Related to NLSR - Task #1723: NLSR should recreate faces to neighbors, when they are destroyed for any reasonClosedA K M Mahmudul Hoque

Actions
Actions #1

Updated by Alex Afanasyev almost 10 years ago

  • Category set to Faces
  • Assignee set to Junxiao Shi
  • Target version set to v0.2
  • Estimated time set to 1.00 h
Actions #2

Updated by Alex Afanasyev almost 10 years ago

While the issue was discovered with NLSR, NLSR is not way needed to reproduce the problem. One machine is enough:

  1. Start NFD and nrd
  2. Register some route through a UDP face toward some existing machine on the network that doesn't run NFD and doesn't firewall ICMP. In my case I did:

    nfdc register /example/prefix udp://131.179.196.44
    

    This results in the following nfd-status output

    Faces:
      ...
      faceid=10 remote=udp4://131.179.196.44:6363 local=udp4://131.179.196.220:6363 counters={in={0i 0d} out={0i 0d}}
      ...
    
    FIB:
      ...
      /example/prefix nexthops={faceid=10 (cost=0)}
      ...
    
  3. Run ndn-tlv-peek for /example/prefix data

    ndn-tlv-peek /example/prefix/some-data
    

Expectation: no data retrieved and no changes to nfd-status output

Actual: no data retrieved, but UDP face is destoyed

The following is excerpt from nfd log related to the efent:

...
1404237094.527198 WARNING: [UdpFace] [id:10,endpoint:131.179.196.220:6363] Receive operation failed: Connection refused
1404237094.527287 DEBUG: [UdpFace] closeSocket  131.179.196.220:6363
1404237094.527345 DEBUG: [UdpChannel] afterFaceFailed: 131.179.196.44:6363
...
1404237094.530164 INFO: [FaceTable] Removed face id=10 remote=udp4://131.179.196.44:6363 local=udp4://131.179.196.220:6363
Actions #3

Updated by Alex Afanasyev almost 10 years ago

Just to add more details. Here tcpdump for the event:

10:51:34.526552 ARP, Request who-has 131.179.196.44 (00:30:48:da:16:c4) tell 131.179.196.220, length 28
10:51:34.526807 ARP, Reply 131.179.196.44 is-at 00:30:48:da:16:c4, length 46
10:51:34.526825 IP 131.179.196.220.6363 > 131.179.196.44.6363: UDP, length 38
10:51:34.527043 IP 131.179.196.44 > 131.179.196.220: ICMP 131.179.196.44 udp port 6363 unreachable, length 36
Actions #4

Updated by Junxiao Shi almost 10 years ago

I'm not sure whether ignoring ICMP unreachable is the right thing to do.

Tunnel Authentication protocol #1285 requires UdpFace to periodically send out a refresh message, and a UdpFace is destroyed if refresh message is unanswered after several attempts.
This is similar to a broken TCP connection.

@Beichuan should clarify the intention of Tunnel Authentication regarding to this problem.

Actions #5

Updated by Alex Afanasyev almost 10 years ago

An alternative to ignoring ICMP (and which would be compatible with TCP faces) is for NLSR to subscribe to face status notifications. When it detects that created faces are destroyed, then it should re-create them (re-register prefix for towards the face).

Technically, face creation/re-creation is not exactly NLSR's job, but NLSR can do this anyways. At least for now.

Actions #6

Updated by Lan Wang almost 10 years ago

You're right, face creation/recreation is not NLSR's job. This can be only a temporary solution. I don't understand the motivation for closing the face though (even if there's an error). It seems to only add overhead (for recreating the face).

Actions #7

Updated by Alex Afanasyev almost 10 years ago

I don't think it is logically correct to allow half-working face. That is, when one node on the network think it has face to another, while another node has no idea why it is receiving packets. At least such logic could apply to unicast UDP/TCP faces, which are kind of tunnels, which technically should have some sort of authentication in the future.

A different story is with multicast UDP/Ethernet Faces. They are not tunnels, there cannot have any authentication, and I don't think there is a similar problem with them anyways.

Actions #8

Updated by Alex Afanasyev almost 10 years ago

  • Related to Task #1723: NLSR should recreate faces to neighbors, when they are destroyed for any reason added
Actions #9

Updated by John DeHart almost 10 years ago

Perhaps one thing to consider is that the faces we are talking about for NLSR
can be considered permanently configured faces. We define these faces because
we are defining a network architecture. They aren't coming up because some
random node has appeared that wants to connect to us. If they go down, we
expect them to come back and we hope they come back very soon.

Would we rather have NFD understand that or have NLSR get the notification
that they have gone away and recreate them, then if the other end isn't
back yet, continue to cycle through the process of notification and recreation?

Actions #10

Updated by Alex Afanasyev almost 10 years ago

Even though tcp/dup faces are "permanently" configured in NLSR-sense, I see them as something like VPN connection (rather than GRE tunnels).

Also, there is another advantage of making NLSR (on in future some other helper process) to take care of managing faces to neighbors. This provides an opportunity to use any types of Faces, not just "permanent" UDP Faces. I don't necessarily see when it would be useful, but just in case.

Actions #11

Updated by Lan Wang almost 10 years ago

The faces we are talking about here are really just links. They should be there, even if the status is down. Similar to what you find from ifconfig (the link is there, but the status can be down). I don't see why "another node has no idea why it is receiving packets" is a problem. It just delivers the packet to the application which knows how to handle it.

Actions #12

Updated by Junxiao Shi almost 10 years ago

UDP tunnels are not regular links.
If NLSR wants to use links, configure GRE tunnels and communicate over Ethernet multicast.
Remember to set MTU=9000 to avoid packet loss.

UDP tunnels are subject to Tunnel Authentication protocol #1285.
I'm waiting for Beichuan to answer the question in note-4, before I can make any change to UDP tunnels.

Actions #13

Updated by Lan Wang almost 10 years ago

I don't see any conflict between the authentication protocol and what I said. What I meant is that the face should not be automatically closed if there is a problem. The face should have a status to indicate whether it is currently working or not. But the faceid should be there until the creator explicitly disconnects it. This doesn't conflict with the protocol.

Actions #14

Updated by Davide Pesavento almost 10 years ago

I wanted to raise this issue later, when starting to work on the vehicular faces, but since the discussion here seems to have become bigger and deeper, and some requirements are similar, I'll just say it here.
The basic assumption is that, in a vehicular network, connectivity is inherently intermittent, and we cannot destroy and recreate faces every time something doesn't work because of a transient network issue.

The linux networking stack has the concept of "up" and "down" for interfaces. When an interface is up it doesn't necessarily mean the connectivity works, but applications can still (try to) use it. In particular, interfaces can be up even if the underlying link is not present/working (whatever that means for the particular link layer).

Connections on the other hand can break and should be re-established by the interested party. However, while it's straightforward for TCP faces, the concept of connection doesn't have a clear meaning when applied to UDP faces. One could argue that the connection never breaks, since there's no connection in the first place.

So the question is: are NFD faces more akin to linux network interfaces or to TCP/IP connections?

As for a possible solution, would it make sense to have a "persistent" kind of UDP face that:

  • is explicitly created by some process P
  • does not react to send failures by committing suicide
  • can be explicitly deleted by the same process P
  • is automatically closed when P exits (for any reason)

?

Actions #15

Updated by Junxiao Shi almost 10 years ago

TCP tunnels and UDP tunnels are similar to a VPN tunnel.
VPN solutions (eg. PPTP and OpenVPN) close the tunnel if there's a failure.
Therefore, TcpFace and UdpFace are connections, and they are subject to Tunnel Authentication protocol.

Multicast faces (Ethernet and UDP multicast) are similar to interface.

Actions #16

Updated by Davide Pesavento almost 10 years ago

Junxiao Shi wrote:

TCP tunnels and UDP tunnels are similar to a VPN tunnel.
VPN solutions (eg. PPTP and OpenVPN) close the tunnel if there's a failure.
Therefore, TcpFace and UdpFace are connections, and they are subject Tunnel Authentication protocol.

Well I guess we're going to have to implement yet another type of face for our vehicular needs then.

Actions #17

Updated by Junxiao Shi almost 10 years ago

  • Target version deleted (v0.2)
  • Estimated time deleted (1.00 h)

20140702 conference call decides that we should use #1723 as a short-term solution.

  • It's not ideal for each routing protocol to manage their faces.
  • We don't have enough knowledge to design a complete solution. We need better understanding what's the concept of face in all routing protocols. eg. BGP and OSPF don't share the same set of interfaces
  • Our intention is not making UDP tunnels like physical links
Actions #18

Updated by Alex Afanasyev almost 10 years ago

Should this issue be rejected or we still want to do something here in the future?

Actions #19

Updated by Junxiao Shi almost 10 years ago

  • Status changed from New to Rejected

It is correct behavior for a UDP face to close in response to an error.

Use a "physical" face type (EthernetFace) for faces that shouldn't be closed upon failure and can recover.

Actions

Also available in: Atom PDF