1. port status消息类型
注,本节为port status消息中一些字段会包含的类型,供参考 reason类型
enum ofp_port_reason {
OFPPR_ADD, /* The port was added. */
OFPPR_DELETE, /* The port was removed. */
OFPPR_MODIFY, /* Some attribute of the port has changed. */
#define OFPPR_BITS ((1u << OFPPR_ADD) | \
(1u << OFPPR_DELETE) | \
(1u << OFPPR_MODIFY))
OFPPR_N_REASONS /* Denotes number of reasons. */
};
port config类型
enum ofputil_port_config {
/* OpenFlow 1.0 and 1.1 share these values for these port config bits. */
OFPUTIL_PC_PORT_DOWN = 1 << 0, /* Port is administratively down. */
OFPUTIL_PC_NO_RECV = 1 << 2, /* Drop all packets received by port. */
OFPUTIL_PC_NO_FWD = 1 << 5, /* Drop packets forwarded to port. */
OFPUTIL_PC_NO_PACKET_IN = 1 << 6, /* No send packet-in msgs for port. */
/* OpenFlow 1.0 only. */
OFPUTIL_PC_NO_STP = 1 << 1, /* No 802.1D spanning tree for port. */
OFPUTIL_PC_NO_RECV_STP = 1 << 3, /* Drop received 802.1D STP packets. */
OFPUTIL_PC_NO_FLOOD = 1 << 4, /* Do not include port when flooding. */
/* There are no OpenFlow 1.1-only bits. */
};
port state类型
enum ofputil_port_state {
/* OpenFlow 1.0 and 1.1 share this values for these port state bits. */
OFPUTIL_PS_LINK_DOWN = 1 << 0, /* No physical link present. */
/* OpenFlow 1.1 only. */
OFPUTIL_PS_BLOCKED = 1 << 1, /* Port is blocked */
OFPUTIL_PS_LIVE = 1 << 2, /* Live for Fast Failover Group. */
/* OpenFlow 1.0 only. */
OFPUTIL_PS_STP_LISTEN = 0 << 8, /* Not learning or relaying frames. */
OFPUTIL_PS_STP_LEARN = 1 << 8, /* Learning but not relaying frames. */
OFPUTIL_PS_STP_FORWARD = 2 << 8, /* Learning and relaying frames. */
OFPUTIL_PS_STP_BLOCK = 3 << 8, /* Not part of spanning tree. */
OFPUTIL_PS_STP_MASK = 3 << 8 /* Bit mask for OFPPS10_STP_* values. */
};
2. reason类型为OFPPR_ADD
注,本节为add类型消息的触发条件整理,前面的函数名是按代码流程归类的触发过程
ofport_install
- 创建bridge时,添加桥同名的internal类型port,config为OFPUTIL_PC_PORT_DOWN,state为OFPUTIL_PS_LINK_DOWN;dpdk模式的此时会有一些速率之类的链接信息。
- 修改bridge的type,会在上报add;内容同新建bridge时相同。(但不会上报del旧port)
- 修改bridge datapath类型。
- 新配置或修改interface类型,state为OFPUTIL_PS_LINK_DOWN。(注意,单独配置port时,不触发port status)
- 修改port名字(代码中的流程,本地配置无法构造)
- 创建bond类型的port时,会上报bond中首条interface名的add。state为OFPUTIL_PS_LINK_DOWN。后续配置该interface的type时,会触发一条del,然后以重新触发add。bond类型的port不会单独上报bond名的port status。
3. reason类型为OFPPR_DELETE
ofport_remove
- 删除已配置了interface type的port。
- 修改interface修改type,先上报此状态。之后由于配置新类型还会触发add。
- 修改bridge的type,会上报删除同名port。
- ovs轮询port状态,发现有datapath层面的port删除(代码中的流程,不清楚场景怎么构造)
- 注意,直接删除整个bridge时不单独上报port status。
4. reason类型为OFPPR_MODIFY
ofproto_port_set_state
- STP或RSTP协议触发的state状态变化,上报此状态。state主要是前缀为OFPUTIL_PS_STP的几种。
update_port
- vhostuserclient对应虚机start,上报此状态。state报为OFPUTIL_PS_LIVE。(虚机中shutdown对应虚拟网卡不影响本状态)
- vhostuserclient对应虚机destroy,触发上报两次modify。第一次state报为OFPUTIL_PS_STP_LISTEN,第二次报OFPUTIL_PS_STP_LISTEN。
- dpdk类型interface对应网卡网线接通时,上报此状态。state报OFPUTIL_PS_LIVE。(如果是配置后第一次接通则会先上报add,随后上报本条)
update_port_config
- 修改配置,旧port名存在(代码中流程,未找到配置构造方法)
- 创建bridge时,在发送add后会再触发一次modify,config为OFPUTIL_PC_PORT_DOWN,state为OFPUTIL_PS_LINK_DOWN,mac地址做了重新配置。
- 修改bridge的type时,处理同创建bridge一致。
- ofctl配置或控制器下发up down no_recv no_recv_stp no_flood no_forward no_packet_in等配置时,会触发配置修改上报,
- 删除bridge中最后一个有效port,触发一次modify,上报bridge同名port;config为OFPUTIL_PC_PORT_DOWN,status为OFPUTIL_PS_LINK_DOWN。