]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: increase vrf_id from 16 bit to 32 bit identifier
authorPhilippe Guibert <philippe.guibert@6wind.com>
Thu, 14 Dec 2017 15:01:36 +0000 (16:01 +0100)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Mon, 22 Jan 2018 12:52:17 +0000 (13:52 +0100)
This is a preparatory work for configuring vrf/frr over netns
vrf structure is being changed to 32 bit, and the VRF will have the
possibility to have a backend made up of NETNS.

Let's put some history.
Initially the 32 bit was because one wanted to map on vrf_id both the
VRFLITE and the NSID.
Initially, one would have liked to make zebra configure at the same time
both vrf lite and vrf from netns in a flat way. From the show
running perspective, one would have had both kind of vrfs, thatone
would configure on the same way.
however, it leads to inconsistencies in concepts, because it mixes vrf
vrf with vrf, and vrf is not always mapped with netns.
For instance, logical-router could also be used with netns. In that
case, it would not be possible to map vrf with netns.
There was an other reason why 32 bit is proposed. this is because
some systems handle NSID to 32 bits. As vrf lite exists only on
Linux, there are other systems that would like to use an other vrf
backend than vrf lite. The netns backend for vrf will be used for that
too. for instance, for windows or freebsd, some similar
netns concept exists; so it will be easier to reuse netns
backend for vrf, than reusing vrflite backend for vrf.

This commit is here to extend vrf_id to 32 bits. Following commits in a
second step will help in enable a VRF backend.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
lib/vrf.c
lib/vrf.h
lib/zclient.c
lib/zclient.h
lib/zebra.h
zebra/zebra_ptm.c
zebra/zserv.c

index 3c34b952620d123c1dcdc9aec586062a0172b31d..b4ed24cbffcae40dc45f585780aafcdaf718117c 100644 (file)
--- a/lib/vrf.c
+++ b/lib/vrf.c
@@ -94,7 +94,7 @@ struct vrf *vrf_get(vrf_id_t vrf_id, const char *name)
        int new = 0;
 
        if (debug_vrf)
-               zlog_debug("VRF_GET: %s(%d)", name, vrf_id);
+               zlog_debug("VRF_GET: %s(%u)", name, vrf_id);
 
        /* Nothing to see, move along here */
        if (!name && vrf_id == VRF_UNKNOWN)
@@ -268,7 +268,7 @@ void *vrf_info_lookup(vrf_id_t vrf_id)
  */
 
 #define VRF_BITMAP_NUM_OF_GROUPS            8
-#define VRF_BITMAP_NUM_OF_BITS_IN_GROUP (UINT16_MAX / VRF_BITMAP_NUM_OF_GROUPS)
+#define VRF_BITMAP_NUM_OF_BITS_IN_GROUP (UINT32_MAX / VRF_BITMAP_NUM_OF_GROUPS)
 #define VRF_BITMAP_NUM_OF_BYTES_IN_GROUP                                       \
        (VRF_BITMAP_NUM_OF_BITS_IN_GROUP / CHAR_BIT + 1) /* +1 for ensure */
 
@@ -355,7 +355,7 @@ static void vrf_autocomplete(vector comps, struct cmd_token *token)
        struct vrf *vrf = NULL;
 
        RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
-               if (vrf->vrf_id != 0)
+               if (vrf->vrf_id != VRF_DEFAULT)
                        vector_set(comps, XSTRDUP(MTYPE_COMPLETION, vrf->name));
        }
 }
index 9afca4c6fbcb917b68baa421819f7cffa9045962..7e625769e7f332c447b6e84387ec7c3c42a3ffd7 100644 (file)
--- a/lib/vrf.h
+++ b/lib/vrf.h
@@ -32,8 +32,7 @@
 
 /* The default VRF ID */
 #define VRF_DEFAULT 0
-#define VRF_UNKNOWN UINT16_MAX
-#define VRF_ALL UINT16_MAX - 1
+#define VRF_UNKNOWN UINT32_MAX
 
 /* Pending: May need to refine this. */
 #ifndef IFLA_VRF_MAX
index 4177ce1a71b394abf4aeadc0a301a289e54dcd24..d4a7b45b972c8819adf86441410e08ca375eb011 100644 (file)
@@ -291,7 +291,7 @@ void zclient_create_header(struct stream *s, uint16_t command, vrf_id_t vrf_id)
        stream_putw(s, ZEBRA_HEADER_SIZE);
        stream_putc(s, ZEBRA_HEADER_MARKER);
        stream_putc(s, ZSERV_VERSION);
-       stream_putw(s, vrf_id);
+       stream_putl(s, vrf_id);
        stream_putw(s, command);
 }
 
