So through the lessons that we just covered, we saw how we can implement a virtual network function on commodity hardware using DPDK, exploiting all of the facilities that are there in commodity hardware. When I say commodity hardware it is also the processor, the multi-core processor as well as the NIC and the capabilities. All of that is being taken advantage of by libraries such as DPDK that can run in user space, and therefore network function implementor, the job of the developer is significantly made easier. So what we're gonna discuss is how to implement the multi-threaded load balancer and we're gonna use that run-to-completion model. And each thread is performing identical processing and there're dedicated receive queue and transmit queue for each core. So with this particular setup, in order to have a scalable implementation of the load balancer on a multi-core CPU using DPDK library, all that we need to do is use all of the facilities that are there in DPDK libraries that we talked about for dealing with multi-core. Incoming packet is directed to a particular ring buffer because of the receive side scaling and and the load balancer that is running on a particular core is only looking at this ring buffer. And it is using the table that is associated with it the connection tables associated with it to to see how to do appropriate directing of the incoming packet to the instance that has to deal with that. So, each thread that is running on a core, the load balancer thread that is running on a core is doing exactly the same thing. What it is doing is getting a packet that is coming from a NIC. The NIC DMA's it into the ring buffer and once it comes into the ring buffer. This is the actual memory buffers interpreted as being the mean and this is a descriptor ring buffer that is holding details of packets that have come in and you can read the packet data for new descriptors. And once you read the packet, then you can extract the header information and once you extract the header information, the processes as we described at the beginning of the lecture namely using the 5-tuple to look up this table and find out if there is a match. If there isn't a match, you select the back end instance to add to the table. If there is a match, then you choose the instance that has already been previous trend for this particular 5-tuple and write in the the output packet. And once you write the output packet, you also put it out on the send ring, the transmit ring so that the DMA engine on the NIC can take this and send it out on the wire, right. So that's exactly what we wanted to do and and what we have done is the logic that the developer has to write is only the the thing that is related to extracting the connection information and looking at the connection info table and choosing the appropriate instance. All of this stuff that I'm showing you here with respect to the ring buffers and so on, that's the magic that is being handled by DPDK in concert with the technology enablers that are there in the processor architecture as well as NIC.