Skip to content

Commit

Permalink
Merge fbe99b5 into e4937f5
Browse files Browse the repository at this point in the history
  • Loading branch information
bobuhiro11 committed Mar 3, 2022
2 parents e4937f5 + fbe99b5 commit 6686332
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,12 @@ before_script:
- chmod +x ./cc-test-reporter
- ./cc-test-reporter before-build
- GO111MODULE=off go get github.com/mattn/goveralls
- export GO_EXECUTABLE_PATH=$(which go)
- sudo -E setcap cap_net_admin+ep $GO_EXECUTABLE_PATH
script:
# HACK: /dev/kvm is root:kvm 0660 by default
- sudo chmod 666 /dev/kvm
- sudo chmod 666 /dev/net/tun
- make gokvm
- make test
- goveralls -service=travis-ci -coverprofile c.out
Expand Down
65 changes: 65 additions & 0 deletions tap/tap.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package tap

import (
"syscall"
"unsafe"
)

const ifNameSize = 0x10

type Tap struct {
fd int
}

type ifReq struct {
Name [ifNameSize]byte
Flags uint16
_ [0x28 - ifNameSize - 2]byte
}

func ioctl(fd, op, arg uintptr) (uintptr, error) {
res, _, errno := syscall.Syscall(
syscall.SYS_IOCTL, fd, op, arg)

var err error = nil
if errno != 0 {
err = errno
}

return res, err
}

func New(name string) (*Tap, error) {
var err error

t := &Tap{}

if t.fd, err = syscall.Open("/dev/net/tun", syscall.O_RDWR, 0); err != nil {
return t, err
}

ifr := ifReq{
Name: [ifNameSize]byte{},
Flags: syscall.IFF_TAP | syscall.IFF_NO_PI,
}
copy(ifr.Name[:ifNameSize-1], name)

ifrPtr := uintptr(unsafe.Pointer(&ifr))
if _, err = ioctl(uintptr(t.fd), syscall.TUNSETIFF, ifrPtr); err != nil {
return t, err
}

return t, nil
}

func (t *Tap) Close() error {
return syscall.Close(t.fd)
}

func (t Tap) Tx(bytes []byte) error {
if _, err := syscall.Write(t.fd, bytes); err != nil {
return err
}

return nil
}
21 changes: 21 additions & 0 deletions tap/tap_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package tap_test

import (
"testing"

"github.com/bobuhiro11/gokvm/tap"
)

func TestNew(t *testing.T) {
t.Parallel()

tap, err := tap.New("test_tap")
if err != nil {
t.Fatal(err)
}

err = tap.Close()
if err != nil {
t.Fatal(err)
}
}

0 comments on commit 6686332

Please sign in to comment.