summaryrefslogtreecommitdiffhomepage
path: root/table/policy.go
diff options
context:
space:
mode:
Diffstat (limited to 'table/policy.go')
-rw-r--r--table/policy.go50
1 files changed, 50 insertions, 0 deletions
diff --git a/table/policy.go b/table/policy.go
index acec2980..513e93fe 100644
--- a/table/policy.go
+++ b/table/policy.go
@@ -173,6 +173,7 @@ const (
ACTION_EXT_COMMUNITY
ACTION_MED
ACTION_AS_PATH_PREPEND
+ ACTION_NEXTHOP
)
func NewMatchOption(c interface{}) (MatchOption, error) {
@@ -2071,6 +2072,47 @@ func NewAsPathPrependAction(action config.SetAsPathPrepend) (*AsPathPrependActio
return a, nil
}
+type NexthopAction struct {
+ value net.IP
+}
+
+func (a *NexthopAction) Type() ActionType {
+ return ACTION_NEXTHOP
+}
+
+func (a *NexthopAction) Apply(path *Path) *Path {
+ path.SetNexthop(a.value)
+ return path
+}
+
+func (a *NexthopAction) ToApiStruct() *api.NexthopAction {
+ return &api.NexthopAction{
+ Address: a.value.String(),
+ }
+}
+
+func NewNexthopActionFromApiStruct(a *api.NexthopAction) (*NexthopAction, error) {
+ if a == nil {
+ return nil, nil
+ }
+ return &NexthopAction{
+ value: net.ParseIP(a.Address),
+ }, nil
+}
+
+func NewNexthopAction(c config.BgpNextHopType) (*NexthopAction, error) {
+ if string(c) == "" {
+ return nil, nil
+ }
+ addr := net.ParseIP(string(c))
+ if addr == nil {
+ return nil, fmt.Errorf("invalid ip address format: %s", string(c))
+ }
+ return &NexthopAction{
+ value: addr,
+ }, nil
+}
+
type Statement struct {
Name string
Conditions []Condition
@@ -2150,6 +2192,8 @@ func (s *Statement) ToApiStruct() *api.Statement {
as.AsPrepend = a.(*AsPathPrependAction).ToApiStruct()
case *ExtCommunityAction:
as.ExtCommunity = a.(*ExtCommunityAction).ToApiStruct()
+ case *NexthopAction:
+ as.Nexthop = a.(*NexthopAction).ToApiStruct()
}
}
return &api.Statement{
@@ -2339,6 +2383,9 @@ func NewStatementFromApiStruct(a *api.Statement, dmap DefinedSetMap) (*Statement
func() (Action, error) {
return NewAsPathPrependActionFromApiStruct(a.Actions.AsPrepend)
},
+ func() (Action, error) {
+ return NewNexthopActionFromApiStruct(a.Actions.Nexthop)
+ },
}
as = make([]Action, 0, len(afs))
for _, f := range afs {
@@ -2417,6 +2464,9 @@ func NewStatement(c config.Statement, dmap DefinedSetMap) (*Statement, error) {
func() (Action, error) {
return NewAsPathPrependAction(c.Actions.BgpActions.SetAsPathPrepend)
},
+ func() (Action, error) {
+ return NewNexthopAction(c.Actions.BgpActions.SetNextHop)
+ },
}
as = make([]Action, 0, len(afs))
for _, f := range afs {