]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#3860] Last checkpoint before vendor VALUE
authorFrancis Dupont <fdupont@isc.org>
Fri, 22 Aug 2025 17:53:21 +0000 (19:53 +0200)
committerFrancis Dupont <fdupont@isc.org>
Fri, 12 Sep 2025 21:44:54 +0000 (23:44 +0200)
src/hooks/dhcp/radius/cfg_attribute.cc
src/hooks/dhcp/radius/tests/config_unittests.cc

index 54bd2c814dbf66aa11400c9b245cbc0ee6ab3496..4b80258fa584cf004cc53f63414ee2f944552fea 100644 (file)
@@ -121,13 +121,18 @@ CfgAttributes::toElement() const {
             continue;
         }
         ElementPtr map;
-        if (!it.test_.empty()) {
+        if (it.attr_) {
+            map = it.attr_->toElement();
+        } else if (!it.test_.empty()) {
             map = Element::createMap();
             map->set("type", Element::create(static_cast<int>(def->type_)));
             map->set("expr", Element::create(it.test_));
             map->set("name", Element::create(def->name_));
-        } else if (it.attr_) {
-            map = it.attr_->toElement();
+            if (def->vendor_ != 0) {
+                ostringstream vendor;
+                vendor << def->vendor_;
+                map->set("vendor", Element::create(vendor.str()));
+            }
         }
         result->add(map);
     }
index 1a9f85943c159812a220c50174e63e552083c30e..ea03e69795da932f71c5125091c55dad2b209bda 100644 (file)
@@ -14,6 +14,7 @@
 
 #include <radius_parsers.h>
 #include <cc/default_credentials.h>
+#include <dhcp/pkt4.h>
 #include <dhcpsrv/cfgmgr.h>
 #include <database/database_connection.h>
 #include <dhcpsrv/host_data_source_factory.h>
@@ -954,6 +955,28 @@ TEST_F(ConfigTest, attribute) {
         " \"raw\": \"660102626172\" } ]";
     runToElementTest<CfgAttributes>(expected, srv->attributes_);
 
+    // Try the raw version of DSL-Forum (3561) Agent-Circuit-Id (1).
+    srv->attributes_.clear();
+    attr = Element::createMap();
+    attr->set("vendor", Element::create("DSL-Forum"));
+    attr->set("raw", Element::create("660102626172"));
+    attr->set("type", Element::create(1));
+    EXPECT_NO_THROW(parser.parse(srv, attr));
+    EXPECT_FALSE(srv->attributes_.empty());
+    EXPECT_EQ(1, srv->attributes_.size());
+    EXPECT_TRUE(srv->attributes_.getDef(1, 3561));
+    EXPECT_FALSE(srv->attributes_.getExpr(1, 3561));
+    EXPECT_EQ("", srv->attributes_.getTest(1, 3561));
+    got = srv->attributes_.get(1, 3561);
+    ASSERT_TRUE(got);
+    EXPECT_EQ("Vendor-Specific=[3561]0x0108660102626172", got->toText());
+    expected = "[ { "
+        " \"name\": \"Vendor-Specific\", "
+        " \"type\": 26, "
+        " \"vendor\": \"3561\", "
+        " \"vsa-raw\": \"0108660102626172\" } ]";
+    runToElementTest<CfgAttributes>(expected, srv->attributes_);
+
     // Check with expr.
     srv->attributes_.clear();
     attr = Element::createMap();
@@ -979,7 +1002,7 @@ TEST_F(ConfigTest, attribute) {
     EXPECT_NO_THROW(parser.parse(srv, attr));
     EXPECT_EQ(1, srv->attributes_.size());
     EXPECT_TRUE(srv->attributes_.getAll().empty());
-    const ExpressionPtr& expr = srv->attributes_.getExpr(1);
+    ExpressionPtr expr = srv->attributes_.getExpr(1);
     ASSERT_TRUE(expr);
     ASSERT_EQ(1, expr->size());
     TokenPtr token = (*expr)[0];
@@ -994,6 +1017,43 @@ TEST_F(ConfigTest, attribute) {
         " \"type\": 1, "
         " \"expr\": \"'foobar'\" } ]";
     runToElementTest<CfgAttributes>(expected, srv->attributes_);
+
+    // Try with vendor.
+    srv->attributes_.clear();
+    attr = Element::createMap();
+    attr->set("vendor", Element::create("3561"));
+    attr->set("type", Element::create(1));
+    attr->set("expr", Element::create("'foobar'"));
+    EXPECT_NO_THROW(parser.parse(srv, attr));
+    EXPECT_EQ(1, srv->attributes_.size());
+    EXPECT_TRUE(srv->attributes_.getDef(1, 3561));
+    EXPECT_FALSE(srv->attributes_.get(1, 3561));
+    EXPECT_TRUE(srv->attributes_.getAll().empty());
+    expr = srv->attributes_.getExpr(1, 3561);
+    ASSERT_TRUE(expr);
+    ASSERT_EQ(1, expr->size());
+    token = (*expr)[0];
+    tokstr = boost::dynamic_pointer_cast<TokenString>(token);
+    EXPECT_TRUE(tokstr);
+    EXPECT_EQ("'foobar'", srv->attributes_.getTest(1, 3561));
+    expected = "[ { "
+      " \"name\": \"Agent-Circuit-Id\", "
+      " \"type\": 1, "
+      " \"vendor\": \"3561\", "
+      " \"expr\": \"'foobar'\" } ]";
+    runToElementTest<CfgAttributes>(expected, srv->attributes_);
+
+    // Evaluate.
+    Pkt4Ptr query(new Pkt4(DHCPDISCOVER, 12345));
+    Attributes evaluated;
+    EXPECT_NO_THROW_LOG(evaluated = srv->attributes_.getEvalAll(*query));
+    EXPECT_EQ(1, evaluated.size());
+    expected = "[ { "
+        " \"name\": \"Vendor-Specific\", "
+        " \"type\": 26, "
+        " \"vendor\": \"3561\", "
+        " \"vsa-raw\": \"0108666F6F626172\" } ]";
+    runToElementTest<Attributes>(expected, evaluated);
 }
 
 // Verify checkAttributes sanity check.