Lines Matching refs:rule6

355 static int fib6_nl2rule_dscp(const struct nlattr *nla, struct fib6_rule *rule6,  in fib6_nl2rule_dscp()  argument
358 if (rule6->dscp) { in fib6_nl2rule_dscp()
363 rule6->dscp = inet_dsfield_to_dscp(nla_get_u8(nla) << 2); in fib6_nl2rule_dscp()
364 rule6->dscp_mask = inet_dsfield_to_dscp(INET_DSCP_MASK); in fib6_nl2rule_dscp()
365 rule6->dscp_full = true; in fib6_nl2rule_dscp()
371 struct fib6_rule *rule6, in fib6_nl2rule_dscp_mask() argument
376 if (!rule6->dscp_full) { in fib6_nl2rule_dscp_mask()
383 if (rule6->dscp & ~dscp_mask) { in fib6_nl2rule_dscp_mask()
388 rule6->dscp_mask = dscp_mask; in fib6_nl2rule_dscp_mask()
393 static int fib6_nl2rule_flowlabel(struct nlattr **tb, struct fib6_rule *rule6, in fib6_nl2rule_flowlabel() argument
416 rule6->flowlabel = flowlabel; in fib6_nl2rule_flowlabel()
417 rule6->flowlabel_mask = flowlabel_mask; in fib6_nl2rule_flowlabel()
427 struct fib6_rule *rule6 = (struct fib6_rule *)rule; in fib6_rule_configure() local
436 rule6->dscp = inet_dsfield_to_dscp(frh->tos); in fib6_rule_configure()
437 rule6->dscp_mask = frh->tos ? inet_dsfield_to_dscp(INET_DSCP_MASK) : 0; in fib6_rule_configure()
439 if (tb[FRA_DSCP] && fib6_nl2rule_dscp(tb[FRA_DSCP], rule6, extack) < 0) in fib6_rule_configure()
443 fib6_nl2rule_dscp_mask(tb[FRA_DSCP_MASK], rule6, extack) < 0) in fib6_rule_configure()
447 fib6_nl2rule_flowlabel(tb, rule6, extack) < 0) in fib6_rule_configure()
463 rule6->src.addr = nla_get_in6_addr(tb[FRA_SRC]); in fib6_rule_configure()
466 rule6->dst.addr = nla_get_in6_addr(tb[FRA_DST]); in fib6_rule_configure()
468 rule6->src.plen = frh->src_len; in fib6_rule_configure()
469 rule6->dst.plen = frh->dst_len; in fib6_rule_configure()
494 struct fib6_rule *rule6 = (struct fib6_rule *) rule; in fib6_rule_compare() local
496 if (frh->src_len && (rule6->src.plen != frh->src_len)) in fib6_rule_compare()
499 if (frh->dst_len && (rule6->dst.plen != frh->dst_len)) in fib6_rule_compare()
503 (rule6->dscp_full || in fib6_rule_compare()
504 inet_dscp_to_dsfield(rule6->dscp) != frh->tos)) in fib6_rule_compare()
511 if (!rule6->dscp_full || rule6->dscp != dscp) in fib6_rule_compare()
519 if (!rule6->dscp_full || rule6->dscp_mask != dscp_mask) in fib6_rule_compare()
524 nla_get_be32(tb[FRA_FLOWLABEL]) != rule6->flowlabel) in fib6_rule_compare()
528 nla_get_be32(tb[FRA_FLOWLABEL_MASK]) != rule6->flowlabel_mask) in fib6_rule_compare()
532 nla_memcmp(tb[FRA_SRC], &rule6->src.addr, sizeof(struct in6_addr))) in fib6_rule_compare()
536 nla_memcmp(tb[FRA_DST], &rule6->dst.addr, sizeof(struct in6_addr))) in fib6_rule_compare()
545 struct fib6_rule *rule6 = (struct fib6_rule *) rule; in fib6_rule_fill() local
547 frh->dst_len = rule6->dst.plen; in fib6_rule_fill()
548 frh->src_len = rule6->src.plen; in fib6_rule_fill()
550 if (rule6->dscp_full) { in fib6_rule_fill()
553 inet_dscp_to_dsfield(rule6->dscp) >> 2) || in fib6_rule_fill()
555 inet_dscp_to_dsfield(rule6->dscp_mask) >> 2)) in fib6_rule_fill()
558 frh->tos = inet_dscp_to_dsfield(rule6->dscp); in fib6_rule_fill()
561 if (rule6->flowlabel_mask && in fib6_rule_fill()
562 (nla_put_be32(skb, FRA_FLOWLABEL, rule6->flowlabel) || in fib6_rule_fill()
563 nla_put_be32(skb, FRA_FLOWLABEL_MASK, rule6->flowlabel_mask))) in fib6_rule_fill()
566 if ((rule6->dst.plen && in fib6_rule_fill()
567 nla_put_in6_addr(skb, FRA_DST, &rule6->dst.addr)) || in fib6_rule_fill()
568 (rule6->src.plen && in fib6_rule_fill()
569 nla_put_in6_addr(skb, FRA_SRC, &rule6->src.addr))) in fib6_rule_fill()