在我的udpecho中,并未指定CPU核,gdb时发现有thread 6~11均在运行 default_event_dispatcher。该线程由用户编写,如下:
该线程为数据平面线程,会分别绑定不同的CPU核。线程函数为default_event_dispatcher,顾名思义:默认的收包分发处理线程(其实还有发包)。该函数不停的收包,然后调用ofp_packet_input函数,再调用pkt_func,pkt_func即是上图中的ofp_eth_vlan_processing。
ofp_eth_vlan_processing中对于不同的协议(IP/IPV4/ARP)处理如下:
数据包会根据协议内容不同进行不同的处理。
default_event_dispatcher在收包处理完后,每次循环还会调用ofp_send_pending_pkt,将未发出去的包进行发送。上层协议比如IP层在发送数据时,会调用send_pkt_out,其实是把数据包放在一个数组,此时,如果数组中数据包数量达到一个阈值(tx_burst = global_param->pkt_tx_burst_size)会直接进行发送,否则不会发送。为了保证数据立即能发出去,因此,default_event_dispatcher线程会调用ofp_send_pending_pkt进行发包。