@@ -306,7 +306,7 @@ int zclient_read_header(struct stream *s, int sock, u_int16_t *size,
        *size -= ZEBRA_HEADER_SIZE;
        STREAM_GETC(s, *marker);
        STREAM_GETC(s, *version);
-       STREAM_GETW(s, *vrf_id);
+       STREAM_GETL(s, *vrf_id);
        STREAM_GETW(s, *cmd);
 
        if (*version != ZSERV_VERSION || *marker != ZEBRA_HEADER_MARKER) {
@@ -1677,7 +1677,7 @@ struct interface *zebra_interface_vrf_update_read(struct stream *s,
 {
        unsigned int ifindex;
        struct interface *ifp;
-       vrf_id_t new_id = VRF_DEFAULT;
+       vrf_id_t new_id;
 
        /* Get interface index. */
        ifindex = stream_getl(s);
@@ -2043,7 +2043,7 @@ static int zclient_read(struct thread *thread)
        length = stream_getw(zclient->ibuf);
        marker = stream_getc(zclient->ibuf);
        version = stream_getc(zclient->ibuf);
-       vrf_id = stream_getw(zclient->ibuf);
+       vrf_id = stream_getl(zclient->ibuf);
        command = stream_getw(zclient->ibuf);
 
        if (marker != ZEBRA_HEADER_MARKER || version != ZSERV_VERSION) {
@@ -2346,9 +2346,9 @@ void zclient_interface_set_master(struct zclient *client,
 
        zclient_create_header(s, ZEBRA_INTERFACE_SET_MASTER, master->vrf_id);
 
-       stream_putw(s, master->vrf_id);
+       stream_putl(s, master->vrf_id);
        stream_putl(s, master->ifindex);
-       stream_putw(s, slave->vrf_id);
+       stream_putl(s, slave->vrf_id);
        stream_putl(s, slave->ifindex);
 
        stream_putw_at(s, 0, stream_get_endp(s));
index cc34fd9d2c9d5e3f12b52a0da8614e22e20dad69..00ad692718fb9f896828a8783e0b88823987cce3 100644 (file)
@@ -40,7 +40,7 @@
 #define ZEBRA_MAX_PACKET_SIZ          4096
 
 /* Zebra header size. */
-#define ZEBRA_HEADER_SIZE             8
+#define ZEBRA_HEADER_SIZE             10
 
 /* special socket path name to use TCP
  * @ is used as first character because that's abstract socket names on Linux
@@ -227,7 +227,7 @@ struct zserv_header {
                         * always set to 255 in new zserv.
                         */
        uint8_t version;
-#define ZSERV_VERSION  4
+#define ZSERV_VERSION  5
        vrf_id_t vrf_id;
        uint16_t command;
 };
index 1eb0c562527350c77ff0272925ba68bd445bfbc4..b9a795d16099894beac1f9adb4c63cb60d0c87b5 100644 (file)
@@ -486,7 +486,7 @@ typedef u_int16_t zebra_size_t;
 typedef u_int16_t zebra_command_t;
 
 /* VRF ID type. */
-typedef u_int16_t vrf_id_t;
+typedef uint32_t vrf_id_t;
 
 typedef uint32_t route_tag_t;
 #define ROUTE_TAG_MAX UINT32_MAX
index 769d2f566619a1dce2690187241aae1691be4ed9..953f74ecec177f711e32acce0ca307a7a90cc7e4 100644 (file)
@@ -432,7 +432,7 @@ static void if_bfd_session_update(struct interface *ifp, struct prefix *dp,
                } else {
                        zlog_debug(
                                "MESSAGE: ZEBRA_INTERFACE_BFD_DEST_UPDATE %s/%d "
-                               "with src %s/%d and vrf %d %s event",
+                               "with src %s/%d and vrf %u %s event",
                                inet_ntop(dp->family, &dp->u.prefix, buf[0],
                                          INET6_ADDRSTRLEN),
                                dp->prefixlen,
index 7eded89f6dc8233f03529ab6c5902bff14c4e4c4..6241a16389ef13356708e0b1b2782ee51fda901d 100644 (file)
@@ -155,7 +155,7 @@ void zserv_create_header(struct stream *s, uint16_t cmd, vrf_id_t vrf_id)
        stream_putw(s, ZEBRA_HEADER_SIZE);
        stream_putc(s, ZEBRA_HEADER_MARKER);
        stream_putc(s, ZSERV_VERSION);
-       stream_putw(s, vrf_id);
+       stream_putl(s, vrf_id);
        stream_putw(s, cmd);
 }
 
@@ -508,7 +508,7 @@ int zsend_interface_vrf_update(struct zserv *client, struct interface *ifp,
 
        /* Fill in the ifIndex of the interface and its new VRF (id) */
        stream_putl(s, ifp->ifindex);
-       stream_putw(s, vrf_id);
+       stream_putl(s, vrf_id);
 
        /* Write packet size. */
        stream_putw_at(s, 0, stream_get_endp(s));
@@ -2472,11 +2472,11 @@ static int zread_interface_set_master(struct zserv *client,
        int ifindex;
        vrf_id_t vrf_id;
 
-       STREAM_GETW(s, vrf_id);
+       STREAM_GETL(s, vrf_id);
        STREAM_GETL(s, ifindex);
        master = if_lookup_by_index(ifindex, vrf_id);
 
-       STREAM_GETW(s, vrf_id);
+       STREAM_GETL(s, vrf_id);
        STREAM_GETL(s, ifindex);
        slave = if_lookup_by_index(ifindex, vrf_id);
 
@@ -2714,7 +2714,7 @@ static int zebra_client_read(struct thread *thread)
                STREAM_GETW(client->ibuf, length);
                STREAM_GETC(client->ibuf, marker);
                STREAM_GETC(client->ibuf, version);
-               STREAM_GETW(client->ibuf, vrf_id);
+               STREAM_GETL(client->ibuf, vrf_id);
                STREAM_GETW(client->ibuf, command);
 
                if (marker != ZEBRA_HEADER_MARKER || version != ZSERV_VERSION) {