]> git.puffer.fish Git - mirror/frr.git/commitdiff
bfdd, zebra: pass the vrf identifier between zebra and bfdd
authorPhilippe Guibert <philippe.guibert@6wind.com>
Tue, 26 Mar 2019 09:54:09 +0000 (10:54 +0100)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Tue, 7 May 2019 13:53:07 +0000 (15:53 +0200)
messages from daemons to bfd daemons go through zebra. zebra reuses the
vrf identifier to send messages to bfd.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
bfdd/ptm_adapter.c
zebra/zebra_ptm.c

index 93d8a442e344bae78e774f5a5c7c75e4c5f43a26..606faa7cdf4f832e68d73757a4c106699cd72f85 100644 (file)
@@ -58,7 +58,7 @@ static struct zclient *zclient;
 static int _ptm_msg_address(struct stream *msg, int family, const void *addr);
 
 static void _ptm_msg_read_address(struct stream *msg, struct sockaddr_any *sa);
-static int _ptm_msg_read(struct stream *msg, int command,
+static int _ptm_msg_read(struct stream *msg, int command, vrf_id_t vrf_id,
                         struct bfd_peer_cfg *bpc, struct ptm_client **pc);
 
 static struct ptm_client *pc_lookup(uint32_t pid);
@@ -72,8 +72,8 @@ static struct ptm_client_notification *pcn_lookup(struct ptm_client *pc,
 static void pcn_free(struct ptm_client_notification *pcn);
 
 
-static void bfdd_dest_register(struct stream *msg);
-static void bfdd_dest_deregister(struct stream *msg);
+static void bfdd_dest_register(struct stream *msg, vrf_id_t vrf_id);
+static void bfdd_dest_deregister(struct stream *msg, vrf_id_t vrf_id);
 static void bfdd_client_register(struct stream *msg);
 static void bfdd_client_deregister(struct stream *msg);
 
@@ -182,7 +182,10 @@ int ptm_bfd_notify(struct bfd_session *bs)
        stream_reset(msg);
 
        /* TODO: VRF handling */
-       zclient_create_header(msg, ZEBRA_BFD_DEST_REPLAY, VRF_DEFAULT);
+       if (bs->vrf)
+               zclient_create_header(msg, ZEBRA_BFD_DEST_REPLAY, bs->vrf->vrf_id);
+       else
+               zclient_create_header(msg, ZEBRA_BFD_DEST_REPLAY, VRF_DEFAULT);
 
        /* This header will be handled by `zebra_ptm.c`. */
        stream_putl(msg, ZEBRA_INTERFACE_BFD_DEST_UPDATE);
@@ -256,7 +259,7 @@ stream_failure:
        memset(sa, 0, sizeof(*sa));
 }
 
-static int _ptm_msg_read(struct stream *msg, int command,
+static int _ptm_msg_read(struct stream *msg, int command, vrf_id_t vrf_id,
                         struct bfd_peer_cfg *bpc, struct ptm_client **pc)
 {
        uint32_t pid;
@@ -355,6 +358,18 @@ static int _ptm_msg_read(struct stream *msg, int command,
                        bpc->bpc_localif[ifnamelen] = 0;
                }
        }
+       if (vrf_id != VRF_DEFAULT) {
+               struct vrf *vrf;
+
+               vrf = vrf_lookup_by_id(vrf_id);
+               if (vrf) {
+                       bpc->bpc_has_vrfname = true;
+                       strlcpy(bpc->bpc_vrfname, vrf->name, sizeof(bpc->bpc_vrfname));
+               } else {
+                       log_error("ptm-read: vrf id %u could not be identified", vrf_id);
+                       return -1;
+               }
+       }
 
        /* Sanity check: peer and local address must match IP types. */
        if (bpc->bpc_local.sa_sin.sin_family != 0
@@ -370,7 +385,7 @@ stream_failure:
        return -1;
 }
 
-static void bfdd_dest_register(struct stream *msg)
+static void bfdd_dest_register(struct stream *msg, vrf_id_t vrf_id)
 {
        struct ptm_client *pc;
        struct ptm_client_notification *pcn;
@@ -378,7 +393,7 @@ static void bfdd_dest_register(struct stream *msg)
        struct bfd_peer_cfg bpc;
 
        /* Read the client context and peer data. */
-       if (_ptm_msg_read(msg, ZEBRA_BFD_DEST_REGISTER, &bpc, &pc) == -1)
+       if (_ptm_msg_read(msg, ZEBRA_BFD_DEST_REGISTER, vrf_id, &bpc, &pc) == -1)
                return;
 
        DEBUG_PRINTBPC(&bpc);
@@ -408,7 +423,7 @@ static void bfdd_dest_register(struct stream *msg)
        ptm_bfd_notify(bs);
 }
 
-static void bfdd_dest_deregister(struct stream *msg)
+static void bfdd_dest_deregister(struct stream *msg, vrf_id_t vrf_id)
 {
        struct ptm_client *pc;
        struct ptm_client_notification *pcn;
@@ -416,7 +431,7 @@ static void bfdd_dest_deregister(struct stream *msg)
        struct bfd_peer_cfg bpc;
 
        /* Read the client context and peer data. */
-       if (_ptm_msg_read(msg, ZEBRA_BFD_DEST_DEREGISTER, &bpc, &pc) == -1)
+       if (_ptm_msg_read(msg, ZEBRA_BFD_DEST_DEREGISTER, vrf_id, &bpc, &pc) == -1)
                return;
 
        DEBUG_PRINTBPC(&bpc);
@@ -497,10 +512,10 @@ static int bfdd_replay(ZAPI_CALLBACK_ARGS)
        switch (rcmd) {
        case ZEBRA_BFD_DEST_REGISTER:
        case ZEBRA_BFD_DEST_UPDATE:
-               bfdd_dest_register(msg);
+               bfdd_dest_register(msg, vrf_id);
                break;
        case ZEBRA_BFD_DEST_DEREGISTER:
-               bfdd_dest_deregister(msg);
+               bfdd_dest_deregister(msg, vrf_id);
                break;
        case ZEBRA_BFD_CLIENT_REGISTER:
                bfdd_client_register(msg);
index bb352dc2ffd698fb3176500324cbf928b4c7979c..d3ecd3695adb6457e3eeb84b46b5eb76e3b65c2a 100644 (file)
@@ -1188,8 +1188,8 @@ static void pp_free_all(void);
 static void zebra_ptm_send_bfdd(struct stream *msg);
 static void zebra_ptm_send_clients(struct stream *msg);
 static int _zebra_ptm_bfd_client_deregister(struct zserv *zs);
-static void _zebra_ptm_reroute(struct zserv *zs, struct stream *msg,
-                              uint32_t command);
+static void _zebra_ptm_reroute(struct zserv *zs, struct zebra_vrf *zvrf,
+                              struct stream *msg, uint32_t command);
 
 
 /*
@@ -1392,8 +1392,8 @@ void zebra_ptm_finish(void)
 /*
  * Message handling.
  */
-static void _zebra_ptm_reroute(struct zserv *zs, struct stream *msg,
-                              uint32_t command)
+static void _zebra_ptm_reroute(struct zserv *zs, struct zebra_vrf *zvrf,
+                              struct stream *msg, uint32_t command)
 {
        struct stream *msgc;
        size_t zmsglen, zhdrlen;
@@ -1420,7 +1420,7 @@ static void _zebra_ptm_reroute(struct zserv *zs, struct stream *msg,
         * one callback at the `bfdd` side, however the real command
         * number will be included right after the zebra header.
         */
-       zclient_create_header(msgc, ZEBRA_BFD_DEST_REPLAY, 0);
+       zclient_create_header(msgc, ZEBRA_BFD_DEST_REPLAY, zvrf->vrf->vrf_id);
        stream_putl(msgc, command);
 
        /* Update the data pointers. */
@@ -1446,7 +1446,7 @@ void zebra_ptm_bfd_dst_register(ZAPI_HANDLER_ARGS)
                zlog_debug("bfd_dst_register msg from client %s: length=%d",
                           zebra_route_string(client->proto), hdr->length);
 
-       _zebra_ptm_reroute(client, msg, ZEBRA_BFD_DEST_REGISTER);
+       _zebra_ptm_reroute(client, zvrf, msg, ZEBRA_BFD_DEST_REGISTER);
 }
 
 void zebra_ptm_bfd_dst_deregister(ZAPI_HANDLER_ARGS)
@@ -1455,7 +1455,7 @@ void zebra_ptm_bfd_dst_deregister(ZAPI_HANDLER_ARGS)
                zlog_debug("bfd_dst_deregister msg from client %s: length=%d",
                           zebra_route_string(client->proto), hdr->length);
 
-       _zebra_ptm_reroute(client, msg, ZEBRA_BFD_DEST_DEREGISTER);
+       _zebra_ptm_reroute(client, zvrf, msg, ZEBRA_BFD_DEST_DEREGISTER);
 }
 
 void zebra_ptm_bfd_client_register(ZAPI_HANDLER_ARGS)
@@ -1464,7 +1464,7 @@ void zebra_ptm_bfd_client_register(ZAPI_HANDLER_ARGS)
                zlog_debug("bfd_client_register msg from client %s: length=%d",
                           zebra_route_string(client->proto), hdr->length);
 
-       _zebra_ptm_reroute(client, msg, ZEBRA_BFD_CLIENT_REGISTER);
+       _zebra_ptm_reroute(client, zvrf, msg, ZEBRA_BFD_CLIENT_REGISTER);
 }
 
 void zebra_ptm_bfd_dst_replay(ZAPI_HANDLER_ARGS)
@@ -1488,7 +1488,7 @@ void zebra_ptm_bfd_dst_replay(ZAPI_HANDLER_ARGS)
         * special treatment.
         */
        if (client->proto != ZEBRA_ROUTE_BFD) {
-               _zebra_ptm_reroute(client, msg, ZEBRA_BFD_DEST_REPLAY);
+               _zebra_ptm_reroute(client, zvrf, msg, ZEBRA_BFD_DEST_REPLAY);
                return;
        }