]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Merge commit 'e68363909cb9733c1bf55fff80a8b034e4111849' into thread-next
authorOndrej Zajicek <santiago@crfreenet.org>
Thu, 28 Mar 2024 18:16:44 +0000 (19:16 +0100)
committerOndrej Zajicek <santiago@crfreenet.org>
Thu, 28 Mar 2024 18:16:44 +0000 (19:16 +0100)
1  2 
doc/bird.sgml
sysdep/linux/netlink.Y
sysdep/linux/netlink.c

diff --cc doc/bird.sgml
Simple merge
index 7dece46b8ea81ed659a6dd019b89217027c6788d,60ddfa9622c8af725b1429dc0e62fbd6409205e9..8e1c1921a3794c1160717b54dac173f5baef297e
@@@ -10,13 -10,19 +10,17 @@@ CF_HD
  
  CF_DECLS
  
--CF_KEYWORDS(KERNEL, TABLE, METRIC, NETLINK, RX, BUFFER,
-           KRT_LOCK_MTU, KRT_LOCK_WINDOW, KRT_LOCK_RTT, KRT_LOCK_RTTVAR,
 -          KRT_PREFSRC, KRT_REALM, KRT_SCOPE, KRT_MTU, KRT_WINDOW,
 -          KRT_RTT, KRT_RTTVAR, KRT_SSTRESH, KRT_CWND, KRT_ADVMSS, KRT_REORDERING,
 -          KRT_HOPLIMIT, KRT_INITCWND, KRT_RTO_MIN, KRT_INITRWND, KRT_QUICKACK,
 -          KRT_CONGCTL, KRT_FASTOPEN_NO_COOKIE)
++CF_KEYWORDS(KERNEL, TABLE, METRIC, NETLINK, RX, BUFFER)
+ CF_KEYWORDS(KRT_LOCK_MTU, KRT_LOCK_WINDOW, KRT_LOCK_RTT, KRT_LOCK_RTTVAR,
            KRT_LOCK_SSTRESH, KRT_LOCK_CWND, KRT_LOCK_ADVMSS, KRT_LOCK_REORDERING,
-           KRT_LOCK_HOPLIMIT, KRT_LOCK_RTO_MIN, KRT_FEATURE_ECN, KRT_FEATURE_ALLFRAG)
+           KRT_LOCK_HOPLIMIT, KRT_LOCK_INITCWND, KRT_LOCK_RTO_MIN, KRT_LOCK_INITRWND,
+           KRT_LOCK_QUICKACK, KRT_LOCK_CONGCTL, KRT_LOCK_FASTOPEN_NO_COOKIE,
+           KRT_FEATURE_ECN, KRT_FEATURE_ALLFRAG)
  
 +%type <fab> attr_bit
 +
  CF_GRAMMAR
  
  kern_proto: kern_proto kern_sys_item ';' ;
@@@ -27,25 -33,48 +31,30 @@@ kern_sys_item
   | NETLINK RX BUFFER expr { THIS_KRT->sys.netlink_rx_buffer = $4; }
   ;
  
 -dynamic_attr: KRT_PREFSRC     { $$ = f_new_dynamic_attr(EAF_TYPE_IP_ADDRESS, T_IP, EA_KRT_PREFSRC); } ;
 -dynamic_attr: KRT_REALM       { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_KRT_REALM); } ;
 -dynamic_attr: KRT_SCOPE       { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_KRT_SCOPE); } ;
 -
 -dynamic_attr: KRT_MTU         { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_KRT_MTU); } ;
 -dynamic_attr: KRT_WINDOW      { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_KRT_WINDOW); } ;
 -dynamic_attr: KRT_RTT         { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_KRT_RTT); } ;
 -dynamic_attr: KRT_RTTVAR      { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_KRT_RTTVAR); } ;
 -dynamic_attr: KRT_SSTRESH     { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_KRT_SSTRESH); } ;
 -dynamic_attr: KRT_CWND                { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_KRT_CWND); } ;
 -dynamic_attr: KRT_ADVMSS      { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_KRT_ADVMSS); } ;
 -dynamic_attr: KRT_REORDERING  { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_KRT_REORDERING); } ;
 -dynamic_attr: KRT_HOPLIMIT    { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_KRT_HOPLIMIT); } ;
 -dynamic_attr: KRT_INITCWND    { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_KRT_INITCWND); } ;
 -dynamic_attr: KRT_RTO_MIN     { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_KRT_RTO_MIN); } ;
 -dynamic_attr: KRT_INITRWND    { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_KRT_INITRWND); } ;
 -dynamic_attr: KRT_QUICKACK    { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_KRT_QUICKACK); } ;
 -dynamic_attr: KRT_CONGCTL     { $$ = f_new_dynamic_attr(EAF_TYPE_STRING, T_STRING, EA_KRT_CONGCTL); } ;
 -dynamic_attr: KRT_FASTOPEN_NO_COOKIE { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_KRT_FASTOPEN_NO_COOKIE); } ;
 -
  /* Bits of EA_KRT_LOCK, based on RTAX_* constants */
