Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Wip #47

Merged
merged 2 commits into from
Jun 21, 2024
Merged

Wip #47

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
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ NextMN | End.M.GTP4.E | yes | send ICMP when errors
NextMN | H.M.GTP4.D | yes | send ICMP when errors, optional: respond to GTP Echo Req
NextMN | End.Limit | no | -
NextMN | [End.M.GTP6.E.Red](https://datatracker.ietf.org/doc/draft-kawakami-dmm-srv6-gtp6e-reduced/) | no | requires a map of gnbs addr; [order of bit field considerations](https://datatracker.ietf.org/meeting/118/materials/slides-118-dmm-draft-kawakami-dmm-srv6-gtp6e-reduced-01)
NextMNWithCtrl | H.M.GTP4.D | todo | |
NextMNWithCtrl | H.Encaps | todo | |
Linux | End | yes | -
Linux | End.DX4 | yes | -
Linux | H.Encaps | yes | -
Expand Down
2 changes: 1 addition & 1 deletion config/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ controller-uri: "http://192.0.2.2:8080"
backbone-ip: "fd00::01"

linux-headend-set-source-address: "fd00:51D5:0000::"
ipv4-headend-prefix: "10.0.200.3/32"
gtp4-headend-prefix: "10.0.200.3/32"
headends:
- name: "gtp4 to sr"
to: "10.0.200.3/32"
Expand Down
179 changes: 155 additions & 24 deletions internal/app/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
app_api "github.com/nextmn/srv6/internal/app/api"
"github.com/nextmn/srv6/internal/config"
"github.com/nextmn/srv6/internal/constants"
"github.com/nextmn/srv6/internal/ctrl"
tasks "github.com/nextmn/srv6/internal/tasks"
tasks_api "github.com/nextmn/srv6/internal/tasks/api"
)
Expand Down Expand Up @@ -69,7 +70,7 @@ func (s *Setup) AddTasks() {

// 0.3 http server

rr := tasks.NewRulesRegistry()
rr := ctrl.NewRulesRegistry()
s.RegisterTask("ctrl.rest-api", tasks.NewHttpServerTask(httpAddr, rr))

// 0.4 controller registry
Expand All @@ -87,17 +88,33 @@ func (s *Setup) AddTasks() {
s.RegisterTask(t_name, tasks.NewTaskTunIface(iface_name, s.registry))
}
// 1.3 ifaces golang-gtp4-* (tun via water)
for i, h := range s.config.Headends.Filter(config.ProviderNextMN) {
for i, h := range s.config.Headends.FilterWithBehavior(config.ProviderNextMN, config.H_M_GTP4_D) {
t_name := fmt.Sprintf("nextmn.tun.golang-gtp4/%s", h.Name)
iface_name := fmt.Sprintf("%s%d", constants.IFACE_GOLANG_GTP4_PREFIX, i)
s.RegisterTask(t_name, tasks.NewTaskTunIface(iface_name, s.registry))
}
for i, h := range s.config.Headends.FilterWithBehavior(config.ProviderNextMNWithController, config.H_M_GTP4_D) {
t_name := fmt.Sprintf("nextmn-ctrl.tun.golang-gtp4/%s", h.Name)
iface_name := fmt.Sprintf("%s%d", constants.IFACE_GOLANG_GTP4_PREFIX, i)
s.RegisterTask(t_name, tasks.NewTaskTunIface(iface_name, s.registry))
}
// 1.4 ifaces golang-ipv4-* (tun via water)
for i, h := range s.config.Headends.FilterWithoutBehavior(config.ProviderNextMN, config.H_M_GTP4_D) {
t_name := fmt.Sprintf("nextmn.tun.golang-ipv4/%s", h.Name)
iface_name := fmt.Sprintf("%s%d", constants.IFACE_GOLANG_IPV4_PREFIX, i)
s.RegisterTask(t_name, tasks.NewTaskTunIface(iface_name, s.registry))
}
for i, h := range s.config.Headends.FilterWithoutBehavior(config.ProviderNextMNWithController, config.H_M_GTP4_D) {
t_name := fmt.Sprintf("nextmn-ctrl.tun.golang-ipv4/%s", h.Name)
iface_name := fmt.Sprintf("%s%d", constants.IFACE_GOLANG_IPV4_PREFIX, i)
s.RegisterTask(t_name, tasks.NewTaskTunIface(iface_name, s.registry))
}

// 2. ip routes
// 2.1 blackhole route (srv6)
s.RegisterTask("iproute2.route.nextmn-srv6.blackhole", tasks.NewTaskBlackhole(constants.RT_TABLE_NEXTMN_IPV6))
// 2.2 blackhole route (gtp4)
s.RegisterTask("iproute2.route.nextmn-gtp4.blackhole", tasks.NewTaskBlackhole(constants.RT_TABLE_NEXTMN_IPV4))
// 2.1 blackhole route (ipv6)
s.RegisterTask("iproute2.route.nextmn-ipv6.blackhole", tasks.NewTaskBlackhole(constants.RT_TABLE_NEXTMN_IPV6))
// 2.2 blackhole route (ipv4)
s.RegisterTask("iproute2.route.nextmn-ipv4.blackhole", tasks.NewTaskBlackhole(constants.RT_TABLE_NEXTMN_IPV4))

// 3. endpoints + headends
// 3.1 linux headends
Expand All @@ -119,12 +136,30 @@ func (s *Setup) AddTasks() {
iface_name := fmt.Sprintf("%s%d", constants.IFACE_GOLANG_SRV6_PREFIX, i)
s.RegisterTask(t_name, tasks.NewTaskNextMNEndpoint(e, constants.RT_TABLE_NEXTMN_IPV6, iface_name, s.registry, debug))
}
// 3.3 nextmn gtp4 headends
// 3.3 nextmn ipv4 headends
for i, h := range s.config.Headends.FilterWithoutBehavior(config.ProviderNextMN, config.H_M_GTP4_D) {
t_name := fmt.Sprintf("nextmn.headend.ipv4/%s", h.Name)
iface_name := fmt.Sprintf("%s%d", constants.IFACE_GOLANG_IPV4_PREFIX, i)
s.RegisterTask(t_name, tasks.NewTaskNextMNHeadend(h, constants.RT_TABLE_NEXTMN_IPV4, iface_name, s.registry, debug))
}
// 3.4 nextmn gtp4 headends
for i, h := range s.config.Headends.FilterWithBehavior(config.ProviderNextMN, config.H_M_GTP4_D) {
t_name := fmt.Sprintf("nextmn.headend.gtp4/%s", h.Name)
iface_name := fmt.Sprintf("%s%d", constants.IFACE_GOLANG_GTP4_PREFIX, i)
s.RegisterTask(t_name, tasks.NewTaskNextMNHeadend(h, constants.RT_TABLE_NEXTMN_IPV4, iface_name, s.registry, debug))
}
// 3.5 nextmn-ctrl ipv4 headends
for i, h := range s.config.Headends.FilterWithoutBehavior(config.ProviderNextMNWithController, config.H_M_GTP4_D) {
t_name := fmt.Sprintf("nextmn-ctrl.headend.ipv4/%s", h.Name)
iface_name := fmt.Sprintf("%s%d", constants.IFACE_GOLANG_IPV4_PREFIX, i)
s.RegisterTask(t_name, tasks.NewTaskNextMNHeadendWithCtrl(h, rr, constants.RT_TABLE_NEXTMN_IPV4, iface_name, s.registry, debug))
}
// 3.6 nextmn-ctrl gtp4 headends
for i, h := range s.config.Headends.FilterWithBehavior(config.ProviderNextMNWithController, config.H_M_GTP4_D) {
t_name := fmt.Sprintf("nextmn-ctrl.headend.gtp4/%s", h.Name)
iface_name := fmt.Sprintf("%s%d", constants.IFACE_GOLANG_GTP4_PREFIX, i)
s.RegisterTask(t_name, tasks.NewTaskNextMNHeadendWithCtrl(h, rr, constants.RT_TABLE_NEXTMN_IPV4, iface_name, s.registry, debug))
}

// 4. ip rules
// 4.1 rule to rttable nextmn-srv6
Expand All @@ -135,6 +170,10 @@ func (s *Setup) AddTasks() {
if s.config.GTP4HeadendPrefix != nil {
s.RegisterTask("iproute2.rule.nextmn-gtp4", tasks.NewTaskIP4Rule(*s.config.GTP4HeadendPrefix, constants.RT_TABLE_NEXTMN_IPV4))
}
// 4.3 rule to rttable nextmn-ipv4
if s.config.GTP4HeadendPrefix != nil {
s.RegisterTask("iproute2.rule.nextmn-ipv4", tasks.NewTaskIP4Rule(*s.config.IPV4HeadendPrefix, constants.RT_TABLE_NEXTMN_IPV4))
}
}

// Runs init task by name
Expand Down Expand Up @@ -201,20 +240,39 @@ func (s *Setup) Init() error {
}
}
// 1.3 iface golang-gtp4 (tun via water)
for _, h := range s.config.Headends.Filter(config.ProviderNextMN) {
for _, h := range s.config.Headends.FilterWithBehavior(config.ProviderNextMN, config.H_M_GTP4_D) {
t_name := fmt.Sprintf("nextmn.tun.golang-gtp4/%s", h.Name)
if err := s.RunInitTask(t_name); err != nil {
return err
}
}
for _, h := range s.config.Headends.FilterWithBehavior(config.ProviderNextMNWithController, config.H_M_GTP4_D) {
t_name := fmt.Sprintf("nextmn-ctrl.tun.golang-gtp4/%s", h.Name)
if err := s.RunInitTask(t_name); err != nil {
return err
}
}
// 1.3 iface golang-ipv4 (tun via water)
for _, h := range s.config.Headends.FilterWithoutBehavior(config.ProviderNextMN, config.H_M_GTP4_D) {
t_name := fmt.Sprintf("nextmn.tun.golang-ipv4/%s", h.Name)
if err := s.RunInitTask(t_name); err != nil {
return err
}
}
for _, h := range s.config.Headends.FilterWithoutBehavior(config.ProviderNextMNWithController, config.H_M_GTP4_D) {
t_name := fmt.Sprintf("nextmn-ctrl.tun.golang-ipv4/%s", h.Name)
if err := s.RunInitTask(t_name); err != nil {
return err
}
}

// 2. ip routes
// 2.1 blackhole route (srv6)
if err := s.RunInitTask("iproute2.route.nextmn-srv6.blackhole"); err != nil {
// 2.1 blackhole route (ipv6)
if err := s.RunInitTask("iproute2.route.nextmn-ipv6.blackhole"); err != nil {
return err
}
// 2.2 blackhole route (gtp4)
if err := s.RunInitTask("iproute2.route.nextmn-gtp4.blackhole"); err != nil {
// 2.2 blackhole route (ipv4)
if err := s.RunInitTask("iproute2.route.nextmn-ipv4.blackhole"); err != nil {
return err
}

Expand Down Expand Up @@ -252,6 +310,27 @@ func (s *Setup) Init() error {
return err
}
}
// 3.5 nextmn ipv4 headends
for _, h := range s.config.Headends.FilterWithoutBehavior(config.ProviderNextMN, config.H_M_GTP4_D) {
t_name := fmt.Sprintf("nextmn.headend.ipv4/%s", h.Name)
if err := s.RunInitTask(t_name); err != nil {
return err
}
}
// 3.4 nextmn-ctrl gtp4 headends
for _, h := range s.config.Headends.FilterWithBehavior(config.ProviderNextMNWithController, config.H_M_GTP4_D) {
t_name := fmt.Sprintf("nextmn-ctrl.headend.gtp4/%s", h.Name)
if err := s.RunInitTask(t_name); err != nil {
return err
}
}
// 3.4 nextmn-ctrl ipv4 headends
for _, h := range s.config.Headends.FilterWithoutBehavior(config.ProviderNextMNWithController, config.H_M_GTP4_D) {
t_name := fmt.Sprintf("nextmn-ctrl.headend.ipv4/%s", h.Name)
if err := s.RunInitTask(t_name); err != nil {
return err
}
}

// 4. ip rules
// 4.1 rule to rttable nextmn-srv6
Expand All @@ -266,6 +345,12 @@ func (s *Setup) Init() error {
return err
}
}
// 4.3 rule to rttable nextmn-gtp4
if s.config.IPV4HeadendPrefix != nil {
if err := s.RunInitTask("iproute2.rule.nextmn-ipv4"); err != nil {
return err
}
}

// 5. user post-hook
if err := s.RunInitTask("hook.post"); err != nil {
Expand Down Expand Up @@ -300,36 +385,63 @@ func (s *Setup) Exit() {
fmt.Println(err)
}
}
// 1.2 rule to rttable nextmn-srv6
// 1.2 rule to rttable nextmn-ipv4
if s.config.IPV4HeadendPrefix != nil {
if err := s.RunExitTask("iproute2.rule.nextmn-ipv4"); err != nil {
fmt.Println(err)
}
}
// 1.3 rule to rttable nextmn-srv6
if s.config.Locator != nil {
if err := s.RunExitTask("iproute2.rule.nextmn-srv6"); err != nil {
fmt.Println(err)
}
}

// 2 endpoints + headends
// 2. nextmn gtp4 headends
// 2.1 nextmn ipv4 headends
for _, h := range s.config.Headends.FilterWithoutBehavior(config.ProviderNextMN, config.H_M_GTP4_D) {
t_name := fmt.Sprintf("nextmn.headend.ipv4/%s", h.Name)
if err := s.RunExitTask(t_name); err != nil {
fmt.Println(err)
}
}
// 2.2 nextmn gtp4 headends
for _, h := range s.config.Headends.FilterWithBehavior(config.ProviderNextMN, config.H_M_GTP4_D) {
t_name := fmt.Sprintf("nextmn.headend.gtp4/%s", h.Name)
if err := s.RunExitTask(t_name); err != nil {
fmt.Println(err)
}
}
// 2.2 nextmn endpoints
// 2.3 nextmn-ctrl ipv4 headends
for _, h := range s.config.Headends.FilterWithoutBehavior(config.ProviderNextMNWithController, config.H_M_GTP4_D) {
t_name := fmt.Sprintf("nextmn-ctrl.headend.ipv4/%s", h.Name)
if err := s.RunExitTask(t_name); err != nil {
fmt.Println(err)
}
}
// 2.4 nextmn-ctrl gtp4 headends
for _, h := range s.config.Headends.FilterWithBehavior(config.ProviderNextMNWithController, config.H_M_GTP4_D) {
t_name := fmt.Sprintf("nextmn-ctrl.headend.gtp4/%s", h.Name)
if err := s.RunExitTask(t_name); err != nil {
fmt.Println(err)
}
}
// 2.5 nextmn endpoints
for _, e := range s.config.Endpoints.Filter(config.ProviderNextMN) {
t_name := fmt.Sprintf("nextmn.endpoint/%s", e.Prefix)
if err := s.RunExitTask(t_name); err != nil {
fmt.Println(err)
}
}
// 2.3 linux endpoints
// 2.6 linux endpoints
for _, e := range s.config.Endpoints.Filter(config.ProviderLinux) {
t_name := fmt.Sprintf("linux.endpoint/%s", e.Prefix)
if err := s.RunExitTask(t_name); err != nil {
fmt.Println(err)
}
}
// 2.3 linux headends
// 2.7 linux headends
for _, h := range s.config.Headends.Filter(config.ProviderLinux) {
t_name := fmt.Sprintf("linux.headend/%s", h.Name)
if err := s.RunExitTask(t_name); err != nil {
Expand All @@ -343,31 +455,50 @@ func (s *Setup) Exit() {
}

// 3. ip routes
// 3.1 blackhole route (gtp4)
if err := s.RunExitTask("iproute2.route.nextmn-gtp4.blackhole"); err != nil {
// 3.1 blackhole route (ipv4)
if err := s.RunExitTask("iproute2.route.nextmn-ipv4.blackhole"); err != nil {
fmt.Println(err)
}
// 3.2 blackhole route (srv6)
if err := s.RunExitTask("iproute2.route.nextmn-srv6.blackhole"); err != nil {
// 3.2 blackhole route (ipv6)
if err := s.RunExitTask("iproute2.route.nextmn-ipv6.blackhole"); err != nil {
fmt.Println(err)
}

// 4. ifaces
// 4.1 ifaces golang-gtp4-* (tun via water)
for _, h := range s.config.Headends.Filter(config.ProviderNextMN) {
for _, h := range s.config.Headends.FilterWithBehavior(config.ProviderNextMN, config.H_M_GTP4_D) {
t_name := fmt.Sprintf("nextmn.tun.golang-gtp4/%s", h.Name)
if err := s.RunExitTask(t_name); err != nil {
fmt.Println(err)
}
}
// 4.2 ifaces golang-srv6-* (tun via water)
for _, h := range s.config.Headends.FilterWithBehavior(config.ProviderNextMNWithController, config.H_M_GTP4_D) {
t_name := fmt.Sprintf("nextmn-ctrl.tun.golang-gtp4/%s", h.Name)
if err := s.RunExitTask(t_name); err != nil {
fmt.Println(err)
}
}
// 4.2 ifaces golang-ipv4-* (tun via water)
for _, h := range s.config.Headends.FilterWithoutBehavior(config.ProviderNextMN, config.H_M_GTP4_D) {
t_name := fmt.Sprintf("nextmn.tun.golang-ipv4/%s", h.Name)
if err := s.RunExitTask(t_name); err != nil {
fmt.Println(err)
}
}
for _, h := range s.config.Headends.FilterWithoutBehavior(config.ProviderNextMNWithController, config.H_M_GTP4_D) {
t_name := fmt.Sprintf("nextmn-ctrl.tun.golang-ipv4/%s", h.Name)
if err := s.RunExitTask(t_name); err != nil {
fmt.Println(err)
}
}
// 4.3 ifaces golang-srv6-* (tun via water)
for _, e := range s.config.Endpoints.Filter(config.ProviderNextMN) {
t_name := fmt.Sprintf("nextmn.tun.golang-srv6/%s", e.Prefix)
if err := s.RunExitTask(t_name); err != nil {
fmt.Println(err)
}
}
// 4.3 iface linux (type dummy)
// 4.4 iface linux (type dummy)
if err := s.RunExitTask("iproute2.iface.linux"); err != nil {
fmt.Println(err)
}
Expand Down
3 changes: 2 additions & 1 deletion internal/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ type SRv6Config struct {

// headends
LinuxHeadendSetSourceAddress *string `yaml:"linux-headend-set-source-address,omitempty"`
GTP4HeadendPrefix *string `yaml:"ipv4-headend-prefix,omitempty"` // example of prefix: 10.0.0.1/32 (if you use a single IPv4 headend) or 10.0.1.0/24 (with more headends)
GTP4HeadendPrefix *string `yaml:"gtp4-headend-prefix,omitempty"` // example of prefix: 10.0.0.1/32 (if you use a single GTP4 headend) or 10.0.1.0/24 (with more headends)
IPV4HeadendPrefix *string `yaml:"ipv4-headend-prefix,omitempty"` // example of prefix: 10.0.0.1/32 (if you use a single IPV4 headend) or 10.0.1.0/24 (with more headends)
Headends Headends `yaml:"headends"`

// endpoints
Expand Down
10 changes: 10 additions & 0 deletions internal/config/headend.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,13 @@ func (he Headends) FilterWithBehavior(provider Provider, behavior HeadendBehavio
}
return newList
}

func (he Headends) FilterWithoutBehavior(provider Provider, behavior HeadendBehavior) Headends {
newList := make([]*Headend, 0)
for _, e := range he {
if e.Provider == provider && e.Behavior != behavior {
newList = append(newList, e)
}
}
return newList
}
5 changes: 5 additions & 0 deletions internal/config/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ type Provider int
const (
ProviderLinux Provider = iota
ProviderNextMN
ProviderNextMNWithController
)

func (p Provider) String() string {
Expand All @@ -24,6 +25,8 @@ func (p Provider) String() string {
return "Linux"
case ProviderNextMN:
return "NextMN"
case ProviderNextMNWithController:
return "NextMN (via controller)"
default:
return "Unknown provider"
}
Expand All @@ -36,6 +39,8 @@ func (p *Provider) UnmarshalYAML(n *yaml.Node) error {
*p = ProviderLinux
case "nextmn":
*p = ProviderNextMN
case "nextmn-ctrl", "nextmnwithcontroller", "nextmn-with-controller", "nextmn-via-controller":
*p = ProviderNextMNWithController
default:
return fmt.Errorf("Unknown provider")
}
Expand Down
1 change: 1 addition & 0 deletions internal/constants/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,5 @@ const IFACE_LINUX = "nextmn-linux"

// golang/water ifaces
const IFACE_GOLANG_SRV6_PREFIX = "nextmn-srv6-"
const IFACE_GOLANG_IPV4_PREFIX = "nextmn-ipv4-" // ipv4 excluding gtp4
const IFACE_GOLANG_GTP4_PREFIX = "nextmn-gtp4-"
Loading