add SLIP framing

This commit is contained in:
Joel Wetzell
2025-11-18 21:30:06 -06:00
parent 86966132ca
commit 8e0f25abe9
3 changed files with 56 additions and 0 deletions

52
internals/framing/slip.go Normal file
View File

@@ -0,0 +1,52 @@
package framing
type SlipFramer struct {
buffer []byte
}
func NewSlipFramer() *SlipFramer {
return &SlipFramer{buffer: []byte{}}
}
func (sf *SlipFramer) Frame(data []byte) [][]byte {
messages := [][]byte{}
END := byte(0xc0)
ESC := byte(0xdb)
ESC_END := byte(0xdc)
ESC_ESC := byte(0xdd)
escapeNext := false
for _, packetByte := range data {
if packetByte == ESC {
escapeNext = true
continue
}
if escapeNext {
if packetByte == ESC_END {
sf.buffer = append(sf.buffer, END)
} else if packetByte == ESC_ESC {
sf.buffer = append(sf.buffer, ESC)
}
escapeNext = false
} else if packetByte == END {
if len(sf.buffer) == 0 {
// opening END byte, can discard
continue
} else {
message := sf.buffer
messages = append(messages, message)
}
sf.buffer = []byte{}
} else {
sf.buffer = append(sf.buffer, packetByte)
}
}
return messages
}
func (sf *SlipFramer) Clear() {
sf.buffer = []byte{}
}

View File

@@ -65,6 +65,8 @@ func init() {
framer = framing.NewByteSeparatorFramer([]byte{'\n'})
case "CRLF":
framer = framing.NewByteSeparatorFramer([]byte{'\r', '\n'})
case "SLIP":
framer = framing.NewSlipFramer()
default:
return nil, fmt.Errorf("unknown framing method: %s", framingMethodString)
}

View File

@@ -67,6 +67,8 @@ func (ts TCPServer) HandleClient(ctx context.Context, client net.Conn) {
framer = framing.NewByteSeparatorFramer([]byte{'\r'})
case "CRLF":
framer = framing.NewByteSeparatorFramer([]byte{'\r', '\n'})
case "SLIP":
framer = framing.NewSlipFramer()
}
buffer := make([]byte, 1024)