sonic-net / SONiC

Landing page for Software for Open Networking in the Cloud (SONiC) - https://sonic-net.github.io/SONiC/
2.22k stars 1.12k forks source link

[question] How do packets arrive into the application containers? #1742

Open mrafatpanah opened 2 months ago

mrafatpanah commented 2 months ago

Hello. I'm new to using SONiC. I read many documents, such as Architecture, Configuration, Design specs, etc but I don't clearly understand how a packet arrives in application containers such as BGP or LDP. What happens when a packet enters an interface until it leaves the switch? I don't understand how SDK and kernel interact. For example, when a new route arrives in one of the interfaces how will it convert to a kernel netlink message?

nazariig commented 1 month ago

Hi, @mrafatpanah

Regarding your questions:

  1. I don't clearly understand how a packet arrives in application containers such as BGP or LDP

By default docker container provides an isolation of network namespace from the host, so it can't be easily accessed. In SONiC networking-wise containers (bgp, lldp, etc.) share their own namespace with the host, so all interfaces are accessible from within. With this feature, you can operate netdevs in the same why as you would be on the host

admin@sonic:~$ docker inspect bgp | jq .[].HostConfig.NetworkMode
"host"
  1. What happens when a packet enters an interface until it leaves the switch?

The packet is being processed by IP stack in kernel until the forwarding decision is taken.

Usually the flow is:

  1. Packet is received at the physical port
  2. Packet is trapped to the CPU
  3. Packet is placed to the relevant netdev in kernel
  4. Packet is processed by IP stack
  5. Forwarding decision is taken by kernel (e.g., answer to ping request)
  6. Packet is sent over the netdev
  7. Packet is sent out from the physical port

For packets not intended for control plane, the forwarding decision is done exclusively by dataplane - packet is processed only by ASIC

Note: netdevs are created in kernel by SAI/SDK and represent the relevant physical interfaces of the switch

  1. When a new route arrives in one of the interfaces how will it convert to a kernel netlink message?

Usually the flow is:

  1. Route messages are delivered over BGP protocol to FRR routing stack (bgpd, zebra, etc.)
  2. FRR generates netlink message - RTM_NEWROUTE
  3. fpmsyncd listens to netlink messages and once received, generates an event for routeorch
  4. routeorch programs routes via sairedis to syncd
  5. syncd programs routes via SAI/SDK to HW
nazariig commented 1 month ago

@mrafatpanah please ask these kind of questions using sonic-buildimage