log "bird.log" all;

attribute int foo;

protocol device {}

protocol static {
  ipv6 {
    import filter {
      preference = 111;
      foo = 666;
      accept;
    };
  };
  route 2001:db8:0::/48 unreachable { bgp_path.prepend(65432); bgp_path.prepend(4200000000); };
  route 2001:db8:1::/48 unreachable;
  route 2001:db8:2::/48 unreachable;
  route 2001:db8:3::/48 unreachable;
  route 2001:db8:4::/48 unreachable;
  route 2001:db8:5::/48 unreachable;
  route 2001:db8:6::/48 unreachable;
  route 2001:db8:7::/48 unreachable;
  route 2001:db8:8::/48 unreachable;
  route 2001:db8:9::/48 unreachable;
  route 2001:db8:a::/48 unreachable;
  route 2001:db8:b::/48 unreachable;
  route 2001:db8:c::/48 unreachable;
  route 2001:db8:d::/48 unreachable;
  route 2001:db8:e::/48 unreachable;
  route 2001:db8:f::/48 unreachable;
}

protocol static {
  ipv6 {
    import filter {
      preference = 222;
      foo = 666;
      bgp_med = 1;
      bgp_community = -empty-.add((65533,1)).add((65500,0xe));
      accept;
    };
  };
  route 2001:db8:1::/48 unreachable;
  route 2001:db8:3::/48 unreachable;
  route 2001:db8:5::/48 unreachable;
  route 2001:db8:7::/48 unreachable;
  route 2001:db8:9::/48 unreachable;
  route 2001:db8:b::/48 unreachable;
  route 2001:db8:d::/48 unreachable;
  route 2001:db8:f::/48 unreachable;
}

protocol static {
  ipv6 {
    import filter {
      preference = 222;
      foo = 666;
      bgp_med = 2;
      bgp_community = -empty-.add((65533,2)).add((65500,0xd));
      accept;
    };
  };
  route 2001:db8:2::/48 unreachable;
  route 2001:db8:3::/48 unreachable;
  route 2001:db8:6::/48 unreachable;
  route 2001:db8:7::/48 unreachable;
  route 2001:db8:a::/48 unreachable;
  route 2001:db8:b::/48 unreachable;
  route 2001:db8:e::/48 unreachable;
  route 2001:db8:f::/48 unreachable;
}

protocol static {
  ipv6 {
    import filter {
      preference = 222;
      foo = 666;
      bgp_med = 4;
      bgp_community = -empty-.add((65533,4)).add((65500,0xb));
      accept;
    };
  };
  route 2001:db8:4::/48 unreachable;
  route 2001:db8:5::/48 unreachable;
  route 2001:db8:6::/48 unreachable;
  route 2001:db8:7::/48 unreachable;
  route 2001:db8:c::/48 unreachable;
  route 2001:db8:d::/48 unreachable;
  route 2001:db8:e::/48 unreachable;
  route 2001:db8:f::/48 unreachable;
}

protocol static {
  ipv6 {
    import filter {
      preference = 222;
      foo = 666;
      bgp_med = 8;
      bgp_community = -empty-.add((65533,8)).add((65500,0x7));
      accept;
    };
  };
  route 2001:db8:8::/48 unreachable;
  route 2001:db8:9::/48 unreachable;
  route 2001:db8:a::/48 unreachable;
  route 2001:db8:b::/48 unreachable;
  route 2001:db8:c::/48 unreachable;
  route 2001:db8:d::/48 unreachable;
  route 2001:db8:e::/48 unreachable;
  route 2001:db8:f::/48 unreachable;
}

ipv6 table agr_result;

protocol aggregator {
  table master6;
  peer table agr_result;
  export all;
  aggregate on net,(defined(bgp_med)), (1 + 3 + 5 + 7), preference, dest;
  merge by {
    print "Merging all these: ", routes;
    bgp_med = 0;
    for route r in routes do {
      if ! defined(r.bgp_med) then { unset(bgp_med); accept; }

      print r, " bgp_med: ", r.bgp_med;
      bgp_med = bgp_med + r.bgp_med;
      bgp_community = bgp_community.add(r.bgp_community);
    }
    accept;
  };
}