此文章解析主函数中没有详细解读的 add_ports 函数。
主函数引用调用如下:
1 | if (port_list) { |
在函数开始时,将 port_list 里的端口打开。
add_port
strtok_r 函数相当于是 linux 平台下的 strtok 函数,主要用于分隔结构体的各成员。
1 | static void |
函数首先对 port_list 结构体做处理,赋值到参数 port 中,port 作为具体的端口名,调用 dp_add_port 函数。
dp_add_port
此函数中的 port 与上一层函数的 port 不同,add_port 中的 port 是一个 char 型指针变量,指向端口名。这一函数中的 port 是 sw_port 结构体的指针,具体定义如下:
1 | struct sw_port { |
sw_port 结构体中包含具体的网络端口 netdev ,所以函数判断 port 结构体中的 netdev 是否为空,从而判断端口是否打开。没有打开则调用 new_port 函数打开端口。
1 | int |
new_port
该函数的主要功能包括:
- 调用 netdev_open 函数打开网络设备,成功则返回0。具体的网络设备处理由 do_open_netdev 执行。
- 设置网络设备的mac地址
- 设置flags
- 设置ip地址
- 添加信息到 port 结构体中
- 调用 send_port_status 将端口设置成功的消息发送到与controller之间的安全信道
函数代码如下:
1 | static int |
可以重点看一下 do_open_netdev 和 send_port_status 函数。
do_open_netdev
此函数是以 netdev_open 函数作为入口被调用的,可以简单看一下 netdev_open 函数。
netdev_open
1 | /* Opens the network device named 'name' (e.g. "eth0") and returns zero if |
总体比较简单,需要特地说明的是输入参数 ethertype 。该参数在 netdev_open 中的输入是 NETDEV_ETH_TYPE_ANY 。在 netdev.h 中有具体定义:
1 | enum netdev_pseudo_ethertype { |
回到 do_open_netdev 函数,该函数代码如下,不过多解释。
1 | static int |