mirror of
https://github.com/soypat/lneto.git
synced 2026-09-10 08:39:30 +00:00
StackNode refactor: add offsetToIP argument to Encapsulate
This commit is contained in:
+7
-7
@@ -104,11 +104,11 @@ func (c *Client) Protocol() uint64 { return uint64(lneto.IPProtoUDP) }
|
||||
func (c *Client) LocalPort() uint16 { return DefaultClientPort }
|
||||
func (c *Client) ConnectionID() *uint64 { return &c.connID }
|
||||
|
||||
func (c *Client) setIP(b []byte, frameOffset int) {
|
||||
if frameOffset < 28 {
|
||||
return // Not an IP/UDP frame.
|
||||
func (c *Client) setIP(carrierFrame []byte, offsetToIP int) {
|
||||
if offsetToIP < 0 {
|
||||
return // No IP layer present.
|
||||
}
|
||||
ifrm, _ := ipv4.NewFrame(b)
|
||||
ifrm, _ := ipv4.NewFrame(carrierFrame[offsetToIP:])
|
||||
ifrm.SetID((uint16(c.currentXID) ^ uint16(c.currentXID>>16)) + uint16(c.state))
|
||||
if c.state > StateInit {
|
||||
// Match server ToS since some routers drop DHCP requests if no ToS set apparently?
|
||||
@@ -124,7 +124,7 @@ func (c *Client) setIP(b []byte, frameOffset int) {
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Client) Encapsulate(carrierFrame []byte, frameOffset int) (int, error) {
|
||||
func (c *Client) Encapsulate(carrierData []byte, offsetToIP, offsetToFrame int) (int, error) {
|
||||
if c.isClosed() {
|
||||
return 0, net.ErrClosed
|
||||
} else if c.state == StateSelecting && !c.offer.valid {
|
||||
@@ -134,7 +134,7 @@ func (c *Client) Encapsulate(carrierFrame []byte, frameOffset int) (int, error)
|
||||
} else if c.state == StateRequesting {
|
||||
return 0, nil // Currently awaiting ACK.
|
||||
}
|
||||
dst := carrierFrame[frameOffset:]
|
||||
dst := carrierData[offsetToFrame:]
|
||||
frm, err := NewFrame(dst)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
@@ -194,7 +194,7 @@ func (c *Client) Encapsulate(carrierFrame []byte, frameOffset int) (int, error)
|
||||
opts[numOpts] = byte(OptEnd)
|
||||
numOpts++
|
||||
c.setHeader(frm)
|
||||
c.setIP(carrierFrame, frameOffset)
|
||||
c.setIP(carrierData, offsetToIP)
|
||||
c.state = nextState
|
||||
return OptionsOffset + numOpts, nil
|
||||
}
|
||||
|
||||
+8
-8
@@ -28,7 +28,7 @@ func TestClientServer(t *testing.T) {
|
||||
// CLIENT DISCOVER.
|
||||
assertClState(StateInit)
|
||||
var buf [1024]byte
|
||||
n, err := cl.Encapsulate(buf[:], 0)
|
||||
n, err := cl.Encapsulate(buf[:], -1, 0)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
} else if n == 0 {
|
||||
@@ -40,7 +40,7 @@ func TestClientServer(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
// SERVER REPLY OFFER
|
||||
n, err = sv.Encapsulate(buf[:], 0)
|
||||
n, err = sv.Encapsulate(buf[:], -1, 0)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
} else if n == 0 {
|
||||
@@ -53,7 +53,7 @@ func TestClientServer(t *testing.T) {
|
||||
assertClState(StateSelecting)
|
||||
|
||||
// CLIENT SEND OUT REQUEST.
|
||||
n, err = cl.Encapsulate(buf[:], 0)
|
||||
n, err = cl.Encapsulate(buf[:], -1, 0)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
} else if n == 0 {
|
||||
@@ -66,7 +66,7 @@ func TestClientServer(t *testing.T) {
|
||||
}
|
||||
|
||||
// SERVER REPLIES WITH ACK.
|
||||
n, err = sv.Encapsulate(buf[:], 0)
|
||||
n, err = sv.Encapsulate(buf[:], -1, 0)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
} else if n == 0 {
|
||||
@@ -99,13 +99,13 @@ func TestExample(t *testing.T) {
|
||||
})
|
||||
buf := make([]byte, 2048)
|
||||
buf2 := make([]byte, len(buf))
|
||||
n, err := cl.Encapsulate(buf, 0)
|
||||
n, err := cl.Encapsulate(buf, -1, 0)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
} else if n <= 0 {
|
||||
t.Fatal("no data sent out by client after starting request")
|
||||
}
|
||||
n, err = cl.Encapsulate(buf2, 0)
|
||||
n, err = cl.Encapsulate(buf2, -1, 0)
|
||||
if err != nil {
|
||||
t.Error("client encaps double tap after discover:", err)
|
||||
}
|
||||
@@ -141,13 +141,13 @@ func TestExample(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
n, err = cl.Encapsulate(buf[:], 0)
|
||||
n, err = cl.Encapsulate(buf[:], -1, 0)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
} else if n <= 0 {
|
||||
t.Fatal("no data written from client in response to offer")
|
||||
}
|
||||
n, err = cl.Encapsulate(buf[:], 0)
|
||||
n, err = cl.Encapsulate(buf[:], -1, 0)
|
||||
if err != nil {
|
||||
t.Error("encapsulate double tap after request:", err)
|
||||
} else if n > 0 {
|
||||
|
||||
+4
-4
@@ -159,9 +159,9 @@ func (sv *Server) Demux(carrierData []byte, frameOffset int) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (sv *Server) Encapsulate(carrierData []byte, frameOffset int) (int, error) {
|
||||
carrierIsIP := frameOffset >= 28
|
||||
dfrm, err := NewFrame(carrierData[frameOffset:])
|
||||
func (sv *Server) Encapsulate(carrierData []byte, offsetToIP, offsetToFrame int) (int, error) {
|
||||
carrierIsIP := offsetToIP >= 0
|
||||
dfrm, err := NewFrame(carrierData[offsetToFrame:])
|
||||
optBuf := dfrm.OptionsPayload()[:]
|
||||
if err != nil {
|
||||
return 0, err
|
||||
@@ -220,7 +220,7 @@ func (sv *Server) Encapsulate(carrierData []byte, frameOffset int) (int, error)
|
||||
copy(dfrm.CHAddrAs6()[:], client.hwaddr[:])
|
||||
dfrm.SetMagicCookie(MagicCookie)
|
||||
if carrierIsIP {
|
||||
err = internal.SetIPAddrs(carrierData, 0, sv.siaddr[:], client.addr[:])
|
||||
err = internal.SetIPAddrs(carrierData[offsetToIP:], 0, sv.siaddr[:], client.addr[:])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user