【5G核心网】free5GC AMF源码分析

2023-05-16

free5gc AMF 源码分析

    

结构体 Sbi

type Sbi struct {
	Scheme       string `yaml:"scheme"`
	RegisterIPv4 string `yaml:"registerIPv4,omitempty"` // IP that is registered at NRF.
	// IPv6Addr string `yaml:"ipv6Addr,omitempty"`
	BindingIPv4 string `yaml:"bindingIPv4,omitempty"` // IP used to run the server in the node.
	Port        int    `yaml:"port,omitempty"`
}

 

1. AMF 程序初始化以及启动

   1.1 启动 httpcallback 服务

     httpcallback.AddService(router),实现在 afm/httpcallback 中,URL 以及 handler 如下所示:

Name

Pattern

HandlerFunc

Index
/
Index
SmContextStatusNotify
/smContextStatus/:guti/:pduSessionId
SmContextStatusNotify
AmPolicyControlUpdateNotifyUpdate
/am-policy/:polAssoId/update
AmPolicyControlUpdateNotifyUpdate
AmPolicyControlUpdateNotifyTerminate
/am-policy/:polAssoId/terminate
AmPolicyControlUpdateNotifyTerminate
N1MessageNotify
/n1-message-notify
N1MessageNotify

    1.2 根据配置文件中的服务列表启动服务

       serviceNameList: - namf-comm - namf-evts - namf-mt - namf-loc - namf-oam

for _, serviceName := range factory.AmfConfig.Configuration.ServiceNameList {
	switch models.ServiceName(serviceName) {
	case models.ServiceName_NAMF_COMM:
		communication.AddService(router)
	case models.ServiceName_NAMF_EVTS:
		eventexposure.AddService(router)
	case models.ServiceName_NAMF_MT:
		mt.AddService(router)
	case models.ServiceName_NAMF_LOC:
		location.AddService(router)
	}
}

    1.3 初始化 amf 上下文

     通过配置文件,较简单,amf 监听端口为 29518

	self := context.AMF_Self()
	util.InitAmfContext(self)

	addr := fmt.Sprintf("%s:%d", self.HttpIPv4Address, self.HttpIpv4Port)

    1.4 根据 ngap IP 列表建立 SCTP 服务

      TCP是以字节为单位传输的,SCTP是以数据块为单位传输的

      TCP通常是单路径传输,SCTP可以多路径传输

	for _, ngapAddr := range self.NgapIpList {
		sctpListener = sctp.Server(ngapAddr)
	}

     1.4.1 SCTP Server

       每次新建立的连接,将消息设置为 EventNGAPAcceptConn 丢进 channel 进行处理,丢进 channel 处理, 处理函数 NewAmfRan 则实例化 AmfRan, 存贮在 AmfRanPool 中,key 为对端 IP 地址

       forwardData 函数根据接收到的数据包,统一设置类型为 EventNGAPMessage,丢进 chanel,等待函数 ngap.Dispatch(msg.NgapAddr, msg.Value.([]byte)) 处理

func Server(addrStr string) (listener *SCTPListener) {
	ln := ngapSctp.Server(addrStr)
	listener = &SCTPListener{
		ln:   ln,
		conn: make(map[string]net.Conn),
	}
	go listener.forwardData()

	// Wait for accept connection
	go func(l *SCTPListener) {
		for {
			conn, err := ngapSctp.Accept(ln)
			if err != nil {
				logger.NgapLog.Warn(err.Error())
				continue
			}
			logger.NgapLog.Infof("[AMF] NGAP SCTP Accept from: %s", conn.RemoteAddr().String())
			// send connection to amf handler
			msg := amf_message.HandlerMessage{}
			msg.Event = amf_message.EventNGAPAcceptConn
			msg.Value = conn
			amf_message.SendMessage(msg)
			l.mtx.Lock()
			l.conn[conn.RemoteAddr().String()] = conn
			l.mtx.Unlock()
			go ngapSctp.Start(conn, readChan)

			// put connection into global conn
			// SctpConnection = append(SctpConnection, conn)
		}

	}(listener)
	return
}

      1.5 核心处理流程

      实现在 amf/handler/hander.go

go handler.Handle()

    1.6 注册到 NRF

      amf id 组成 regionId: 16bits, setId: 10bits, ptrId: 6bits    <AMF Identifier> = <AMF Region ID><AMF Set ID><AMF Pointer>

      调用 NRF Nnrf_NFManagement,注册

