Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions cmake/CliFboss2.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -795,6 +795,12 @@ add_library(fboss2_config_lib
fboss/cli/fboss2/commands/config/arp/CmdConfigArp.h
fboss/cli/fboss2/commands/config/copp/CmdConfigCopp.cpp
fboss/cli/fboss2/commands/config/copp/CmdConfigCopp.h
fboss/cli/fboss2/commands/config/dhcp/CmdConfigDhcp.cpp
fboss/cli/fboss2/commands/config/dhcp/CmdConfigDhcp.h
fboss/cli/fboss2/commands/config/dhcp/relay_source_override/CmdConfigDhcpRelaySourceOverride.cpp
fboss/cli/fboss2/commands/config/dhcp/relay_source_override/CmdConfigDhcpRelaySourceOverride.h
fboss/cli/fboss2/commands/config/dhcp/reply_source_override/CmdConfigDhcpReplySourceOverride.cpp
fboss/cli/fboss2/commands/config/dhcp/reply_source_override/CmdConfigDhcpReplySourceOverride.h
fboss/cli/fboss2/commands/config/interface/CmdConfigInterface.cpp
fboss/cli/fboss2/commands/config/interface/CmdConfigInterface.h
fboss/cli/fboss2/commands/config/interface/InterfaceAttrArgsBase.h
Expand Down
1 change: 1 addition & 0 deletions cmake/CliFboss2TestConfig.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ add_executable(fboss2_cmd_config_test
fboss/cli/fboss2/test/config/CmdConfigAppliedInfoTest.cpp
fboss/cli/fboss2/test/config/CmdConfigArpTest.cpp
fboss/cli/fboss2/test/config/CmdConfigCoppTest.cpp
fboss/cli/fboss2/test/config/CmdConfigDhcpTest.cpp
fboss/cli/fboss2/test/config/CmdConfigHistoryTest.cpp
fboss/cli/fboss2/test/config/CmdConfigInterfaceIpv6NdpTest.cpp
fboss/cli/fboss2/test/config/CmdConfigInterfaceSwitchportAccessVlanTest.cpp
Expand Down
1 change: 1 addition & 0 deletions cmake/CliFboss2TestIntegrationTest.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ add_executable(fboss2_integration_test
fboss/cli/fboss2/test/integration_test/ConfigArpTest.cpp
fboss/cli/fboss2/test/integration_test/ConfigConcurrentSessionsTest.cpp
fboss/cli/fboss2/test/integration_test/ConfigCoppTest.cpp
fboss/cli/fboss2/test/integration_test/ConfigDhcpSourceOverrideTest.cpp
fboss/cli/fboss2/test/integration_test/ConfigInterfaceDescriptionTest.cpp
fboss/cli/fboss2/test/integration_test/ConfigInterfaceIpv6NdpTest.cpp
fboss/cli/fboss2/test/integration_test/DeleteInterfaceTest.cpp
Expand Down
6 changes: 6 additions & 0 deletions fboss/cli/fboss2/BUCK
Original file line number Diff line number Diff line change
Expand Up @@ -1037,6 +1037,9 @@ cpp_library(
"commands/config/CmdConfigReload.cpp",
"commands/config/arp/CmdConfigArp.cpp",
"commands/config/copp/CmdConfigCopp.cpp",
"commands/config/dhcp/CmdConfigDhcp.cpp",
"commands/config/dhcp/relay_source_override/CmdConfigDhcpRelaySourceOverride.cpp",
"commands/config/dhcp/reply_source_override/CmdConfigDhcpReplySourceOverride.cpp",
"commands/config/history/CmdConfigHistory.cpp",
"commands/config/interface/CmdConfigInterface.cpp",
"commands/config/interface/CmdConfigInterfaceQueuingPolicy.cpp",
Expand Down Expand Up @@ -1158,6 +1161,9 @@ cpp_library(
"commands/config/CmdConfigReload.h",
"commands/config/arp/CmdConfigArp.h",
"commands/config/copp/CmdConfigCopp.h",
"commands/config/dhcp/CmdConfigDhcp.h",
"commands/config/dhcp/relay_source_override/CmdConfigDhcpRelaySourceOverride.h",
"commands/config/dhcp/reply_source_override/CmdConfigDhcpReplySourceOverride.h",
"commands/config/history/CmdConfigHistory.h",
"commands/config/interface/CmdConfigInterface.h",
"commands/config/interface/CmdConfigInterfaceQueuingPolicy.h",
Expand Down
23 changes: 23 additions & 0 deletions fboss/cli/fboss2/CmdListConfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
#include "fboss/cli/fboss2/commands/config/CmdConfigReload.h"
#include "fboss/cli/fboss2/commands/config/arp/CmdConfigArp.h"
#include "fboss/cli/fboss2/commands/config/copp/CmdConfigCopp.h"
#include "fboss/cli/fboss2/commands/config/dhcp/CmdConfigDhcp.h"
#include "fboss/cli/fboss2/commands/config/dhcp/relay_source_override/CmdConfigDhcpRelaySourceOverride.h"
#include "fboss/cli/fboss2/commands/config/dhcp/reply_source_override/CmdConfigDhcpReplySourceOverride.h"
#include "fboss/cli/fboss2/commands/config/history/CmdConfigHistory.h"
#include "fboss/cli/fboss2/commands/config/interface/CmdConfigInterface.h"
#include "fboss/cli/fboss2/commands/config/interface/CmdConfigInterfaceQueuingPolicy.h"
Expand Down Expand Up @@ -158,6 +161,26 @@ const CommandTree& kConfigCommandTree() {
commandHandler<CmdConfigArp>,
argRegistrar<CmdConfigArpTraits>},

{
"config",
"dhcp",
"Configure DHCP settings",
commandHandler<CmdConfigDhcp>,
argRegistrar<CmdConfigDhcpTraits>,
{{
"relay-source-override",
"Override source IP for DHCP relay packets to the DHCP server (ipv4|ipv6 <IP>)",
commandHandler<CmdConfigDhcpRelaySourceOverride>,
argRegistrar<CmdConfigDhcpRelaySourceOverrideTraits>,
},
{
"reply-source-override",
"Override source IP for DHCP reply packets to the client (ipv4|ipv6 <IP>)",
commandHandler<CmdConfigDhcpReplySourceOverride>,
argRegistrar<CmdConfigDhcpReplySourceOverrideTraits>,
}},
},

{"config",
"history",
"Show history of committed config revisions",
Expand Down
86 changes: 86 additions & 0 deletions fboss/cli/fboss2/commands/config/dhcp/CmdConfigDhcp.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/*
* Copyright (c) 2004-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/

#include "fboss/cli/fboss2/commands/config/dhcp/CmdConfigDhcp.h"

#include "fboss/cli/fboss2/CmdHandler.cpp"

#include <fmt/format.h>
#include <folly/IPAddressV4.h>
#include <folly/IPAddressV6.h>
#include <folly/String.h>
#include <stdexcept>
#include <utility>
#include "fboss/agent/gen-cpp2/switch_config_types.h"

namespace facebook::fboss {

DhcpSourceOverrideArgs::DhcpSourceOverrideArgs(std::vector<std::string> v) {
if (v.size() != 2) {
throw std::invalid_argument(
fmt::format(
"Expected <family> <ip>, got {} argument(s). "
"Valid families: {}, {}",
v.size(),
kFamilyIpv4,
kFamilyIpv6));
}

// Normalise so "IPv4" / "IPV4" are accepted alongside the canonical "ipv4".
folly::toLowerAscii(v[0]);

if (v[0] == kFamilyIpv4) {
auto maybeV4 = folly::IPAddressV4::tryFromString(v[1]);
if (maybeV4.hasError()) {
throw std::invalid_argument(
fmt::format("Invalid IPv4 address '{}' for {}", v[1], kFamilyIpv4));
}
} else if (v[0] == kFamilyIpv6) {
auto maybeV6 = folly::IPAddressV6::tryFromString(v[1]);
if (maybeV6.hasError()) {
throw std::invalid_argument(
fmt::format("Invalid IPv6 address '{}' for {}", v[1], kFamilyIpv6));
}
} else {
throw std::invalid_argument(
fmt::format(
"Unknown family '{}'. Valid families: {}, {}",
v[0],
kFamilyIpv4,
kFamilyIpv6));
}

family_ = v[0];
ipAddress_ = v[1];
data_ = std::move(v);
}

std::string applyDhcpSourceOverride(
cfg::SwitchConfig& swConfig,
std::string_view kind,
const std::string& family,
const std::string& ipAddress) {
const bool isIpv4 = family == DhcpSourceOverrideArgs::kFamilyIpv4;
const bool isRelay = kind == "relay";
if (isRelay) {
(isIpv4 ? swConfig.dhcpRelaySrcOverrideV4()
: swConfig.dhcpRelaySrcOverrideV6()) = ipAddress;
} else {
(isIpv4 ? swConfig.dhcpReplySrcOverrideV4()
: swConfig.dhcpReplySrcOverrideV6()) = ipAddress;
}
return fmt::format(
"Set dhcp {}-source-override {} to {}", kind, family, ipAddress);
}

// Explicit template instantiation
template void CmdHandler<CmdConfigDhcp, CmdConfigDhcpTraits>::run();

} // namespace facebook::fboss
77 changes: 77 additions & 0 deletions fboss/cli/fboss2/commands/config/dhcp/CmdConfigDhcp.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
/*
* Copyright (c) 2004-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/

#pragma once

#include <string>
#include <string_view>
#include <vector>
#include "fboss/cli/fboss2/CmdHandler.h"
#include "fboss/cli/fboss2/utils/CmdUtilsCommon.h"

namespace facebook::fboss::cfg {
class SwitchConfig;
} // namespace facebook::fboss::cfg

namespace facebook::fboss {

// Shared argument type for `config dhcp {relay,reply}-source-override <family>
// <ip>`. Validates family ∈ {"ipv4","ipv6"} and the IP via
// folly::IPAddressV{4,6}::tryFromString.
class DhcpSourceOverrideArgs : public utils::BaseObjectArgType<std::string> {
public:
/* implicit */ DhcpSourceOverrideArgs( // NOLINT(google-explicit-constructor)
std::vector<std::string> v);

const std::string& getFamily() const {
return family_;
}

const std::string& getIpAddress() const {
return ipAddress_;
}

static constexpr std::string_view kFamilyIpv4 = "ipv4";
static constexpr std::string_view kFamilyIpv6 = "ipv6";

private:
std::string family_;
std::string ipAddress_;
};

// Mutates swConfig for the given (kind, family, ip) triple and returns the
// human-readable result string. kind must be "relay" or "reply";
// family must already be normalised by DhcpSourceOverrideArgs.
std::string applyDhcpSourceOverride(
cfg::SwitchConfig& swConfig,
std::string_view kind,
const std::string& family,
const std::string& ipAddress);

struct CmdConfigDhcpTraits : public WriteCommandTraits {
using ObjectArgType = utils::NoneArgType;
using RetType = std::string;
};

class CmdConfigDhcp : public CmdHandler<CmdConfigDhcp, CmdConfigDhcpTraits> {
public:
using ObjectArgType = CmdConfigDhcpTraits::ObjectArgType;
using RetType = CmdConfigDhcpTraits::RetType;

RetType queryClient(const HostInfo& /* hostInfo */) {
throw std::runtime_error(
"Incomplete command, please use 'relay-source-override' or "
"'reply-source-override' subcommand");
}

void printOutput(const RetType& /* model */) {}
};

} // namespace facebook::fboss
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*
* Copyright (c) 2004-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/

#include "fboss/cli/fboss2/commands/config/dhcp/relay_source_override/CmdConfigDhcpRelaySourceOverride.h"

#include "fboss/cli/fboss2/CmdHandler.cpp"

#include <iostream>
#include "fboss/cli/fboss2/gen-cpp2/cli_metadata_types.h"
#include "fboss/cli/fboss2/session/ConfigSession.h"
#include "fboss/cli/fboss2/utils/HostInfo.h"

namespace facebook::fboss {

CmdConfigDhcpRelaySourceOverrideTraits::RetType
CmdConfigDhcpRelaySourceOverride::queryClient(
const HostInfo& /* hostInfo */,
const ObjectArgType& args) {
auto& session = ConfigSession::getInstance();
auto msg = applyDhcpSourceOverride(
*session.getAgentConfig().sw(),
"relay",
args.getFamily(),
args.getIpAddress());
// Both V4 and V6 relay/reply source overrides are applied hitlessly by
// ThriftConfigApplier::updateSwitchSettings via plain
// SwitchSettings::setDhcpV{4,6}{Relay,Reply}Src setters
// (no SAI ChangeProhibited guard).
session.saveConfig(cli::ServiceType::AGENT, cli::ConfigActionLevel::HITLESS);
return msg;
}

void CmdConfigDhcpRelaySourceOverride::printOutput(const RetType& logMsg) {
std::cout << logMsg << std::endl;
}

// Explicit template instantiation
template void CmdHandler<
CmdConfigDhcpRelaySourceOverride,
CmdConfigDhcpRelaySourceOverrideTraits>::run();

} // namespace facebook::fboss
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/*
* Copyright (c) 2004-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/

#pragma once

#include "fboss/cli/fboss2/CmdHandler.h"
#include "fboss/cli/fboss2/commands/config/dhcp/CmdConfigDhcp.h"
#include "fboss/cli/fboss2/utils/HostInfo.h"

namespace facebook::fboss {

struct CmdConfigDhcpRelaySourceOverrideTraits : public WriteCommandTraits {
using ParentCmd = CmdConfigDhcp;
static void addCliArg(CLI::App& cmd, std::vector<std::string>& args) {
// `expected(2)` prevents CLI11 from treating the second token as a
// subcommand name rather than an argument to this positional.
cmd.add_option(
"family_ip",
args,
"<family> <ip> where <family> is one of: ipv4, ipv6")
->required()
->expected(2);
}
using ObjectArgType = DhcpSourceOverrideArgs;
using RetType = std::string;
};

class CmdConfigDhcpRelaySourceOverride
: public CmdHandler<
CmdConfigDhcpRelaySourceOverride,
CmdConfigDhcpRelaySourceOverrideTraits> {
public:
using ObjectArgType = CmdConfigDhcpRelaySourceOverrideTraits::ObjectArgType;
using RetType = CmdConfigDhcpRelaySourceOverrideTraits::RetType;

RetType queryClient(const HostInfo& hostInfo, const ObjectArgType& args);

void printOutput(const RetType& logMsg);
};

} // namespace facebook::fboss
Loading
Loading