free5gc总结

# free5gc总结
## 一、编译
准备系统环境,建议内核在 5.0.0-23-generic以上
>OS: Ubuntu 18.04
>gcc 7.3.0
>Go 1.12.9 linux/amd64
>kernel version 5.0.0-23-generic (MUST for UPF)

**本机为Ubuntu 20.04,kernel为 5.4.0**
```bash
renzt@free5gc:~/go/src/go.mongodb.org$ uname -a
Linux free5gc 5.4.0-33-generic #37-Ubuntu SMP Thu May 21 12:53:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
```
按照github提示进行操作,但有些代码问题,需要自行处理。
### 1、提前准备mongodb驱动
在$GOPATH/go.mongo.org/目录下执行 **(注意不要使用官网mongo驱动,不兼容)** :
```bash
mkdir -p $GOPATH/go.mongo.org
git clone https://gitee.com/qiuyuyang/mongo-go-driver.git
```
将目录mongo-go-driver复制为mongo-driver:
```bash
cd $GOPATH/go.mongo.org/
cp mongo-go-driver mongo-driver
```
### 2、准备缺失go库
因下载受限,需要设置代理
```bash
export GOPROXY=https://goproxy.io
```
默认缺少crypto库,需要自行准备:
```bash
renzt@free5gc:~/go/src/golang.org/x$ git clone https://github.com/golang/crypto.git
```
### 3、代码bug
/home/renzt/go/src/free5gc/lib/ngap/ngapSctp/sctp.go
代码bug:失败时也会正常返回,导致panic。
不过全部调试通过后,程序走不到这块逻辑,也不影响测试结果,可忽略。
```golang
    ln, err := sctp.ListenSCTPExt("sctp", addr,
        sctp.InitMsg{NumOstreams: 3, MaxInstreams: 5, MaxAttempts: 4, MaxInitTimeout: 8})
    if err != nil {
        logger.NgapLog.Errorf("failed to listen: %v", err)
    }
    logger.NgapLog.Infof("Listen on %s", ln.Addr())
    return ln
```
**第二个bug,需要改代码**
```bash
../lib/MongoDBLibrary/api_mongoDB.go:25:57: cannot use options.ClientOptions literal (type options.ClientOptions) as type *options.ClientOptions in argument to mongo.Connect
#client, err := mongo.Connect(ctx, options.Client().ApplyURI(url)) ->
client, err := mongo.Connect(ctx, &options.Client().ApplyURI(url))
```
### 4、步骤修改
github中Network Setting
```bash
sudo sysctl -w net.ipv4.ip_forward=1
#sudo iptables -t nat -A POSTROUTING -o -j MASQUERADE,dn_interface替换为真实网卡,如eth0
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo systemctl stop ufw
```
### 5、运行和测试
独立运行没有问题,但测试时不能是运行状态,测试脚本中会用go自动运行程序。
(github和视频都没有说明此问题,我摸索了两天才搞定)
但ipsec需要提前设置(需要学习下ipsec知识....)
```bash
#sudo ip link add ipsec0 type vti local remote 0.0.0.0 key ->
sudo ip link add ipsec0 type vti local 192.168.11.1 remote 0.0.0.0 key 6
#sudo ip address add dev ipsec0
sudo ip address add 192.168.11.1 dev ipsec0
sudo ip link set dev ipsec0 up
```
## 二、开始测试
日志较多,为方便查看,只截取最后的日志。
**需要注意,执行完最后一个测试会自动清理ipsec,导致再次测试结果异常。需要再次执行如下命令**
```bash
#sudo ip link add ipsec0 type vti local remote 0.0.0.0 key ->
sudo ip link add ipsec0 type vti local 192.168.11.1 remote 0.0.0.0 key 6
#sudo ip address add dev ipsec0
sudo ip address add 192.168.11.1 dev ipsec0
sudo ip link set dev ipsec0 up
#检查网卡设置
renzt@free5gc:~/go/src/free5gc$ ip addr
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 60.60.0.1/32 scope global lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:09:e4:11 brd ff:ff:ff:ff:ff:ff
    inet 192.168.162.19/28 brd 192.168.162.31 scope global dynamic eth0
       valid_lft 86302sec preferred_lft 86302sec
    inet6 fe80::215:5dff:fe09:e411/64 scope link 
       valid_lft forever preferred_lft forever
20: ip_vti0@NONE: mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
64: veth0@if63: mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 16:e1:e4:5e:85:f7 brd ff:ff:ff:ff:ff:ff link-netns UPFns
    inet 10.200.200.1/24 scope global veth0
       valid_lft forever preferred_lft forever
    inet 10.200.200.2/24 scope global secondary veth0
       valid_lft forever preferred_lft forever
    inet6 fe80::14e1:e4ff:fe5e:85f7/64 scope link 
       valid_lft forever preferred_lft forever
65: ipsec0@NONE: mtu 1480 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ipip 192.168.11.1 brd 0.0.0.0
    inet 192.168.11.1/32 scope global ipsec0
       valid_lft forever preferred_lft forever
    inet6 fe80::5efe:c0a8:b01/64 scope link 
       valid_lft forever preferred_lft forever
```
**这样就解决了视频中51CTO老师的困惑:只能暂停、不能退出,否侧再次测试就不对了。**
### 1、测试注册
```bash
INFO[2020-06-10T15:55:14Z]/home/renzt/go/src/free5gc/src/amf/ngap/handler.go:50 free5gc/src/amf/ngap.HandleNGSetupRequest() [AMF] NG Setup request                        AMF=NGAP
INFO[2020-06-10T15:55:14Z]/home/renzt/go/src/free5gc/src/amf/ngap/message/send.go:79 free5gc/src/amf/ngap/message.SendNGSetupResponse() [AMF] Send NG-Setup response                  AMF=NGAP

```
### 2、测试服务请求
```bash
./test.sh TestServiceRequest
INFO[2020-06-10T15:53:07Z]/home/renzt/go/src/free5gc/src/amf/ngap/handler.go:50 free5gc/src/amf/ngap.HandleNGSetupRequest() [AMF] NG Setup request                        AMF=NGAP
INFO[2020-06-10T15:53:07Z]/home/renzt/go/src/free5gc/src/amf/ngap/message/send.go:79 free5gc/src/amf/ngap/message.SendNGSetupResponse() [AMF] Send NG-Setup response                  AMF=NGAP
=== RUN   TestRegistration
INFO[2020-06-10T15:55:14Z]/home/renzt/go/src/free5gc/src/amf/ngap/sctp/sctp.go:42 free5gc/src/amf/ngap/sctp.Server.func1() [AMF] NGAP SCTP Accept from: 127.0.0.1:9487   AMF=NGAP
INFO[2020-06-10T15:55:14Z]/home/renzt/go/src/free5gc/src/amf/ngap/handler.go:50 free5gc/src/amf/ngap.HandleNGSetupRequest() [AMF] NG Setup request                        AMF=NGAP
INFO[2020-06-10T15:55:14Z]/home/renzt/go/src/free5gc/src/amf/ngap/message/send.go:79 free5gc/src/amf/ngap/message.SendNGSetupResponse() [AMF] Send NG-Setup response                  AMF=NGAP
INFO[2020-06-10T15:56:42Z]/home/renzt/go/src/free5gc/src/nrf/management/api_management.go:697 free5gc/src/nrf/management.setLocationHeader() urilist create                                NRF=ManagementLog
INFO[2020-06-10T15:56:42Z]/home/renzt/go/src/free5gc/src/nrf/management/api_management.go:697 free5gc/src/nrf/management.setLocationHeader() urilist create                                NRF=ManagementLog
INFO[2020-06-10T15:56:43Z]/home/renzt/go/src/free5gc/src/nrf/management/api_management.go:697 free5gc/src/nrf/management.setLocationHeader() urilist create                                NRF=ManagementLog
INFO[2020-06-10T15:56:43Z]/home/renzt/go/src/free5gc/src/nrf/management/api_management.go:697 free5gc/src/nrf/management.setLocationHeader() urilist create                                NRF=ManagementLog
INFO[2020-06-10T15:56:43Z]/home/renzt/go/src/free5gc/src/nrf/management/api_management.go:697 free5gc/src/nrf/management.setLocationHeader() urilist create                                NRF=ManagementLog
INFO[2020-06-10T15:56:43Z]/home/renzt/go/src/free5gc/src/nrf/management/api_management.go:697 free5gc/src/nrf/management.setLocationHeader() urilist create                                NRF=ManagementLog
INFO[2020-06-10T15:56:44Z]/home/renzt/go/src/free5gc/src/nrf/management/api_management.go:697 free5gc/src/nrf/management.setLocationHeader() urilist create                                NRF=ManagementLog
^Csignal: interrupt
FAIL    free5gc/src/test    241.727s
```
**其余命令顺序做就可以,不再贴执行结果了**
### 3、测试Xn切换
```bash
./test.sh TestXnHandover

```
### 4、测试取消登记
```bash
./test.sh TestDeregistration

```
### 5、测试释放请求
```bash
./test.sh TestPDUSessionReleaseRequest

```
### 6、测试呼叫
```bash
./test.sh TestPaging

```
### 7、测试切换
```bash
./test.sh TestN2Handover

```
### 8、测试非3GPP网络
```bash
./test.sh TestNon3GPP

```
### 9、测试登记
```bash
./test_ulcl.sh -om 3 TestRegistration
#此测试脚本写的不完善,退出时没有正确处理清理动作,导致提示失败:
Cannot find device "br-veth02",

```

你可能感兴趣的:(free5gc总结)