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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
package main
import (
"context"
"os"
"git.fd.io/govpp.git/api"
interfaces "github.com/edwarnicke/govpp/binapi/interface"
"github.com/edwarnicke/govpp/binapi/interface_types"
ip_types "github.com/edwarnicke/govpp/binapi/ip_types"
"github.com/edwarnicke/govpp/binapi/session"
"github.com/edwarnicke/govpp/binapi/tapv2"
"github.com/edwarnicke/vpphelper"
)
var (
workDir, _ = os.Getwd()
)
type ConfFn func(context.Context, api.Connection) error
type Actions struct {
}
func (a *Actions) ConfigureTap(args []string) *ActionResult {
var startup Stanza
startup.
NewStanza("session").
Append("enable").
Append("use-app-socket-api").Close()
ctx, cancel := newVppContext()
defer cancel()
con, vppErrCh := vpphelper.StartAndDialContext(ctx,
vpphelper.WithRootDir(workDir),
vpphelper.WithVppConfig(configTemplate+startup.ToString()))
exitOnErrCh(ctx, cancel, vppErrCh)
ifaceClient := interfaces.NewServiceClient(con)
pref, err := ip_types.ParseIP4Prefix("10.10.10.2/24")
if err != nil {
return NewActionResult(err, ActionResultWithDesc("failed to parse ip4 address"))
}
createTapReply, err := tapv2.NewServiceClient(con).TapCreateV2(ctx, &tapv2.TapCreateV2{
HostIfNameSet: true,
HostIfName: "tap0",
HostIP4PrefixSet: true,
HostIP4Prefix: ip_types.IP4AddressWithPrefix(pref),
})
if err != nil {
return NewActionResult(err, ActionResultWithDesc("failed to configure tap"))
}
ipPrefix, err := ip_types.ParseAddressWithPrefix("10.10.10.1/24")
if err != nil {
return NewActionResult(err, ActionResultWithDesc("parsing ip address failed"))
}
ipAddress := &interfaces.SwInterfaceAddDelAddress{
IsAdd: true,
SwIfIndex: createTapReply.SwIfIndex,
Prefix: ipPrefix,
}
_, errx := ifaceClient.SwInterfaceAddDelAddress(ctx, ipAddress)
if errx != nil {
return NewActionResult(err, ActionResultWithDesc("configuring ip address failed"))
}
_, err = ifaceClient.SwInterfaceSetFlags(ctx, &interfaces.SwInterfaceSetFlags{
SwIfIndex: createTapReply.SwIfIndex,
Flags: interface_types.IF_STATUS_API_FLAG_ADMIN_UP,
})
if err != nil {
return NewActionResult(err, ActionResultWithDesc("failed to set interface state"))
}
_, err = session.NewServiceClient(con).SessionEnableDisable(ctx, &session.SessionEnableDisable{
IsEnable: true,
})
if err != nil {
return NewActionResult(err, ActionResultWithDesc("configuration failed"))
}
writeSyncFile(OkResult())
<-ctx.Done()
return nil
}
|