// Register to NRF
profile, err := consumer.BuildNFInstance(self)
if err != nil {
	initLog.Error("Build AMF Profile Error")
}

_, self.NfId, _ = consumer.SendRegisterNFInstance(self.NrfUri, self.NfId, profile)

 

2. RAN 发起的 NGSetupRequest 消息

     NG Setup 流程用来交换 NG-RAN 节点和 AMF 在 NG-C 接口上正确互操作所需的应用程序数据,该程序应是 TNL 关联开始运行后触发的第一个 NGAP 程序。该过程使用 非UE 相关的信令。

    2.1 NGAP 结构体

type NGAPPDU struct {
	Present             int
	InitiatingMessage   *InitiatingMessage
	SuccessfulOutcome   *SuccessfulOutcome
	UnsuccessfulOutcome *UnsuccessfulOutcome
}

    Present 设置为 NGAPPDUPresentInitiatingMessage

    2.2 InitiatingMessage 结构体

type InitiatingMessage struct {
	ProcedureCode ProcedureCode
	Criticality   Criticality
	Value         InitiatingMessageValue `aper:"openType,referenceFieldName:ProcedureCode"`
}

    initiatingMessage ProcedureCode 设置为 ProcedureCodeNGSetup  InitiatingMessagePresentNGSetupRequest

NG-RAN -> AMF 的 NG SETUP REQUEST

    当使用 NG-RAN 时,N2 参数包括所选的 PLMN ID、位置信息和与 Ue 所在小区相关的身份、Ue 上下文请求,该请求指明需要在 NG-RAN 中设置一个包含安全信息的 Ue 上下文 。也包括建立的原因,
    如果可用的话,才提供请求的 NSSAI 映射
    如果 UE 注册类型指明是定期注册更新,则省略 4 - 19 步骤
    如果 UE 包含首选的网络行为

    2.3 AMF 接收 NGSetupRequest 消息

      根据 NGAPPDUPresentInitiatingMessage 和 ProcedureCodeNGSetup 定位到 HandleNGSetupRequest

