From: Francis Dupont Date: Fri, 22 Aug 2025 17:53:21 +0000 (+0200) Subject: [#3860] Last checkpoint before vendor VALUE X-Git-Tag: Kea-3.1.2~40 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=da6551d84d40dd0de0511abdd0631e5803eb4552;p=thirdparty%2Fkea.git [#3860] Last checkpoint before vendor VALUE --- diff --git a/src/hooks/dhcp/radius/cfg_attribute.cc b/src/hooks/dhcp/radius/cfg_attribute.cc index 54bd2c814d..4b80258fa5 100644 --- a/src/hooks/dhcp/radius/cfg_attribute.cc +++ b/src/hooks/dhcp/radius/cfg_attribute.cc @@ -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(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); } diff --git a/src/hooks/dhcp/radius/tests/config_unittests.cc b/src/hooks/dhcp/radius/tests/config_unittests.cc index 1a9f85943c..ea03e69795 100644 --- a/src/hooks/dhcp/radius/tests/config_unittests.cc +++ b/src/hooks/dhcp/radius/tests/config_unittests.cc @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -954,6 +955,28 @@ TEST_F(ConfigTest, attribute) { " \"raw\": \"660102626172\" } ]"; runToElementTest(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(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(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(token); + EXPECT_TRUE(tokstr); + EXPECT_EQ("'foobar'", srv->attributes_.getTest(1, 3561)); + expected = "[ { " + " \"name\": \"Agent-Circuit-Id\", " + " \"type\": 1, " + " \"vendor\": \"3561\", " + " \"expr\": \"'foobar'\" } ]"; + runToElementTest(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(expected, evaluated); } // Verify checkAttributes sanity check.