]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Merge branch 'mq-aggregator-for-v3' into thread-next
authorMaria Matejka <mq@ucw.cz>
Thu, 9 Nov 2023 10:04:57 +0000 (11:04 +0100)
committerMaria Matejka <mq@ucw.cz>
Thu, 9 Nov 2023 10:04:57 +0000 (11:04 +0100)
1  2 
nest/config.Y
nest/mpls.Y
nest/mpls.c
nest/mpls.h

diff --cc nest/config.Y
index f212e7113dcb3e407bb6278cf26f2a4b2067ffdf,6869137bac493c0891ac00c9dfeb5a8750141bae..b3831f1d83a9cbc4fece9b3e6264986dc48cc6a8
@@@ -173,10 -135,10 +173,10 @@@ CF_KEYWORDS(IPV4, IPV4_MC, IPV4_MPLS, I
  CF_ENUM(T_ENUM_RTS, RTS_, STATIC, INHERIT, DEVICE, STATIC_DEVICE, REDIRECT,
        RIP, OSPF, OSPF_IA, OSPF_EXT1, OSPF_EXT2, BGP, PIPE, BABEL)
  CF_ENUM(T_ENUM_SCOPE, SCOPE_, HOST, LINK, SITE, ORGANIZATION, UNIVERSE, UNDEFINED)
 -CF_ENUM(T_ENUM_RTD, RTD_, UNICAST, BLACKHOLE, UNREACHABLE, PROHIBIT)
 +CF_ENUM(T_ENUM_RTD, RTD_, BLACKHOLE, UNREACHABLE, PROHIBIT)
  CF_ENUM(T_ENUM_ROA, ROA_, UNKNOWN, VALID, INVALID)
  CF_ENUM_PX(T_ENUM_AF, AF_, AFI_, IPV4, IPV6)
- CF_ENUM(T_ENUM_MPLS_POLICY, MPLS_POLICY_, NONE, STATIC, PREFIX, AGGREGATE)
+ CF_ENUM(T_ENUM_MPLS_POLICY, MPLS_POLICY_, NONE, STATIC, PREFIX, AGGREGATE, VRF)
  
  %type <i32> idval
  %type <f> imexport
diff --cc nest/mpls.Y
Simple merge
diff --cc nest/mpls.c
index 96bafcb3f6a49358495645439b742ff55ee74b4a,ab540a6c61dd7b4710e045ab7c2c578f0afa34a2..269b4df7ee49c5368a1d36fda959c00516938c81
@@@ -765,10 -791,15 +789,15 @@@ mpls_free_fec(struct mpls_fec_map *m, s
      break;
  
    case MPLS_POLICY_AGGREGATE:
 -    rta_free(fec->rta);
 -    HASH_REMOVE2(m->rta_hash, RTA, m->pool, fec);
 +    ea_free(fec->rta->l);
 +    HASH_REMOVE2(m->attrs_hash, RTA, m->pool, fec);
      break;
  
+   case MPLS_POLICY_VRF:
+     ASSERT(m->vrf_fec == fec);
+     m->vrf_fec = NULL;
+     break;
    default:
      bug("Unknown fec type");
    }
@@@ -886,10 -895,47 +915,21 @@@ mpls_withdraw_fec(struct mpls_fec_map *
  }
  
  static void
 -mpls_apply_fec(rte *r, struct mpls_fec *fec, linpool *lp)
 +mpls_apply_fec(rte *r, struct mpls_fec *fec)
  {
 -  struct ea_list *ea = lp_allocz(lp, sizeof(struct ea_list) + 2 * sizeof(eattr));
 -
 -  rta *old_attrs = r->attrs;
 -
 -  if (rta_is_cached(old_attrs))
 -    r->attrs = rta_do_cow(r->attrs, lp);
 -
 -  *ea = (struct ea_list) {
 -    .next = r->attrs->eattrs,
 -    .flags = EALF_SORTED,
 -    .count = 2,
 -  };
 -
 -  ea->attrs[0] = (struct eattr) {
 -    .id = EA_MPLS_LABEL,
 -    .type = EAF_TYPE_INT,
 -    .u.data = fec->label,
 -  };
 -
 -  ea->attrs[1] = (struct eattr) {
 -    .id = EA_MPLS_POLICY,
 -    .type = EAF_TYPE_INT,
 -    .u.data = fec->policy,
 -  };
 -
 -  r->attrs->eattrs = ea;
 +  ea_set_attr_u32(&r->attrs, &ea_gen_mpls_label, 0, fec->label);
 +  ea_set_attr_u32(&r->attrs, &ea_gen_mpls_policy, 0, fec->policy);
+   if (fec->policy == MPLS_POLICY_VRF)
+   {
 -    r->attrs->hostentry = NULL;
 -    r->attrs->dest = RTD_UNICAST;
 -    r->attrs->nh = (struct nexthop) { .iface = fec->iface };
 -  }
++    ea_unset_attr(&r->attrs, 0, &ea_gen_hostentry);
 -  if (rta_is_cached(old_attrs))
 -  {
 -    r->attrs = rta_lookup(r->attrs);
 -    rta_free(old_attrs);
++    struct nexthop_adata nhad = {
++      .nh.iface = fec->iface,
++      .ad.length = sizeof nhad - sizeof nhad.ad,
++    };
++    ea_set_attr_data(&r->attrs, &ea_gen_nexthop, 0, nhad.ad.data, nhad.ad.length);
+   }
  }
  
  
@@@ -920,10 -968,18 +960,17 @@@ mpls_handle_rte(struct mpls_fec_map *m
      mpls_damage_fec(m, fec);
      break;
  
 -  case MPLS_POLICY_AGGREGATE:;
 -    uint class = ea_get_int(r->attrs->eattrs, EA_MPLS_CLASS, 0);
 -    fec = mpls_get_fec_by_rta(m, r->attrs, class);
 +  case MPLS_POLICY_AGGREGATE:
 +    fec = mpls_get_fec_by_destination(m, r->attrs);
      break;
  
+   case MPLS_POLICY_VRF:
+     if (!m->vrf_iface)
+       return;
+     fec = mpls_get_fec_for_vrf(m);
+     break;
    default:
      log(L_WARN "Route %N has invalid MPLS policy %u", n, policy);
      return;
diff --cc nest/mpls.h
index 2d188d02f838eaf2083b7220bd0fd38ac32394c3,4b071ad8bff14ad885a5c7af394202a24673f1a9..57978c990557cd22607d23dc2337efeab27e4e18
@@@ -133,7 -135,8 +134,8 @@@ struct mpls_fec 
    struct mpls_fec *next_k;            /* Next in mpls_fec.net_hash/rta_hash */
    struct mpls_fec *next_l;            /* Next in mpls_fec.label_hash */
    union {                             /* Primary key */
 -    struct rta *rta;
 +    struct ea_storage *rta;
+     struct iface *iface;
      net_addr net[0];
    };
  };
@@@ -142,14 -145,17 +144,16 @@@ struct mpls_fec_map 
    pool *pool;                         /* Pool for FEC map */
    slab *slabs[4];                     /* Slabs for FEC allocation */
    HASH(struct mpls_fec) net_hash;     /* Hash table for MPLS_POLICY_PREFIX FECs */
 -  HASH(struct mpls_fec) rta_hash;     /* Hash table for MPLS_POLICY_AGGREGATE FECs */
 +  HASH(struct mpls_fec) attrs_hash;   /* Hash table for MPLS_POLICY_AGGREGATE FECs */
    HASH(struct mpls_fec) label_hash;   /* Hash table for FEC lookup by label */
+   struct mpls_fec *vrf_fec;           /* Single FEC for MPLS_POLICY_VRF */
  
    struct channel *channel;            /* MPLS channel for FEC announcement */
    struct mpls_domain *domain;         /* MPLS domain, keeping reference */
    struct mpls_handle *handle;         /* Handle for allocation of labels */
+   struct iface *vrf_iface;
  
    u8 mpls_rts;                                /* Source value used for MPLS routes (RTS_*) */
 -  u8 mpls_scope;                      /* Scope  value used for MPLS routes (SCOPE_*) */
  };