summaryrefslogtreecommitdiffhomepage
path: root/pkg/tcpip/sample/wg_tunnel/fsm.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/tcpip/sample/wg_tunnel/fsm.go')
-rw-r--r--pkg/tcpip/sample/wg_tunnel/fsm.go187
1 files changed, 187 insertions, 0 deletions
diff --git a/pkg/tcpip/sample/wg_tunnel/fsm.go b/pkg/tcpip/sample/wg_tunnel/fsm.go
new file mode 100644
index 000000000..965f6fca9
--- /dev/null
+++ b/pkg/tcpip/sample/wg_tunnel/fsm.go
@@ -0,0 +1,187 @@
+package main
+
+import (
+ "fmt"
+// "log"
+ "github.com/insomniacslk/dhcp/dhcpv6"
+)
+
+// FSM from RFC 2131 Figure 5
+
+type DHCP interface {
+ SendDiscover()
+ SendRequest()
+}
+
+type FSM struct {
+ state State
+ dhcp DHCP
+}
+
+type DHCPv4 struct {
+}
+
+func (f FSM) Init(d DHCP) {
+ fmt.Println("Init")
+ f.dhcp = d
+ f.state = stInit(f.dhcp, nil)
+
+ // go
+}
+
+func (f FSM) InputMessage() {
+}
+
+func (d DHCPv4) SendDiscover() {
+}
+
+type DHCPv6 struct {
+}
+
+func (d DHCPv6) SendDiscover() {
+ fmt.Println("SendDiscover")
+}
+
+func (d DHCPv6) SendRequest() {
+ fmt.Println("SendRequest")
+}
+
+type EventType uint8
+
+const (
+ EventTypeNone EventType = 0
+ EventTypeMessage EventType = 1
+ EventTypeTimeoutT1 EventType = 2
+ EventTypeTimeoutT2 EventType = 3
+ EventTypeTimeoutLease EventType = 3
+)
+
+type Event interface {
+ Type() EventType
+}
+
+// type TimerType uint8
+
+// const (
+// TimerNone TimerType = 0
+// TimerT1 TimerType = 1
+// TimerT2 TimerType = 2
+// TimerLease TimerType = 3
+// )
+
+// type EventTimeout struct {
+// Event
+// Timer TimerType
+// }
+
+type EventMessage struct {
+ Event
+ msg dhcpv6.Message
+}
+
+func (ev *EventMessage) Type() EventType {
+ return EventTypeMessage
+}
+
+func (ev *EventMessage) Msg() dhcpv6.Message {
+ return ev.msg
+}
+
+type State func (d DHCP, ev Event) (next State)
+
+func stInit(d DHCP, ev Event) State {
+ // Send Discover
+ d.SendDiscover()
+ return stSelecting
+}
+
+func stSelecting(d DHCP, ev Event) State {
+ switch ev.Type() {
+ case EventTypeMessage:
+ msg := ev.(*EventMessage).Msg()
+ switch msg.Type() {
+ case dhcpv6.MessageTypeAdvertise:
+ // Select first offer
+ d.SendRequest()
+ return stRequesting
+ }
+ }
+ return stSelecting
+}
+
+func stRequesting(d DHCP, ev Event) State {
+ switch ev.Type() {
+ case EventTypeMessage:
+ msg := ev.(*EventMessage).Msg()
+ switch msg.Type() {
+ case dhcpv6.MessageTypeAdvertise:
+ // Discard
+ return stRequesting
+ case dhcpv6.MessageTypeReply:
+ // Record lease, set T1, T2
+ return stBound
+ case dhcpv6.MessageTypeNone: // FIXME NAK
+ // Send Decline
+ return stInit
+ }
+ }
+ return stRequesting
+}
+
+func stBound(d DHCP, ev Event) State {
+ switch ev.Type() {
+ case EventTypeTimeoutT1:
+ // Send Request
+ return stRenewing
+ case EventTypeMessage:
+ msg := ev.(*EventMessage).Msg()
+ switch msg.Type() {
+ case dhcpv6.MessageTypeAdvertise:
+ case dhcpv6.MessageTypeReply:
+ case dhcpv6.MessageTypeNone:
+ // TODO or NACK
+ // Send Decline
+ return stBound
+ }
+ }
+ return stBound
+}
+
+func stRenewing(d DHCP, ev Event) State {
+ // FIXME
+ switch ev.Type() {
+ case EventTypeTimeoutT2:
+ // Broadcast request?
+ return stRebinding
+ case EventTypeMessage:
+ msg := ev.(*EventMessage).Msg()
+ switch msg.Type() {
+ case dhcpv6.MessageTypeReply:
+ // Record lease, set T1, T2
+ return stBound
+ case dhcpv6.MessageTypeNone: // FIXME NAK
+ // HALT network
+ return stInit
+ }
+ }
+ return stRenewing
+}
+
+func stRebinding(d DHCP, ev Event) State {
+ switch ev.Type() {
+ case EventTypeTimeoutLease:
+ // Halt network
+ return stInit
+ case EventTypeMessage:
+ msg := ev.(*EventMessage).Msg()
+ switch msg.Type() {
+ case dhcpv6.MessageTypeReply:
+ // Record lease, set timers T1, T2
+ return stBound
+ case dhcpv6.MessageTypeNone: // FIXME NAK
+ // Halt network
+ return stInit
+ }
+ }
+ return stRebinding
+}