]> git.puffer.fish Git - mirror/frr.git/commitdiff
zebra: Add ability to pretend routes are offloaded 15501/head
authorDonald Sharp <sharpd@nvidia.com>
Thu, 7 Mar 2024 01:53:20 +0000 (20:53 -0500)
committerton31337 <3352707+ton31337@users.noreply.github.com>
Wed, 13 Mar 2024 07:38:28 +0000 (07:38 +0000)
In the fpm_listener add a -r option to allow for
routes to be notified back to zebra that the route
has been `offloaded` properly.

fpm_listener output:
New route 4.5.6.7/32, Prot: Static(196), Metric: 20, nhgid: 23
  Route Static(196) reflecting back
FPM message - Type: 1, Length 56
New route 169.254.0.0/16, Prot: Kernel(2), Metric: 20, nhgid: 2
FPM message - Type: 1, Length 56
New route 192.168.99.0/24, Prot: Kernel(2), Metric: 20, nhgid: 42
FPM message - Type: 1, Length 56
New route 192.168.99.1/32, Prot: Kernel(2), Metric: 20, nhgid: 42
FPM message - Type: 1, Length 56
New route 192.168.119.0/24, Prot: OSPF(188), Metric: 20, nhgid: 20
  Route OSPF(188) reflecting back

Zebra output:

2024-03-06 21:48:54.613 [DEBG] zebra: [TJXPZ-RC5XQ] default(0:254):4.5.6.7/32 Processing dplane notif ctx 0x7160b4008780
2024-03-06 21:48:54.613 [DEBG] zebra: [TJXPZ-RC5XQ] default(0:254):192.168.119.0/24 Processing dplane notif ctx 0x7160b4008780

eva# show ip route 4.5.6.7 json
{
  "4.5.6.7/32":[
    {
      "prefix":"4.5.6.7/32",
      "prefixLen":32,
      "protocol":"static",
      "vrfId":0,
      "vrfName":"default",
      "selected":true,
      "destSelected":true,
      "distance":1,
      "metric":0,
      "installed":true,
      "offloaded":true,
....

and

eva# show ip route 192.168.119.0 json
{
  "192.168.119.0/24":[
    {
      "prefix":"192.168.119.0/24",
      "prefixLen":24,
      "protocol":"ospf",
      "vrfId":0,
      "vrfName":"default",
      "selected":true,
      "destSelected":true,
      "distance":110,
      "metric":100,
      "installed":true,
      "offloaded":true,
...

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
zebra/fpm_listener.c

index 17ce9ac7c4f6de0097daec457e59d3c9e9e380d2..5ffc0561bb1a9669b25d9a75dc1a812c2d0cb6d6 100644 (file)
@@ -39,6 +39,7 @@
 struct glob {
        int server_sock;
        int sock;
+       bool reflect;
 };
 
 struct glob glob_space;
@@ -526,11 +527,12 @@ static int netlink_msg_ctx_snprint(struct netlink_msg_ctx *ctx, char *buf,
        cur = buf;
        end = buf + buf_len;
 
-       cur += snprintf(cur, end - cur, "%s %s/%d, Prot: %s",
+       cur += snprintf(cur, end - cur, "%s %s/%d, Prot: %s(%u)",
                        netlink_msg_type_to_s(hdr->nlmsg_type),
                        addr_to_s(rtmsg->rtm_family, RTA_DATA(ctx->dest)),
                        rtmsg->rtm_dst_len,
-                       netlink_prot_to_s(rtmsg->rtm_protocol));
+                       netlink_prot_to_s(rtmsg->rtm_protocol),
+                       rtmsg->rtm_protocol);
 
        if (ctx->metric)
                cur += snprintf(cur, end - cur, ", Metric: %d", *ctx->metric);
@@ -570,8 +572,7 @@ static void print_netlink_msg_ctx(struct netlink_msg_ctx *ctx)
 /*
  * parse_netlink_msg
  */
-static void
-parse_netlink_msg(char *buf, size_t buf_len)
+static void parse_netlink_msg(char *buf, size_t buf_len, fpm_msg_hdr_t *fpm)
 {
        struct netlink_msg_ctx ctx_space, *ctx;
        struct nlmsghdr *hdr;
@@ -599,6 +600,16 @@ parse_netlink_msg(char *buf, size_t buf_len)
                        }
 
                        print_netlink_msg_ctx(ctx);
+
+                       if (glob->reflect && hdr->nlmsg_type == RTM_NEWROUTE &&
+                           ctx->rtmsg->rtm_protocol > RTPROT_STATIC) {
+                               printf("  Route %s(%u) reflecting back\n",
+                                      netlink_prot_to_s(
+                                              ctx->rtmsg->rtm_protocol),
+                                      ctx->rtmsg->rtm_protocol);
+                               ctx->rtmsg->rtm_flags |= RTM_F_OFFLOAD;
+                               write(glob->sock, fpm, fpm_msg_len(fpm));
+                       }
                        break;
 
                default:
@@ -623,7 +634,7 @@ static void process_fpm_msg(fpm_msg_hdr_t *hdr)
                return;
        }
 
-       parse_netlink_msg(fpm_msg_data(hdr), fpm_msg_data_len(hdr));
+       parse_netlink_msg(fpm_msg_data(hdr), fpm_msg_data_len(hdr), hdr);
 }
 
 /*
@@ -647,18 +658,29 @@ static void fpm_serve(void)
 int main(int argc, char **argv)
 {
        pid_t daemon;
-       int d;
+       int r;
+       bool fork_daemon = false;
+
+       memset(glob, 0, sizeof(*glob));
 
-       d = getopt(argc, argv, "d");
-       if (d == 'd') {
+       while ((r = getopt(argc, argv, "rd")) != -1) {
+               switch (r) {
+               case 'r':
+                       glob->reflect = true;
+                       break;
+               case 'd':
+                       fork_daemon = true;
+                       break;
+               }
+       }
+
+       if (fork_daemon) {
                daemon = fork();
 
                if (daemon)
                        exit(0);
        }
 
-       memset(glob, 0, sizeof(*glob));
-
        if (!create_listen_sock(FPM_DEFAULT_PORT, &glob->server_sock))
                exit(1);