static int xfrm_state_filter_match(struct xfrm_usersa_info *xsinfo) { if (!filter.use) return 1; if (filter.id_src_mask) if (xfrm_addr_match(&xsinfo->saddr, &filter.xsinfo.saddr, filter.id_src_mask)) return 0; if (filter.id_dst_mask) if (xfrm_addr_match(&xsinfo->id.daddr, &filter.xsinfo.id.daddr, filter.id_dst_mask)) return 0; if ((xsinfo->id.proto^filter.xsinfo.id.proto)&filter.id_proto_mask) return 0; if ((xsinfo->id.spi^filter.xsinfo.id.spi)&filter.id_spi_mask) return 0; if ((xsinfo->mode^filter.xsinfo.mode)&filter.mode_mask) return 0; if ((xsinfo->reqid^filter.xsinfo.reqid)&filter.reqid_mask) return 0; if (filter.state_flags_mask) if ((xsinfo->flags & filter.xsinfo.flags) == 0) return 0; return 1; }
static int xfrm_policy_filter_match(struct xfrm_userpolicy_info *xpinfo, __u8 ptype) { if (!filter.use) return 1; if ((xpinfo->dir^filter.xpinfo.dir)&filter.dir_mask) return 0; if ((ptype^filter.ptype)&filter.ptype_mask) return 0; if (filter.sel_src_mask) { if (xfrm_addr_match(&xpinfo->sel.saddr, &filter.xpinfo.sel.saddr, filter.sel_src_mask)) return 0; } if (filter.sel_dst_mask) { if (xfrm_addr_match(&xpinfo->sel.daddr, &filter.xpinfo.sel.daddr, filter.sel_dst_mask)) return 0; } if ((xpinfo->sel.ifindex^filter.xpinfo.sel.ifindex)&filter.sel_dev_mask) return 0; if ((xpinfo->sel.proto^filter.xpinfo.sel.proto)&filter.upspec_proto_mask) return 0; if (filter.upspec_sport_mask) { if ((xpinfo->sel.sport^filter.xpinfo.sel.sport)&filter.upspec_sport_mask) return 0; } if (filter.upspec_dport_mask) { if ((xpinfo->sel.dport^filter.xpinfo.sel.dport)&filter.upspec_dport_mask) return 0; } if ((xpinfo->index^filter.xpinfo.index)&filter.index_mask) return 0; if ((xpinfo->action^filter.xpinfo.action)&filter.action_mask) return 0; if ((xpinfo->priority^filter.xpinfo.priority)&filter.priority_mask) return 0; if (filter.policy_flags_mask) if ((xpinfo->flags & filter.xpinfo.flags) == 0) return 0; return 1; }