Skip to content

Commit fa966d7

Browse files
vasantspatilmeta-codesync[bot]
authored andcommitted
SwitchState: MySid FRR backup next-hop-set fields
Summary: SwitchState schema for SRv6 midpoint FRR. Add to `MySidFields` and expose via `MySid` accessors: - `backupResolvedNextHopsId`: the resolved backup (standby) next-hop set id. - `backupUnresolveNextHopsId`: the requested (unresolved) backup set id set by the addAdjacencyFrr thrift API; the RIB resolves it into `backupResolvedNextHopsId`, symmetric to `unresolveNextHopsId` -> `resolvedNextHopsId` for the primary. - `monitoredAggPortId`: the LAG the HW protection group monitors for failover. Additive schema change, no behavior. Regenerated `fsdb_model_thriftpath.h` (generated). Unit test: `MySidTest.BackupAndMonitoredAggAccessors` round-trips the new backup/monitored accessors (set / get / reset). Foundation of the SRv6 midpoint FRR stack (diffs 1/8..8/8); additive and dormant until the SAI / RIB / thrift / observer diffs above it are in effect. Reviewed By: jasmeetbagga Differential Revision: D110984229 fbshipit-source-id: e39e1e1cdb0e28862d70433036de0780793a5928
1 parent 64cceb4 commit fa966d7

4 files changed

Lines changed: 67 additions & 0 deletions

File tree

fboss/agent/state/MySid.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,38 @@ class MySid : public ThriftStructNode<MySid, state::MySidFields> {
128128
}
129129
}
130130

131+
std::optional<NextHopSetID> getBackupResolvedNextHopsId() const {
132+
if (auto id = safe_cref<switch_state_tags::backupResolvedNextHopsId>()) {
133+
return NextHopSetID(id->cref());
134+
}
135+
return std::nullopt;
136+
}
137+
138+
void setBackupResolvedNextHopsId(std::optional<NextHopSetID> id) {
139+
if (id) {
140+
set<switch_state_tags::backupResolvedNextHopsId>(
141+
static_cast<int64_t>(*id));
142+
} else {
143+
ref<switch_state_tags::backupResolvedNextHopsId>().reset();
144+
}
145+
}
146+
147+
std::optional<NextHopSetID> getBackupUnresolveNextHopsId() const {
148+
if (auto id = safe_cref<switch_state_tags::backupUnresolveNextHopsId>()) {
149+
return NextHopSetID(id->cref());
150+
}
151+
return std::nullopt;
152+
}
153+
154+
void setBackupUnresolveNextHopsId(std::optional<NextHopSetID> id) {
155+
if (id) {
156+
set<switch_state_tags::backupUnresolveNextHopsId>(
157+
static_cast<int64_t>(*id));
158+
} else {
159+
ref<switch_state_tags::backupUnresolveNextHopsId>().reset();
160+
}
161+
}
162+
131163
private:
132164
// Inherit the constructors required for clone()
133165
using Base::Base;

fboss/agent/state/tests/MySidTests.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,3 +363,26 @@ TEST(MySidDeltaTest, MixedAddRemoveChange) {
363363
EXPECT_EQ(removed, (std::set<std::string>{"fc00:100::1/48"}));
364364
EXPECT_EQ(changed, (std::set<std::string>{"fc00:200::1/64"}));
365365
}
366+
367+
// SRv6 midpoint FRR: the backup next-hop-set ids are optional and must
368+
// round-trip through the MySid node accessors.
369+
TEST(MySidTest, BackupAccessors) {
370+
auto mySid = makeMySid();
371+
// Unset by default.
372+
EXPECT_FALSE(mySid->getBackupResolvedNextHopsId().has_value());
373+
EXPECT_FALSE(mySid->getBackupUnresolveNextHopsId().has_value());
374+
375+
// Set and read back.
376+
mySid->setBackupUnresolveNextHopsId(NextHopSetID(1234));
377+
mySid->setBackupResolvedNextHopsId(NextHopSetID(5678));
378+
ASSERT_TRUE(mySid->getBackupUnresolveNextHopsId().has_value());
379+
EXPECT_EQ(*mySid->getBackupUnresolveNextHopsId(), NextHopSetID(1234));
380+
ASSERT_TRUE(mySid->getBackupResolvedNextHopsId().has_value());
381+
EXPECT_EQ(*mySid->getBackupResolvedNextHopsId(), NextHopSetID(5678));
382+
383+
// Reset back to unset.
384+
mySid->setBackupUnresolveNextHopsId(std::nullopt);
385+
mySid->setBackupResolvedNextHopsId(std::nullopt);
386+
EXPECT_FALSE(mySid->getBackupUnresolveNextHopsId().has_value());
387+
EXPECT_FALSE(mySid->getBackupResolvedNextHopsId().has_value());
388+
}

fboss/agent/switch_state.thrift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,16 @@ struct MySidFields {
689689
7: optional bool isV6;
690690
# Optional named next hop group for the MySid entry.
691691
8: optional string namedNextHopGroup;
692+
# SRv6 midpoint FRR: when set, this MySid entry is programmed as a hardware
693+
# protection group. resolvedNextHopsId (field 4) is the PRIMARY path; this is
694+
# the resolved BACKUP (standby) next hop set id (typically an ECMP of
695+
# SRv6-encap next hops that impose a repair SID).
696+
9: optional i64 backupResolvedNextHopsId;
697+
# SRv6 midpoint FRR: the requested (unresolved) BACKUP next hop set id, set by
698+
# the addAdjacencyFrr thrift API. RibMySidUpdater resolves it into
699+
# backupResolvedNextHopsId (field 9), symmetric to unresolveNextHopsId
700+
# (field 3) -> resolvedNextHopsId (field 4).
701+
12: optional i64 backupUnresolveNextHopsId;
692702
}
693703

694704
struct QosPolicyFields {

fboss/fsdb/if/oss/fsdb_model_thriftpath.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7589,6 +7589,8 @@ class ChildThriftPath<::facebook::fboss::state::MySidFields, ::facebook::fboss::
75897589
STRUCT_CHILD_GETTERS(clientId, 6);
75907590
STRUCT_CHILD_GETTERS(isV6, 7);
75917591
STRUCT_CHILD_GETTERS(namedNextHopGroup, 8);
7592+
STRUCT_CHILD_GETTERS(backupResolvedNextHopsId, 9);
7593+
STRUCT_CHILD_GETTERS(backupUnresolveNextHopsId, 12);
75927594
};
75937595

75947596

0 commit comments

Comments
 (0)