forked from ligato/vpp-agent
-
Notifications
You must be signed in to change notification settings - Fork 0
/
tap_vppcalls.go
83 lines (71 loc) · 2.46 KB
/
tap_vppcalls.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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// Copyright (c) 2019 Cisco and/or its affiliates.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at:
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package vpp2001_379
import (
"errors"
"fmt"
ifs "github.com/ligato/vpp-agent/api/models/vpp/interfaces"
vpp_tapv2 "github.com/ligato/vpp-agent/plugins/vpp/binapi/vpp2001_379/tapv2"
)
// TapFlags definitions from https://github.com/FDio/vpp/blob/stable/2001/src/vnet/devices/tap/tap.h#L33
const (
TapFlagGSO uint32 = 1 << iota
)
func (h *InterfaceVppHandler) AddTapInterface(ifName string, tapIf *ifs.TapLink) (swIfIdx uint32, err error) {
if tapIf == nil || tapIf.HostIfName == "" {
return 0, errors.New("host interface name was not provided for the TAP interface")
}
if tapIf.Version == 1 {
return 0, errors.New("tap version 1 has been deprecated")
} else if tapIf.Version == 2 {
var flags uint32
if tapIf.EnableGso {
flags |= TapFlagGSO
}
// Configure fast virtio-based TAP interface
req := &vpp_tapv2.TapCreateV2{
ID: ^uint32(0),
HostIfName: []byte(tapIf.HostIfName),
HostIfNameSet: 1,
UseRandomMac: 1,
RxRingSz: uint16(tapIf.RxRingSize),
TxRingSz: uint16(tapIf.TxRingSize),
TapFlags: flags,
}
reply := &vpp_tapv2.TapCreateV2Reply{}
if err := h.callsChannel.SendRequest(req).ReceiveReply(reply); err != nil {
return 0, err
}
swIfIdx = reply.SwIfIndex
} else {
return 0, fmt.Errorf("invalid tap version (%v)", tapIf.Version)
}
return swIfIdx, h.SetInterfaceTag(ifName, swIfIdx)
}
func (h *InterfaceVppHandler) DeleteTapInterface(ifName string, idx uint32, version uint32) error {
if version == 1 {
return errors.New("tap version 1 has been deprecated")
} else if version == 2 {
req := &vpp_tapv2.TapDeleteV2{
SwIfIndex: idx,
}
reply := &vpp_tapv2.TapDeleteV2Reply{}
if err := h.callsChannel.SendRequest(req).ReceiveReply(reply); err != nil {
return err
}
} else {
return fmt.Errorf("invalid tap version (%v)", version)
}
return h.RemoveInterfaceTag(ifName, idx)
}