name string // name of interface
errors chan error // async error handling
events chan TUNEvent // device related events
+ nopi bool // the device was pased IFF_NO_PI
}
func toRTMGRP(sc uint) uint {
func (tun *NativeTun) Write(buff []byte, offset int) (int, error) {
- // reserve space for header
+ if tun.nopi {
+ buff = buff[offset:]
+ } else {
+ // reserve space for header
- buff = buff[offset-4:]
+ buff = buff[offset-4:]
- // add packet information header
+ // add packet information header
- buff[0] = 0x00
- buff[1] = 0x00
+ buff[0] = 0x00
+ buff[1] = 0x00
- if buff[4] == ipv6.Version<<4 {
- buff[2] = 0x86
- buff[3] = 0xdd
- } else {
- buff[2] = 0x08
- buff[3] = 0x00
+ if buff[4] == ipv6.Version<<4 {
+ buff[2] = 0x86
+ buff[3] = 0xdd
+ } else {
+ buff[2] = 0x08
+ buff[3] = 0x00
+ }
}
// write
case err := <-tun.errors:
return 0, err
default:
- buff := buff[offset-4:]
- n, err := tun.fd.Read(buff[:])
- if n < 4 {
- return 0, err
+ if tun.nopi {
+ return tun.fd.Read(buff[offset:])
+ } else {
+ buff := buff[offset-4:]
+ n, err := tun.fd.Read(buff[:])
+ if n < 4 {
+ return 0, err
+ }
+ return n - 4, err
}
- return n - 4, err
}
}
name: name,
events: make(chan TUNEvent, 5),
errors: make(chan error, 5),
+ nopi: false,
}
// start event listener
name: newName,
events: make(chan TUNEvent, 5),
errors: make(chan error, 5),
+ nopi: false,
}
// start event listener