Skip to content

Commit

Permalink
Fix issue: device selector containing interface not known to host (#659)
Browse files Browse the repository at this point in the history
Related issue: cmd-forwarder-vpp/658
Any interface known to host will be set up.
In case of failure during interface setup a warning will is logged.
The remaining devices will be processed.

Signed-off-by: Laszlo Kiraly <laszlo.kiraly@est.tech>
  • Loading branch information
ljkiraly authored Jul 11, 2022
1 parent 11920fd commit 977b667
Showing 1 changed file with 54 additions and 35 deletions.
89 changes: 54 additions & 35 deletions internal/vppinit/links.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,28 +32,50 @@ import (
"github.com/networkservicemesh/sdk/pkg/tools/log"
)

// InitLinks creates AF_PACKET interface if needed and put the given interfaces in promisc mode
func InitLinks(ctx context.Context, vppConn api.Connection, deviceNames map[string]string, tunnelIP net.IP) error {
for _, device := range deviceNames {
var link netlink.Link
link, err := netlink.LinkByName(device)

if err != nil {
return err
}
func initDevice(ctx context.Context, vppConn api.Connection, tunnelIP net.IP, device string, errChan chan error) {
link, err := netlink.LinkByName(device)

if err != nil {
err = errors.Wrapf(err, "init for device %s failed", device)
} else {
if link == nil {
setPromiscVpp(ctx, vppConn, device)
continue
err = setPromiscVpp(ctx, vppConn, device)
} else {
if !isTunnelLink(link, tunnelIP) {
err = setupLinkVpp(ctx, vppConn, link)
}
if err != nil {
err = errors.Wrapf(err, "error setting up device %s", device)
} else {
setPromiscHw(ctx, link)
}
}
}
errChan <- err
}

// InitLinks creates AF_PACKET interface if needed and put the given interfaces in promisc mode
func InitLinks(ctx context.Context, vppConn api.Connection, deviceNames map[string]string, tunnelIP net.IP) error {
ch := make(chan error)
defer func() {
go func() {
for range ch {
}
}()
}()

if !isTunnelLink(link, tunnelIP) {
err = setupLinkVpp(ctx, vppConn, link)
for _, device := range deviceNames {
go initDevice(ctx, vppConn, tunnelIP, device, ch)
}
for i := 0; i < len(deviceNames); i++ {
select {
case <-ctx.Done():
return errors.Wrapf(ctx.Err(), "timeout waiting for init links")
case err := <-ch:
if err != nil {
return errors.Wrapf(err, "error setting up device %s", device)
log.FromContext(ctx).Warnf("Link init failed (%v)", err)
}
}
setPromiscHw(ctx, link)
}
return nil
}
Expand Down Expand Up @@ -114,31 +136,28 @@ func setPromiscHw(ctx context.Context, link netlink.Link) {
}
}

func setPromiscVpp(ctx context.Context, vppConn api.Connection, hostIFName string) {
func setPromiscVpp(ctx context.Context, vppConn api.Connection, hostIFName string) error {
client, err := interfaces.NewServiceClient(vppConn).SwInterfaceDump(ctx, &interfaces.SwInterfaceDump{
NameFilterValid: true,
NameFilter: hostIFName,
})
if err != nil {
return err
}
var details *interfaces.SwInterfaceDetails
details, err = client.Recv()
if err == nil {
var details *interfaces.SwInterfaceDetails
details, err = client.Recv()
if err == nil {
now := time.Now()
if _, err := interfaces.NewServiceClient(vppConn).SwInterfaceSetPromisc(ctx, &interfaces.SwInterfaceSetPromisc{
SwIfIndex: details.SwIfIndex,
PromiscOn: true,
}); err != nil {
log.FromContext(ctx).
WithField("duration", time.Since(now)).
WithField("HostInterfaceName", hostIFName).
WithField("vppapi", "SwInterfaceSetPromisc").
Warn("Promiscuous mode not set!")
} else {
log.FromContext(ctx).
WithField("duration", time.Since(now)).
WithField("HostInterfaceName", hostIFName).
WithField("vppapi", "SwInterfaceSetPromisc").Debug("completed")
}
now := time.Now()
if _, err = interfaces.NewServiceClient(vppConn).SwInterfaceSetPromisc(ctx, &interfaces.SwInterfaceSetPromisc{
SwIfIndex: details.SwIfIndex,
PromiscOn: true,
}); err == nil {
log.FromContext(ctx).
WithField("duration", time.Since(now)).
WithField("HostInterfaceName", hostIFName).
WithField("vppapi", "SwInterfaceSetPromisc").Debug("completed")
return nil
}
}
return err
}

0 comments on commit 977b667

Please sign in to comment.