-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathnetmap.go
63 lines (54 loc) · 1.12 KB
/
netmap.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package gonetmap
import (
"fmt"
"os"
"sync"
"unsafe"
)
type Netmap struct {
File *os.File
MemReg uintptr
lock sync.Mutex
}
func (n *Netmap) RegIf(r *Request) (i *Interface, err error) {
file, _ := n.open()
if err = nmRegIf(file, r); err == nil {
fmt.Printf("ioctl: %v, fd: %v, %+v\n", err, file.Fd(), *r)
if err = n.mmap(file, r); err == nil {
nif := (*NetmapIf)(unsafe.Pointer(n.MemReg + uintptr(r.Offset)))
return &Interface{Nif: nif, File: file}, err
}
}
fmt.Printf("ioctl: %v, %+v\n", err, *r)
return i, err
}
func (n *Netmap) mmap(file *os.File, r *Request) error {
n.lock.Lock()
defer n.lock.Unlock()
if n.MemReg != 0 {
return nil
}
if ptr, err := nmMmap(file, r); err == nil {
n.MemReg = ptr
return nil
} else {
return err
}
}
func (n *Netmap) open() (*os.File, error) {
file, err := os.OpenFile(netmapDev, os.O_RDWR, 0644)
if err == nil {
if n.File == nil {
n.lock.Lock()
n.File = file
n.lock.Unlock()
}
}
return file, err
}
func (n *Netmap) Info(r *Request) error {
return nmInfo(n.File, r)
}
func New() *Netmap {
return &Netmap{File: nil, MemReg: uintptr(0)}
}