mirror of
https://github.com/soypat/lneto.git
synced 2026-08-24 16:39:07 +00:00
begin touching up a DNS Client implementation; internal.GetIP/SetIP refactor
This commit is contained in:
+18
-10
@@ -10,7 +10,7 @@ var (
|
||||
errInvalidIPVersionToSetAddr = errors.New("invalid ip version to setDstAddr")
|
||||
)
|
||||
|
||||
func GetIPSourceAddr(buf []byte) (addr []byte, id, ipEndOff uint16, err error) {
|
||||
func GetIPAddr(buf []byte) (src, dst []byte, id, ipEndOff uint16, err error) {
|
||||
b0 := buf[0]
|
||||
version := b0 >> 4
|
||||
switch version {
|
||||
@@ -18,33 +18,41 @@ func GetIPSourceAddr(buf []byte) (addr []byte, id, ipEndOff uint16, err error) {
|
||||
ihl := b0 & 0xf
|
||||
ipEndOff = 4 * uint16(ihl)
|
||||
id = binary.BigEndian.Uint16(buf[4:6])
|
||||
addr = buf[12:16]
|
||||
src = buf[12:16]
|
||||
dst = buf[16:20]
|
||||
case 6:
|
||||
addr = buf[8:24]
|
||||
src = buf[8:24]
|
||||
dst = buf[24:40]
|
||||
ipEndOff = 40
|
||||
default:
|
||||
err = errUnsupportedIP
|
||||
}
|
||||
return addr, id, ipEndOff, err
|
||||
return src, dst, id, ipEndOff, err
|
||||
}
|
||||
|
||||
func SetIPDestinationAddr(buf []byte, id uint16, addr []byte) (err error) {
|
||||
var dstaddr []byte
|
||||
func SetIPAddrs(buf []byte, id uint16, src, dst []byte) (err error) {
|
||||
var dstaddr, srcaddr []byte
|
||||
version := buf[0] >> 4
|
||||
switch version {
|
||||
case 4:
|
||||
srcaddr = buf[12:16]
|
||||
dstaddr = buf[16:20]
|
||||
if id > 0 {
|
||||
binary.BigEndian.PutUint16(buf[4:6], id)
|
||||
}
|
||||
case 6:
|
||||
srcaddr = buf[8:24]
|
||||
dstaddr = buf[24:40]
|
||||
default:
|
||||
err = errUnsupportedIP
|
||||
return errUnsupportedIP
|
||||
}
|
||||
if err == nil && len(dstaddr) != len(addr) {
|
||||
return errInvalidIPVersionToSetAddr
|
||||
if src != nil && len(srcaddr) != len(src) {
|
||||
return errors.New("mismatched length of ip src addr")
|
||||
}
|
||||
copy(dstaddr, addr)
|
||||
if dst != nil && len(dstaddr) != len(dst) {
|
||||
return errors.New("mismatched length of ip dst addr")
|
||||
}
|
||||
copy(srcaddr, src)
|
||||
copy(dstaddr, dst)
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user