--
- attr_bit: KRT_LOCK_MTU        { $$ = f_new_dynamic_attr_bit(2, "krt_lock"); } ;
 -dynamic_attr: KRT_LOCK_MTU    { $$ = f_new_dynamic_attr_bit(2, T_BOOL, EA_KRT_LOCK); } ;
 -dynamic_attr: KRT_LOCK_WINDOW { $$ = f_new_dynamic_attr_bit(3, T_BOOL, EA_KRT_LOCK); } ;
 -dynamic_attr: KRT_LOCK_RTT    { $$ = f_new_dynamic_attr_bit(4, T_BOOL, EA_KRT_LOCK); } ;
 -dynamic_attr: KRT_LOCK_RTTVAR { $$ = f_new_dynamic_attr_bit(5, T_BOOL, EA_KRT_LOCK); } ;
 -dynamic_attr: KRT_LOCK_SSTRESH        { $$ = f_new_dynamic_attr_bit(6, T_BOOL, EA_KRT_LOCK); } ;
 -dynamic_attr: KRT_LOCK_CWND   { $$ = f_new_dynamic_attr_bit(7, T_BOOL, EA_KRT_LOCK); } ;
 -dynamic_attr: KRT_LOCK_ADVMSS { $$ = f_new_dynamic_attr_bit(8, T_BOOL, EA_KRT_LOCK); } ;
 -dynamic_attr: KRT_LOCK_REORDERING { $$ = f_new_dynamic_attr_bit(9, T_BOOL, EA_KRT_LOCK); } ;
 -dynamic_attr: KRT_LOCK_HOPLIMIT       { $$ = f_new_dynamic_attr_bit(10, T_BOOL, EA_KRT_LOCK); } ;
 -dynamic_attr: KRT_LOCK_INITCWND       { $$ = f_new_dynamic_attr_bit(11, T_BOOL, EA_KRT_LOCK); } ;
++attr_bit: KRT_LOCK_MTU                { $$ = f_new_dynamic_attr_bit(2, "krt_lock"); } ;
 +attr_bit: KRT_LOCK_WINDOW     { $$ = f_new_dynamic_attr_bit(3, "krt_lock"); } ;
- attr_bit: KRT_LOCK_RTT        { $$ = f_new_dynamic_attr_bit(4, "krt_lock"); } ;
++attr_bit: KRT_LOCK_RTT                { $$ = f_new_dynamic_attr_bit(4, "krt_lock"); } ;
 +attr_bit: KRT_LOCK_RTTVAR     { $$ = f_new_dynamic_attr_bit(5, "krt_lock"); } ;
 +attr_bit: KRT_LOCK_SSTRESH    { $$ = f_new_dynamic_attr_bit(6, "krt_lock"); } ;
- attr_bit: KRT_LOCK_CWND       { $$ = f_new_dynamic_attr_bit(7, "krt_lock"); } ;
++attr_bit: KRT_LOCK_CWND               { $$ = f_new_dynamic_attr_bit(7, "krt_lock"); } ;
 +attr_bit: KRT_LOCK_ADVMSS     { $$ = f_new_dynamic_attr_bit(8, "krt_lock"); } ;
