上一篇介绍了netlink报文的接收过程,其中用到了sock对象、event对象等、channel对象,本篇分析这些对象是何时构建的。 构建入口是dpif_netlink_port_add函数。
1、dpif_netlink_port_add函数
static int
dpif_netlink_port_add(struct dpif *dpif_, struct netdev *netdev,
odp_port_t *port_nop)
{
struct dpif_netlink *dpif = dpif_netlink_cast(dpif_);
int error;
fat_rwlock_wrlock(&dpif->upcall_lock);
error = dpif_netlink_port_add__(dpif, netdev, port_nop); //添加端口
fat_rwlock_unlock(&dpif->upcall_lock);
return error;
}
2、dpif_netlink_port_add__函数
static int
dpif_netlink_port_add__(struct dpif_netlink *dpif, struct netdev *netdev,
odp_port_t *port_nop)
OVS_REQ_WRLOCK(dpif->upcall_lock)
{
const struct netdev_tunnel_config *tnl_cfg;
char namebuf[NETDEV_VPORT_NAME_BUFSIZE];
const char *name = netdev_vport_get_dpif_port(netdev,
namebuf, sizeof namebuf);
const char *type = netdev_get_type(netdev);
struct dpif_netlink_vport request, reply;
struct ofpbuf *buf;
uint64_t options_stub[64 / 8];
struct ofpbuf options;
struct nl_sock **socksp = NULL;
uint32_t *upcall_pids;
int error = 0;
if (dpif->handlers) {
socksp = vport_create_socksp(dpif, &error); //创建nl_sock对象
if (!socksp) {