func HandleNGSetupRequest(ran *context.AmfRan, message *ngapType.NGAPPDU) {
	var globalRANNodeID *ngapType.GlobalRANNodeID
	var rANNodeName *ngapType.RANNodeName
	var supportedTAList *ngapType.SupportedTAList
	var pagingDRX *ngapType.PagingDRX

	var cause ngapType.Cause

    主要是验证信息,如果验证通过则 SendNGSetupResponse,失败则调用 SendNGSetupFailure

    如果成功则发送 NGAPPDUPresentSuccessfulOutcome,类型为 SuccessfulOutcomePresentNGSetupResponse,包括 IE:AMFName,ServedGUAMIList,relativeAMFCapacity,pLMNSupportList

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【5G核心网】free5GC AMF源码分析 的相关文章

  • Android Volley源码分析(1)

    1 Volley newRequestQueue 我们从Volley中RequestQueue的初始化入手 xff0c 开始进行分析 应用利用Volley java的静态方法 xff0c 获取RequestQueue xff0c 开启使用V
  • RxJava 2.x 源码分析 之 FlatMap

    FlatMap 官方定义 xff1a 把被观察者发射出去的事件转化成新的子被观察者 xff0c 然后把这些发射量展开平铺后统一放到一个被观察者中 官方文档 简单来讲就是把被观察者每次发射的事件转化成一个子被观察者 xff0c 然后通过合并
  • PX4源码分析__传感器数据“sensor_combined”的来龙去脉

    注 xff1a 本讲解基于V1 10 2源码版本 一 sensor combined 的来源 module cpp src templates module line 166 struct sensor combined s sensor
  • PX4源码分析3:attitude_estimator_q(转载)

    原文链接 xff1a https blog csdn net zouxu634866 article details 79806948 include span class token operator lt span drivers sp
  • PX4源码分析6:位置结算模块需要掌握哪几个核心点?

    位置解算源码位置 xff1a local position estimator main cpp 核心点1 xff1a 在北东地坐标系里 xff0c 如何由准确加速度对飞机的三维速度和三维位置进行估计 xff1f 核心点2 xff1a 如图
  • Apache IoTDB’s UDF源码分析(1)

    目录 前言 命令行注册UDF函数 Create Function xxx as 34 全限定类名 34 语法分析 生成物理计划 执行物理计划进行函数注册 Select带有UDF函数的查询 前言 继上个月开始了Apache IoTDB的源码贡
  • docker源码分析(1)(持续更新)

    docker源码分析 xff08 1 xff09 xff08 持续更新 xff09 daemondocker DaemonClient的启动内部函数分析newAPIServerConfigloadListenersinitContainer
  • 【Linux】mjpg-streamer 源码分析

    文章目录 1 总体流程2 主进程的源码分析2 1 参数接收与解析2 2 获取参数2 3 调用输入函数2 3 1 程序手动中断信号2 3 2 strchr 函数2 3 3 strndup 函数2 3 4 分离参数 3 输入通道源码分析3 1
  • telegram android 源码分析 (一)自动设置代理

    比如自动设置mtproxy代理 xff0c 冗长的代码我们怎么去找 xff1f 1 xff09 首先我们发现点代理链接能弹对话框 xff0c 们可以在strings xml中搜索得到 xff1a lt string name 61 34 U
  • px4flow源码分析

    Flow c 计算光流用的是 SAD块匹配算法 第一部分是生成直方图 xff0c 第二部分是根据直方图来进行位移向量的计算 外部的 j i的for循环是采样点的循环 xff0c 内部的jj ii的循环是对于一个小邻域的采样 采样点是从 im
  • Hadoop源码分析——JobClient

    1 MapReduce作业处理过程概述 当用户使用Hadoop的Mapreduce计算模型来进行处理问题时 xff0c 用户只需要定义所需的Mapper和Reduce处理函数 xff0c 还有可能包括的Combiner Comparator
  • PX4源码分析1_PX4源码的下载和编译

    一 基本信息 xff1a 1 软件系统 xff1a Ubuntu 14 04 64bit 2 源码位置 xff1a https github com PX4 Firmware 3 参考博客 xff1a xff08 1 xff09 libin
  • Netty源码分析 (八)----- write过程 源码分析

    上一篇文章主要讲了netty的read过程 xff0c 本文主要分析一下write和writeAndFlush 主要内容 本文分以下几个部分阐述一个java对象最后是如何转变成字节流 xff0c 写到socket缓冲区中去的 pipelin
  • ucos源码分析(一)

    时间 2018 01 27 本人目前是大三学生 电子信息工程专业 xff0c 在大学前俩年的时间 xff0c 一直在使用和学习单片机 xff0c 不过也仅仅是从 xff15 xff11 到 xff13 xff12 xff0c 马上要面临就业
  • 【ROS】源码分析-消息订阅与发布

    说明 本文通过NodeHandle subscribe和Publication publish 源码作为入口 xff0c 来分析PubNode SubNode之间是网络连接是如何建立的 xff0c 消息是如何发布的 xff0c topic队
  • elasticjob 源码分析

    简介 elasticjob是基于quartz构建支持分片的分布式弹性可伸缩的job执行组件 zookeeper节点数据设计 job leader election latch instance 主节点的实例ID 临时节点 在节点选举成功后添
  • Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理(2.15.0-RC1、2.15.0、2.16.0)

    系列文章 2 15 0之前版漏洞相关文章 Log4j2注入漏洞 CVE 2021 44228 万字深度剖析 一 开篇与基础知识 Log4j2注入漏洞 CVE 2021 44228 万字深度剖析 二 漏洞原理 Log4j2注入漏洞 CVE 2
  • 【源码分析】zeebe actor模型源码解读

    zeebe actor 模型 如果有阅读过zeebe 源码的朋友一定能够经常看到actor run 之类的语法 那么这篇文章就围绕actor run 方法 说说zeebe actor 的模型 环境 zeebe release 8 1 14
  • Faster RCNN 源码解读(1) -- 文件结构分析

    基本介绍 Faster RCNN 在目标检测及其相关领域得到了广泛的运用 其原型RCNN是将CNN引入到目标检测的开山之作 此外基于region proposal是一种十分值得学习的思想 因此将在后续的系列章节中 基于源码 对Faster
  • 汇编 - ORG指令详解

    ORG指令 ORG是Origin的缩写 起始地址 源 在汇编语言源程序的开始通常都用一条ORG伪指令来实现规定程序的起始地址 如果不用ORG规定则汇编得到的目标程序将从0000H开始 例如 ORG 2000H START MOV AX 00

随机推荐