- attr_bit: KRT_LOCK_REORDERING { $$ = f_new_dynamic_attr_bit(9, "krt_lock"); } ;
- attr_bit: KRT_LOCK_HOPLIMIT { $$ = f_new_dynamic_attr_bit(10, "krt_lock"); } ;
- attr_bit: KRT_LOCK_RTO_MIN { $$ = f_new_dynamic_attr_bit(13, "krt_lock"); } ;
++attr_bit: KRT_LOCK_REORDERING { $$ = f_new_dynamic_attr_bit(9, "krt_lock"); } ;
++attr_bit: KRT_LOCK_HOPLIMIT   { $$ = f_new_dynamic_attr_bit(10, "krt_lock"); } ;
++attr_bit: KRT_LOCK_INITCWND   { $$ = f_new_dynamic_attr_bit(11, "krt_lock"); } ;
+ /* No lock for FEATURES bitfield */
 -dynamic_attr: KRT_LOCK_RTO_MIN        { $$ = f_new_dynamic_attr_bit(13, T_BOOL, EA_KRT_LOCK); } ;
 -dynamic_attr: KRT_LOCK_INITRWND       { $$ = f_new_dynamic_attr_bit(14, T_BOOL, EA_KRT_LOCK); } ;
 -dynamic_attr: KRT_LOCK_QUICKACK       { $$ = f_new_dynamic_attr_bit(15, T_BOOL, EA_KRT_LOCK); } ;
 -dynamic_attr: KRT_LOCK_CONGCTL        { $$ = f_new_dynamic_attr_bit(16, T_BOOL, EA_KRT_LOCK); } ;
 -dynamic_attr: KRT_LOCK_FASTOPEN_NO_COOKIE { $$ = f_new_dynamic_attr_bit(17, T_BOOL, EA_KRT_LOCK); } ;
 -
 -dynamic_attr: KRT_FEATURE_ECN { $$ = f_new_dynamic_attr_bit(0, T_BOOL, EA_KRT_FEATURES); } ;
 -dynamic_attr: KRT_FEATURE_ALLFRAG { $$ = f_new_dynamic_attr_bit(3, T_BOOL, EA_KRT_FEATURES); } ;
 -
++attr_bit: KRT_LOCK_RTO_MIN    { $$ = f_new_dynamic_attr_bit(13, "krt_lock"); } ;
++attr_bit: KRT_LOCK_INITRWND   { $$ = f_new_dynamic_attr_bit(14, "krt_lock"); } ;
++attr_bit: KRT_LOCK_QUICKACK   { $$ = f_new_dynamic_attr_bit(15, "krt_lock"); } ;
++attr_bit: KRT_LOCK_CONGCTL    { $$ = f_new_dynamic_attr_bit(16, "krt_lock"); } ;
++attr_bit: KRT_LOCK_FASTOPEN_NO_COOKIE { $$ = f_new_dynamic_attr_bit(17, "krt_lock"); } ;
 +
 +/* Bits of EA_KRT_FEATURES */
 +attr_bit: KRT_FEATURE_ECN     { $$ = f_new_dynamic_attr_bit(0, "krt_features"); } ;
 +attr_bit: KRT_FEATURE_ALLFRAG { $$ = f_new_dynamic_attr_bit(3, "krt_features"); } ;
 +
 +/* Using attribute bits in filters (moved here to not confuse Bison on *BSD) */
 +lvalue: attr_bit { $$ = (struct f_lval) { .type = F_LVAL_ATTR_BIT, .fab = $1 }; };
  
  CF_CODE
  
index 06a6ea72c50a9f918cd67ca0b80d818a6e2be786,1ace6c27a99f148ea6115332d059fbc5f7e8c82b..9eae5a48a1b48c60db4acd31760200ba24427d00
@@@ -43,106 -42,6 +43,107 @@@ struct nl_parse_stat
    u32 rta_flow;
  };
  
