端口镜像是交换机的标准功能之一,针对某个端口的报文拷贝到除真实目的之外的另外一个目的地(output),这一篇我们先分析配置mirror之后,如何生成流表,在什么阶段生成流表。
1、xlate_actions函数
mirror_ingress_packet(&ctx); //生成满足入端口的流表生成,即进入该端口的报文会被镜像到其他目的地。
do_xlate_actions(ofpacts, ofpacts_len, &ctx); //解析成精确流表。 针对源端口的mirror,先执行mirror动作,再执行其他操作。
if (ctx.error) {
goto exit;
}
mirror_ingress_packet函数
static void
mirror_ingress_packet(struct xlate_ctx *ctx)
{
if (mbridge_has_mirrors(ctx->xbridge->mbridge)) {
bool warn = ctx->xin->packet != NULL;
struct xbundle *xbundle = lookup_input_bundle(
ctx->xbridge, ctx->xin->flow.in_port.ofp_port, warn, NULL);
if (xbundle) {
mirror_packet(ctx, xbundle, //生成mirror的精确流表
xbundle_mirror_src(ctx->xbridge, xbundle));
}
}
}
mirror_packet函数
static void
mirror_packet(struct xlate_ctx *ctx, struct xbundle *xbundle,
mirror_mask_t mirrors)
{
/* Figure out what VLAN the packet is in (because mirrors can select
* packets on basis of VLAN). */
bool warn = ctx->xin->packet != NULL;
uint16_t vid = vlan_tci_to_vid(ctx->xin->flow.vlan_tci);
if (!input_vid_is_valid(vid, xbundle, warn)) {
return;
}
uint16_t vlan = input_vid_to_vlan(xbundle, vid);
const st