@@ -46,9 +46,9 @@ func CreateSmContext(ctx context.Context, supi string, pduSessionID uint8, dnn s
4646 }
4747 }
4848
49- smContext = smf .NewSMContext (supi , pduSessionID )
49+ smContext = smf .NewSMContext (supi , pduSessionID , dnn , snssai )
5050
51- smContextRef , pco , dnnInfo , pduAddress , pti , smPolicyUpdates , errRsp , err := handlePDUSessionSMContextCreate (ctx , smf , supi , dnn , snssai , n1Msg , smContext )
51+ pco , dnnInfo , pduAddress , pti , smPolicyUpdates , errRsp , err := handlePDUSessionSMContextCreate (ctx , smf , n1Msg , smContext )
5252 if err != nil {
5353 return "" , errRsp , fmt .Errorf ("failed to create SM Context: %v" , err )
5454 }
@@ -57,7 +57,7 @@ func CreateSmContext(ctx context.Context, supi string, pduSessionID uint8, dnn s
5757 return "" , errRsp , nil
5858 }
5959
60- err = sendPFCPRules (ctx , smf , smContext )
60+ err = sendPFCPRules (ctx , smf . CPNodeID , smContext )
6161 if err != nil {
6262 err := sendPduSessionEstablishmentReject (ctx , smContext , smPolicyUpdates , pti )
6363 if err != nil {
@@ -72,14 +72,14 @@ func CreateSmContext(ctx context.Context, supi string, pduSessionID uint8, dnn s
7272 return "" , nil , fmt .Errorf ("failed to send pdu session establishment accept n1 message: %v" , err )
7373 }
7474
75- return smContextRef , nil , nil
75+ return smContext . CanonicalName () , nil , nil
7676}
7777
7878func handlePduSessionContextReplacement (ctx context.Context , smf * smfContext.SMF , smCtxt * smfContext.SMContext ) error {
7979 smCtxt .Mutex .Lock ()
8080 defer smCtxt .Mutex .Unlock ()
8181
82- smf .RemoveSMContext (ctx , smfContext .CanonicalName (smCtxt . Supi , smCtxt . PDUSessionID ))
82+ smf .RemoveSMContext (ctx , smCtxt .CanonicalName ())
8383
8484 // Check if UPF session set, send release
8585 if smCtxt .Tunnel != nil {
@@ -95,13 +95,9 @@ func handlePduSessionContextReplacement(ctx context.Context, smf *smfContext.SMF
9595func handlePDUSessionSMContextCreate (
9696 ctx context.Context ,
9797 smf * smfContext.SMF ,
98- supi string ,
99- dnn string ,
100- snssai * models.Snssai ,
10198 n1Msg []byte ,
10299 smContext * smfContext.SMContext ,
103100) (
104- string ,
105101 * smfNas.ProtocolConfigurationOptions ,
106102 * smfContext.SnssaiSmfDnnInfo ,
107103 net.IP ,
@@ -114,52 +110,48 @@ func handlePDUSessionSMContextCreate(
114110
115111 err := m .GsmMessageDecode (& n1Msg )
116112 if err != nil {
117- return "" , nil , nil , nil , 0 , nil , nil , fmt .Errorf ("error decoding NAS message: %v" , err )
113+ return nil , nil , nil , 0 , nil , nil , fmt .Errorf ("error decoding NAS message: %v" , err )
118114 }
119115
120116 if m .GsmHeader .GetMessageType () != nas .MsgTypePDUSessionEstablishmentRequest {
121- return "" , nil , nil , nil , 0 , nil , nil , fmt .Errorf ("error decoding NAS message: %v" , err )
117+ return nil , nil , nil , 0 , nil , nil , fmt .Errorf ("error decoding NAS message: %v" , err )
122118 }
123119
124120 smContext .Mutex .Lock ()
125121 defer smContext .Mutex .Unlock ()
126122
127123 pti := m .PDUSessionEstablishmentRequest .GetPTI ()
128124
129- smContext .Supi = supi
130- smContext .Dnn = dnn
131- smContext .Snssai = snssai
132-
133125 subscriberPolicy , err := smf .GetSubscriberPolicy (ctx , smContext .Supi )
134126 if err != nil {
135127 rsp , err := smfNas .BuildGSMPDUSessionEstablishmentReject (smContext .PDUSessionID , pti , nasMessage .Cause5GSMRequestRejectedUnspecified )
136128 if err != nil {
137129 logger .SmfLog .Error ("failed to build PDU Session Establishment Reject message" , zap .Error (err ), zap .String ("supi" , smContext .Supi ), zap .Uint8 ("pduSessionID" , smContext .PDUSessionID ))
138130 }
139131
140- return "" , nil , nil , nil , 0 , nil , rsp , fmt .Errorf ("failed to find subscriber policy: %v" , err )
132+ return nil , nil , nil , 0 , nil , rsp , fmt .Errorf ("failed to find subscriber policy: %v" , err )
141133 }
142134
143- dnnInfo , err := smf .RetrieveDnnInformation (ctx , * snssai , dnn )
135+ dnnInfo , err := smf .RetrieveDnnInformation (ctx , smContext . Snssai , smContext . Dnn )
144136 if err != nil {
145- logger .SmfLog .Warn ("error retrieving DNN information" , zap .String ("SST" , fmt .Sprintf ("%d" , snssai . Sst )), zap .String ("SD" , snssai . Sd ), zap .String ("DNN" , dnn ), zap .Error (err ))
137+ logger .SmfLog .Warn ("error retrieving DNN information" , zap .String ("SST" , fmt .Sprintf ("%d" , smContext . Snssai . Sst )), zap .String ("SD" , smContext . Snssai . Sd ), zap .String ("DNN" , smContext . Dnn ), zap .Error (err ))
146138
147- rsp , err := smfNas .BuildGSMPDUSessionEstablishmentReject (smContext .PDUSessionID , pti , nasMessage .Cause5GMMDNNNotSupportedOrNotSubscribedInTheSlice )
148- if err != nil {
139+ rsp , err1 := smfNas .BuildGSMPDUSessionEstablishmentReject (smContext .PDUSessionID , pti , nasMessage .Cause5GMMDNNNotSupportedOrNotSubscribedInTheSlice )
140+ if err1 != nil {
149141 logger .SmfLog .Error ("failed to build PDU Session Establishment Reject message" , zap .Error (err ), zap .String ("supi" , smContext .Supi ), zap .Uint8 ("pduSessionID" , smContext .PDUSessionID ))
150142 }
151143
152- return "" , nil , nil , nil , 0 , nil , rsp , nil
144+ return nil , nil , nil , 0 , nil , rsp , fmt . Errorf ( "failed to retrieve DNN information: %v" , err )
153145 }
154146
155147 pduAddress , err := smf .DBInstance .AllocateIP (ctx , smContext .Supi )
156148 if err != nil {
157- rsp , err := smfNas .BuildGSMPDUSessionEstablishmentReject (smContext .PDUSessionID , pti , nasMessage .Cause5GSMInsufficientResources )
158- if err != nil {
149+ rsp , err1 := smfNas .BuildGSMPDUSessionEstablishmentReject (smContext .PDUSessionID , pti , nasMessage .Cause5GSMInsufficientResources )
150+ if err1 != nil {
159151 logger .SmfLog .Error ("failed to build PDU Session Establishment Reject message" , zap .Error (err ), zap .String ("supi" , smContext .Supi ), zap .Uint8 ("pduSessionID" , smContext .PDUSessionID ))
160152 }
161153
162- return "" , nil , nil , nil , 0 , nil , rsp , nil
154+ return nil , nil , nil , 0 , nil , rsp , fmt . Errorf ( "failed to allocate IP address: %v" , err )
163155 }
164156
165157 logger .SmfLog .Info ("Successfully allocated IP address" , zap .String ("IP" , pduAddress .String ()), zap .String ("supi" , smContext .Supi ), zap .Uint8 ("pduSessionID" , smContext .PDUSessionID ))
@@ -175,7 +167,7 @@ func handlePDUSessionSMContextCreate(
175167 logger .SmfLog .Error ("failed to build PDU Session Establishment Reject message" , zap .Error (err ), zap .String ("supi" , smContext .Supi ), zap .Uint8 ("pduSessionID" , smContext .PDUSessionID ))
176168 }
177169
178- return "" , nil , nil , nil , 0 , nil , response , err
170+ return nil , nil , nil , 0 , nil , response , err
179171 }
180172
181173 defaultPath := & smfContext.DataPath {
@@ -187,19 +179,19 @@ func handlePDUSessionSMContextCreate(
187179 DataPath : defaultPath ,
188180 }
189181
190- err = defaultPath .ActivateTunnelAndPDR (smf , smContext , subscriberPolicy , pduAddress , 255 )
182+ err = defaultPath .ActivateTunnelAndPDR (smf , smContext , subscriberPolicy , pduAddress )
191183 if err != nil {
192184 response , err := smfNas .BuildGSMPDUSessionEstablishmentReject (smContext .PDUSessionID , pti , nasMessage .Cause5GSMRequestRejectedUnspecified )
193185 if err != nil {
194186 logger .SmfLog .Error ("failed to build PDU Session Establishment Reject message" , zap .Error (err ), zap .String ("supi" , smContext .Supi ), zap .Uint8 ("pduSessionID" , smContext .PDUSessionID ))
195187 }
196188
197- return "" , nil , nil , nil , 0 , nil , response , fmt .Errorf ("couldn't activate data path: %v" , err )
189+ return nil , nil , nil , 0 , nil , response , fmt .Errorf ("couldn't activate data path: %v" , err )
198190 }
199191
200192 logger .SmfLog .Info ("Successfully created PDU session context" , zap .String ("supi" , smContext .Supi ), zap .Uint8 ("pduSessionID" , smContext .PDUSessionID ))
201193
202- return smfContext . CanonicalName ( smContext . Supi , smContext . PDUSessionID ), pco , dnnInfo , pduAddress , pti , subscriberPolicy , nil , nil
194+ return pco , dnnInfo , pduAddress , pti , subscriberPolicy , nil , nil
203195}
204196
205197func handlePDUSessionEstablishmentRequest (req * nasMessage.PDUSessionEstablishmentRequest ) (* smfNas.ProtocolConfigurationOptions , error ) {
@@ -242,7 +234,10 @@ func handlePDUSessionEstablishmentRequest(req *nasMessage.PDUSessionEstablishmen
242234}
243235
244236// SendPFCPRules send all datapaths to UPFs
245- func sendPFCPRules (ctx context.Context , smf * smfContext.SMF , smContext * smfContext.SMContext ) error {
237+ func sendPFCPRules (ctx context.Context , cpNodeID net.IP , smContext * smfContext.SMContext ) error {
238+ smContext .Mutex .Lock ()
239+ defer smContext .Mutex .Unlock ()
240+
246241 dataPath := smContext .Tunnel .DataPath
247242 if ! dataPath .Activated {
248243 logger .SmfLog .Debug ("DataPath is not activated, skip sending PFCP rules" )
@@ -281,17 +276,19 @@ func sendPFCPRules(ctx context.Context, smf *smfContext.SMF, smContext *smfConte
281276 }
282277
283278 if smContext .PFCPContext == nil || smContext .PFCPContext .RemoteSEID == 0 {
284- err := pfcp .SendPfcpSessionEstablishmentRequest (ctx , smf , smContext .PFCPContext .LocalSEID , pdrList , farList , qerList , urrList )
279+ result , err := pfcp .SendPfcpSessionEstablishmentRequest (ctx , cpNodeID , smContext .PFCPContext .LocalSEID , pdrList , farList , qerList , urrList )
285280 if err != nil {
286281 return fmt .Errorf ("failed to send PFCP session establishment request: %v" , err )
287282 }
288283
289- logger .SmfLog .Info ("Sent PFCP session establishment request to upf" )
284+ smContext .PFCPContext .RemoteSEID = result .RemoteSEID
285+ smContext .Tunnel .DataPath .UpLinkTunnel .TEID = result .TEID
286+ smContext .Tunnel .DataPath .UpLinkTunnel .N3IP = result .N3IP
290287
291288 return nil
292289 }
293290
294- err := pfcp .SendPfcpSessionModificationRequest (ctx , smf . CPNodeID , smContext .PFCPContext .LocalSEID , smContext .PFCPContext .RemoteSEID , pdrList , farList , qerList )
291+ err := pfcp .SendPfcpSessionModificationRequest (ctx , cpNodeID , smContext .PFCPContext .LocalSEID , smContext .PFCPContext .RemoteSEID , pdrList , farList , qerList )
295292 if err != nil {
296293 return fmt .Errorf ("failed to send PFCP session modification request: %v" , err )
297294 }
0 commit comments