]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
define, encode, and decode additional data after a BFD packet.
authorAlan T. DeKok <aland@freeradius.org>
Wed, 15 Mar 2023 18:27:55 +0000 (14:27 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Wed, 15 Mar 2023 18:32:35 +0000 (14:32 -0400)
share/dictionary/bfd/dictionary.freeradius.internal
src/listen/bfd/proto_bfd.c
src/protocols/bfd/attrs.h
src/protocols/bfd/base.c
src/protocols/bfd/decode.c
src/protocols/bfd/encode.c
src/tests/unit/protocols/bfd/base.txt

index 268fda12f1af24ed8a891fad422cba4af613f265..a1326e5d4c5bf13fdc2d81328aa57c8e7969f097 100644 (file)
@@ -25,7 +25,6 @@ VALUE Packet-Type                     Init                            2
 VALUE  Packet-Type                     Up                              3
 
 #
-#  This is our version of our current link state, which is copied
-#  to the request packet.
+#  Additional data which gets added to the end of the BFD packet.
 #
-DEFINE Link-State                              uint32  enum=Packet-Type
+DEFINE Additional-Data                         group
index 7bf264d2d2c14a09c72bff74462953157862a155..6de6be3723ff5369279916756e82aee4f01a308f 100644 (file)
@@ -68,12 +68,10 @@ static fr_dict_attr_t const *attr_packet_type;
 static fr_dict_attr_t const *attr_bfd_packet;
 static fr_dict_attr_t const *attr_my_discriminator;
 static fr_dict_attr_t const *attr_your_discriminator;
-static fr_dict_attr_t const *attr_link_state;
 
 extern fr_dict_attr_autoload_t proto_bfd_dict_attr[];
 fr_dict_attr_autoload_t proto_bfd_dict_attr[] = {
        { .out = &attr_packet_type, .name = "Packet-Type", .type = FR_TYPE_UINT32, .dict = &dict_bfd},
-       { .out = &attr_link_state, .name = "Link-State", .type = FR_TYPE_UINT32, .dict = &dict_bfd},
 
        { .out = &attr_bfd_packet, .name = "Packet", .type = FR_TYPE_STRUCT, .dict = &dict_bfd},
        { .out = &attr_my_discriminator, .name = "Packet.my-discriminator", .type = FR_TYPE_UINT32, .dict = &dict_bfd},
index 46dd09e014737816323f8a973981bee835f9c205..fb9f9622bf1e951889b311f212fa6e6c4ff8e698 100644 (file)
@@ -32,3 +32,4 @@ extern HIDDEN fr_dict_t const *dict_bfd;
 
 extern HIDDEN fr_dict_attr_t const *attr_packet_type;
 extern HIDDEN fr_dict_attr_t const *attr_bfd_packet;
+extern HIDDEN fr_dict_attr_t const *attr_bfd_additional_data;
index 9b76cd144361aaacfabfe85f964f4696235c36c6..d3b38cbefbf08ce1a73d41c24c219e8a275496b5 100644 (file)
@@ -49,11 +49,13 @@ fr_dict_autoload_t libfreeradius_bfd_dict[] = {
 
 fr_dict_attr_t const *attr_packet_type;
 fr_dict_attr_t const *attr_bfd_packet;
+fr_dict_attr_t const *attr_bfd_additional_data;
 
 extern fr_dict_attr_autoload_t libfreeradius_bfd_dict_attr[];
 fr_dict_attr_autoload_t libfreeradius_bfd_dict_attr[] = {
        { .out = &attr_packet_type, .name = "Packet-Type", .type = FR_TYPE_UINT32, .dict = &dict_bfd },
        { .out = &attr_bfd_packet, .name = "Packet", .type = FR_TYPE_STRUCT, .dict = &dict_bfd },
+       { .out = &attr_bfd_additional_data, .name = "Additional-Data", .type = FR_TYPE_GROUP, .dict = &dict_bfd },
 
        { NULL }
 };
index 6d904f8e5d2e759dddc66541930a62d46f110bc3..44a26e5330cabd82544c3f924c8de91c1db043d6 100644 (file)
@@ -26,7 +26,7 @@ RCSID("$Id$")
 
 #include <freeradius-devel/util/struct.h>
 #include <freeradius-devel/io/test_point.h>
-#include <freeradius-devel/protocol/radius/freeradius.internal.h>
+#include <freeradius-devel/internal/internal.h>
 
 #include "attrs.h"
 
@@ -67,13 +67,35 @@ ssize_t fr_bfd_decode(TALLOC_CTX *ctx, fr_pair_list_t *out,
 {
        ssize_t                 slen;
        fr_bfd_ctx_t            packet_ctx;
+       bfd_packet_t const      *bfd;
+       fr_pair_t               *vp;
+       fr_dbuff_t              dbuff;
 
        packet_ctx.secret = secret;
 
-       slen = fr_struct_from_network(ctx, out, attr_bfd_packet, packet, packet_len, true,
+       bfd = (bfd_packet_t const *) packet;
+
+       slen = fr_struct_from_network(ctx, out, attr_bfd_packet, packet, bfd->length, true,
                                      &packet_ctx, decode_value, NULL);
        if (slen < 0) return slen;
 
+       if (bfd->length == packet_len) return packet_len;
+
+       /*
+        *      Try to decode additional data.
+        */
+       vp = fr_pair_afrom_da(ctx, attr_bfd_additional_data);
+       if (!vp) return packet_len;
+
+       fr_dbuff_init(&dbuff, packet + slen, packet_len - slen);
+
+       if ((fr_internal_decode_list_dbuff(vp, &vp->vp_group, fr_dict_root(dict_bfd), &dbuff, NULL) < 0) ||
+           (fr_pair_list_num_elements(&vp->vp_group) == 0)) {
+               TALLOC_FREE(vp);
+       } else {
+               fr_pair_append(out, vp);
+       }
+
        return slen;
 }
 
index 44589f673746f2efcfda87c5004a37dd0dd9c3f3..5494d908c3d4b397d9a0007ee4304117c7b48116 100644 (file)
 RCSID("$Id$")
 
 #include <freeradius-devel/util/dbuff.h>
-#include <freeradius-devel/util/md5.h>
 #include <freeradius-devel/util/struct.h>
 #include <freeradius-devel/io/test_point.h>
+#include <freeradius-devel/internal/internal.h>
+
 #include "attrs.h"
 
 /** Encodes the data portion of an attribute
@@ -186,7 +187,9 @@ static int encode_test_ctx(void **out, TALLOC_CTX *ctx)
 static ssize_t fr_bfd_encode_proto(UNUSED TALLOC_CTX *ctx, fr_pair_list_t *vps, uint8_t *data, size_t data_len, void *proto_ctx)
 {
        fr_bfd_ctx_t    *test_ctx = talloc_get_type_abort(proto_ctx, fr_bfd_ctx_t);
-       ssize_t         slen;
+       ssize_t         slen, alen;
+       fr_pair_t       *vp;
+       fr_dbuff_t      dbuff;
 
        /*
         *      @todo - pass in test_ctx to this function, so that we
@@ -195,7 +198,14 @@ static ssize_t fr_bfd_encode_proto(UNUSED TALLOC_CTX *ctx, fr_pair_list_t *vps,
        slen = fr_bfd_encode(data, data_len, NULL, test_ctx->secret, talloc_array_length(test_ctx->secret) - 1, vps);
        if (slen <= 0) return slen;
 
-       return slen;
+       vp = fr_pair_find_by_da(vps, NULL, attr_bfd_additional_data);
+       if (!vp) return slen;
+
+       fr_dbuff_init(&dbuff, data + slen, data_len - slen);
+       alen =  fr_internal_encode_list(&dbuff, &vp->vp_group, NULL);
+       if (alen <= 0) return slen;
+
+       return slen + alen;
 }
 
 /*
index ce015719024bd41e0b04059fc316ef18bb39addf..2e17177f49d1c482623f1d3bff720936dea86f3a 100644 (file)
@@ -15,5 +15,17 @@ match 20 c0 03 18 de ad be ef 21 12 68 09 00 00 00 1f 00 00 00 7f 00 00 00 ff
 decode-proto -
 match Packet-Type = Up, Packet = { version = 1, diagnostic = none, state = up, poll = no, final = no, control-plane-independent = no, auth-present = no, demand = no, multipoint = no, detect-multi = 3, length = 24, my-discriminator = 3735928559, your-discriminator = 554854409, desired-min-tx-interval = 31, required-min-tx-interval = 127, required-min-echo-interval = 255 }
 
+
+#
+#  And with additional data.
+#
+#  The BFD packet is exactly the same, but we also have a 3 octet string "foo", which is encoded via the internal dictionary, after the packet.
+#
+encode-proto Packet = { version = 1, diagnostic = none, state = up, poll = false, final = false, control-plane-independent = false, auth-present = false, demand = false, multipoint = false, detect-multi = 3, my-discriminator = 0xdeadbeef, your-discriminator = 0x21126809, desired-min-tx-interval = 31us, required-min-tx-interval = 127us, required-min-echo-interval   = 255us }, Additional-Data = { Tmp-String-0 = "foo" }
+match 20 c0 03 18 de ad be ef 21 12 68 09 00 00 00 1f 00 00 00 7f 00 00 00 ff 21 40 06 ae 03 66 6f 6f
+
+decode-proto -
+match Packet-Type = Up, Packet = { version = 1, diagnostic = none, state = up, poll = no, final = no, control-plane-independent = no, auth-present = no, demand = no, multipoint = no, detect-multi = 3, length = 24, my-discriminator = 3735928559, your-discriminator = 554854409, desired-min-tx-interval = 31, required-min-tx-interval = 127, required-min-echo-interval = 255 }, Additional-Data = { Tmp-String-0 = "foo" }
+
 count
-match 7
+match 11