-   "congctl"
 +/*
 + *    Netlink eattr definitions
 + */
 +
 +#define KRT_METRICS_MAX               ARRAY_SIZE(ea_krt_metrics)
 +#define KRT_FEATURES_MAX      4
 +
 +static void krt_bitfield_format(const eattr *e, byte *buf, uint buflen);
 +
 +static struct ea_class
 +  ea_krt_prefsrc = {
 +    .name = "krt_prefsrc",
 +    .type = T_IP,
 +  },
 +  ea_krt_realm = {
 +    .name = "krt_realm",
 +    .type = T_INT,
 +  },
 +  ea_krt_scope = {
 +    .name = "krt_scope",
 +    .type = T_INT,
 +  };
 +
 +static struct ea_class ea_krt_metrics[] = {
 +  [RTAX_LOCK] = {
 +    .name = "krt_lock",
 +    .type = T_INT,
 +    .format = krt_bitfield_format,
 +  },
 +  [RTAX_FEATURES] = {
 +    .name = "krt_features",
 +    .type = T_INT,
 +    .format = krt_bitfield_format,
 +  },
 +  [RTAX_CC_ALGO] = {
 +    .name = "krt_congctl",
 +    .type = T_STRING,
 +  },
 +#define KRT_METRIC_INT(_rtax, _name)  [_rtax] = { .name = _name, .type = T_INT }
 +  KRT_METRIC_INT(RTAX_MTU, "krt_mtu"),
 +  KRT_METRIC_INT(RTAX_WINDOW, "krt_window"),
 +  KRT_METRIC_INT(RTAX_RTT, "krt_rtt"),
 +  KRT_METRIC_INT(RTAX_RTTVAR, "krt_rttvar"),
 +  KRT_METRIC_INT(RTAX_SSTHRESH, "krt_sstresh"),
 +  KRT_METRIC_INT(RTAX_CWND, "krt_cwnd"),
 +  KRT_METRIC_INT(RTAX_ADVMSS, "krt_advmss"),
 +  KRT_METRIC_INT(RTAX_REORDERING, "krt_reordering"),
 +  KRT_METRIC_INT(RTAX_HOPLIMIT, "krt_hoplimit"),
 +  KRT_METRIC_INT(RTAX_INITCWND, "krt_initcwnd"),
 +  KRT_METRIC_INT(RTAX_RTO_MIN, "krt_rto_min"),
 +  KRT_METRIC_INT(RTAX_INITRWND, "krt_initrwnd"),
 +  KRT_METRIC_INT(RTAX_QUICKACK, "krt_quickack"),
++  KRT_METRIC_INT(RTAX_FASTOPEN_NO_COOKIE, "krt_fastopen_no_cookie"),
 +#undef KRT_METRIC_INT
 +};
 +
 +static const char *krt_metrics_names[KRT_METRICS_MAX] = {
 +  NULL, "lock", "mtu", "window", "rtt", "rttvar", "sstresh", "cwnd", "advmss",
 +  "reordering", "hoplimit", "initcwnd", "features", "rto_min", "initrwnd", "quickack",
++  "congctl", "fastopen_no_cookie"
 +};
 +
 +static const char *krt_features_names[KRT_FEATURES_MAX] = {
 +  "ecn", NULL, NULL, "allfrag"
 +};
 +
 +static void
 +krt_bitfield_format(const eattr *a, byte *buf, uint buflen)
 +{
 +  if (a->id == ea_krt_metrics[RTAX_LOCK].id)
 +    ea_format_bitfield(a, buf, buflen, krt_metrics_names, 2, KRT_METRICS_MAX);
 +  else if (a->id == ea_krt_metrics[RTAX_FEATURES].id)
 +    ea_format_bitfield(a, buf, buflen, krt_features_names, 0, KRT_FEATURES_MAX);
 +}
 +
 +static void
 +nl_ea_register(void)
 +{
 +  EA_REGISTER_ALL(
 +      &ea_krt_prefsrc,
 +      &ea_krt_realm,
 +      &ea_krt_scope
 +      );
 +
 +  for (uint i = 0; i < KRT_METRICS_MAX; i++)
 +  {
 +    if (!ea_krt_metrics[i].name)
 +      ea_krt_metrics[i] = (struct ea_class) {
 +      .name = mb_sprintf(&root_pool, "krt_metric_%d", i),
 +      .type = T_INT,
 +      };
 +
 +    ea_register_init(&ea_krt_metrics[i]);
 +  }
 +
 +  for (uint i = 1; i < KRT_METRICS_MAX; i++)
 +    ASSERT_DIE(ea_krt_metrics[i].id == ea_krt_metrics[0].id + i);
 +}
 +
 +
 +
  /*
   *    Synchronous Netlink interface
   */