Skip to content

Commit

Permalink
fix: fix bugs and add ping test
Browse files Browse the repository at this point in the history
  • Loading branch information
andy89923 committed Jun 7, 2024
1 parent df3d67d commit 52eeaae
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 91 deletions.
94 changes: 23 additions & 71 deletions internal/gre/gre.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package gre
import (
"fmt"
"net"
"strconv"

"github.com/vishvananda/netlink"

Expand All @@ -16,94 +17,49 @@ func SetupGreTunnels(
ueTunnelAddr, n3iwfTunnelAddr, pduAddr net.IP,
qoSInfo *Qos.PDUQoSInfo,
) ([]netlink.Link, error) {
parent, err := netlink.LinkByName(parentIfaceName)
if err != nil {
return nil, fmt.Errorf("netlink.LinkByName: [%+v] %+v", parentIfaceName, err)
}

if qoSInfo == nil {
linkGre, err := SetupGreTunnel(greIfaceName, parentIfaceName, ueTunnelAddr, n3iwfTunnelAddr, pduAddr, nil)
linkGre, err := SetupGreTunnel(greIfaceName, parent, ueTunnelAddr, n3iwfTunnelAddr, pduAddr, 0)
return []netlink.Link{linkGre}, err
}

n3ueSelf := context.N3UESelf()

var (
parent netlink.Link
greKeyField uint32
err error
netlinks []netlink.Link
)

if parent, err = netlink.LinkByName(parentIfaceName); err != nil {
return nil, err
}
netlinks := []netlink.Link{}

for _, qfi := range qoSInfo.QfiList {
greKeyField |= (uint32(qfi) & 0x3F) << 24

// New GRE tunnel interface
newGRETunnel := &netlink.Gretun{
LinkAttrs: netlink.LinkAttrs{
Name: greIfaceName,
MTU: 1438, // remain for endpoint IP header(most 40 bytes if IPv6) and ESP header (22 bytes)
},
Link: uint32(parent.Attrs().Index), // PHYS_DEV in iproute2; IFLA_GRE_LINK in linux kernel
Local: ueTunnelAddr,
Remote: n3iwfTunnelAddr,
IKey: greKeyField,
OKey: greKeyField,
}
logger.AppLog.Infof("New GRE Tunnel, Key Field: 0x%x", greKeyField)

if err = netlink.LinkAdd(newGRETunnel); err != nil {
return nil, err
}

// Get link info
linkGRE, err := netlink.LinkByName(greIfaceName)
linkGRE, err := SetupGreTunnel(greIfaceName, parent, ueTunnelAddr, n3iwfTunnelAddr, pduAddr, qfi)
if err != nil {
return nil, fmt.Errorf("No link named %s", greIfaceName)
return nil, fmt.Errorf("SetupGreTunnel(): [%s]", err)
}

linkGREAddr := &netlink.Addr{
IPNet: &net.IPNet{
IP: pduAddr,
Mask: net.IPv4Mask(255, 255, 255, 255),
},
}

if err := netlink.AddrAdd(linkGRE, linkGREAddr); err != nil {
return nil, err
}

// Set GRE interface up
if err := netlink.LinkSetUp(linkGRE); err != nil {
return nil, err
}

n3ueSelf.CreatedIface = append(n3ueSelf.CreatedIface, &parent)
n3ueSelf.CreatedIface = append(n3ueSelf.CreatedIface, &linkGRE)
netlinks = append(netlinks, linkGRE)
}
return netlinks, nil
}

func SetupGreTunnel(greIfaceName, parentIfaceName string, ueTunnelAddr, n3iwfTunnelAddr,
pduAddr net.IP, qoSInfo *Qos.PDUQoSInfo,
func SetupGreTunnel(
greIfaceName string,
parent netlink.Link,
ueTunnelAddr, n3iwfTunnelAddr, pduAddr net.IP,
qfi uint8,
) (netlink.Link, error) {
var (
parent netlink.Link
greKeyField uint32
err error
)

if qoSInfo != nil {
greKeyField |= (uint32(qoSInfo.QfiList[0]) & 0x3F) << 24
}

if parent, err = netlink.LinkByName(parentIfaceName); err != nil {
return nil, err
}
greKeyField = (uint32(qfi) & 0x3F) << 24
newGreIfaceName := greIfaceName + "-" + strconv.Itoa(int(qfi))

// New GRE tunnel interface
newGRETunnel := &netlink.Gretun{
LinkAttrs: netlink.LinkAttrs{
Name: greIfaceName,
Name: newGreIfaceName,
MTU: 1438, // remain for endpoint IP header(most 40 bytes if IPv6) and ESP header (22 bytes)
},
Link: uint32(parent.Attrs().Index), // PHYS_DEV in iproute2; IFLA_GRE_LINK in linux kernel
Expand All @@ -112,17 +68,16 @@ func SetupGreTunnel(greIfaceName, parentIfaceName string, ueTunnelAddr, n3iwfTun
IKey: greKeyField,
OKey: greKeyField,
}

logger.AppLog.Infof("GRE Key Field: 0x%x", greKeyField)
logger.AppLog.Infof("New GRE Tunnel, Key Field: [0x%x], IfaceName: [%+v]", greKeyField, newGreIfaceName)

if err = netlink.LinkAdd(newGRETunnel); err != nil {
return nil, err
return nil, fmt.Errorf("netlink.LinkAdd: [%+v] %+v", newGreIfaceName, err)
}

// Get link info
linkGRE, err := netlink.LinkByName(greIfaceName)
linkGRE, err := netlink.LinkByName(newGreIfaceName)
if err != nil {
return nil, fmt.Errorf("No link named %s", greIfaceName)
return nil, fmt.Errorf("no link named: [%s]", newGreIfaceName)
}

linkGREAddr := &netlink.Addr{
Expand All @@ -141,8 +96,5 @@ func SetupGreTunnel(greIfaceName, parentIfaceName string, ueTunnelAddr, n3iwfTun
return nil, err
}

n3ueSelf := context.N3UESelf()
n3ueSelf.CreatedIface = append(n3ueSelf.CreatedIface, &parent)

return linkGRE, nil
}
29 changes: 11 additions & 18 deletions internal/nwucp/handler/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,31 +57,24 @@ func HandleDLNASTransport(n3ueSelf *context.N3UE, nasMsg *nas.Message) {

newGREName := fmt.Sprintf("%s-id-%d", n3ueSelf.N3ueInfo.GreIfaceName, n3ueSelf.N3ueInfo.XfrmiId)

// var linkGRE netlink.Link
// if linkGRE, err = gre.SetupGreTunnel(newGREName, n3ueSelf.TemporaryXfrmiName, n3ueSelf.UEInnerAddr.IP,
// n3ueSelf.TemporaryUPIPAddr, pduAddress, n3ueSelf.TemporaryQosInfo); err != nil {
// naslog.Errorf("Setup GRE tunnel %s Fail %+v", newGREName, err)
// return
// }
var linkGREs []netlink.Link
if linkGREs, err = gre.SetupGreTunnels(newGREName, n3ueSelf.TemporaryXfrmiName, n3ueSelf.UEInnerAddr.IP,
n3ueSelf.TemporaryUPIPAddr, pduAddress, n3ueSelf.TemporaryQosInfo); err != nil {
naslog.Errorf("Setup GRE tunnel %s Fail %+v", newGREName, err)
naslog.Errorf("Setup GRE tunnel %s Fail: %+v", newGREName, err)
return
}

// Add routes
for _, linkGRE := range linkGREs {
upRoute := &netlink.Route{
LinkIndex: linkGRE.Attrs().Index,
Dst: &net.IPNet{
IP: net.IPv4zero,
Mask: net.IPv4Mask(0, 0, 0, 0),
},
}
if err := netlink.RouteAdd(upRoute); err != nil {
naslog.Warnf("netlink.RouteAdd: %+v", err)
}
// TODO: here we not ensure that linkGREs[0] is defalt path (QFI = 1)
upRoute := &netlink.Route{
LinkIndex: linkGREs[0].Attrs().Index,
Dst: &net.IPNet{
IP: net.IPv4zero,
Mask: net.IPv4Mask(0, 0, 0, 0),
},
}
if err := netlink.RouteAdd(upRoute); err != nil {
naslog.Warnf("netlink.RouteAdd: %+v", err)
}

n3ueSelf.PduSessionCount++
Expand Down
6 changes: 4 additions & 2 deletions pkg/procedure/Procedure.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,11 @@ func StartProcedure() {
AppLog.Info("PduSession Created")
if err := TestConnectivity("9.9.9.9"); err != nil {
AppLog.Errorf("ping fail : %+v", err)
} else if err := TestConnectivity("1.1.1.1"); err != nil {
}
if err := TestConnectivity("1.1.1.1"); err != nil {
AppLog.Errorf("ping fail : %+v", err)
} else if err := TestConnectivity("8.8.8.8"); err != nil {
}
if err := TestConnectivity("8.8.8.8"); err != nil {
AppLog.Errorf("ping fail : %+v", err)
} else {
logger.NASLog.Infof("ULCount=%x, DLCount=%x",
Expand Down

0 comments on commit 52eeaae

Please sign in to comment.