1
1
package server
2
2
3
3
import (
4
+ "fmt"
4
5
"log"
5
6
"net"
6
7
8
+ "github.com/dot-5g/pfcp/client"
7
9
"github.com/dot-5g/pfcp/messages"
8
10
"github.com/dot-5g/pfcp/network"
9
11
)
10
12
11
- type HandleHeartbeatRequest func (address net. Addr , sequenceNumber uint32 , msg messages.HeartbeatRequest )
12
- type HandleHeartbeatResponse func (address net. Addr , sequenceNumber uint32 , msg messages.HeartbeatResponse )
13
- type HandlePFCPAssociationSetupRequest func (address net. Addr , sequenceNumber uint32 , msg messages.PFCPAssociationSetupRequest )
14
- type HandlePFCPAssociationSetupResponse func (address net. Addr , sequenceNumber uint32 , msg messages.PFCPAssociationSetupResponse )
15
- type HandlePFCPAssociationUpdateRequest func (address net. Addr , sequenceNumber uint32 , msg messages.PFCPAssociationUpdateRequest )
16
- type HandlePFCPAssociationUpdateResponse func (address net. Addr , sequenceNumber uint32 , msg messages.PFCPAssociationUpdateResponse )
17
- type HandlePFCPAssociationReleaseRequest func (address net. Addr , sequenceNumber uint32 , msg messages.PFCPAssociationReleaseRequest )
18
- type HandlePFCPAssociationReleaseResponse func (address net. Addr , sequenceNumber uint32 , msg messages.PFCPAssociationReleaseResponse )
19
- type HandlePFCPNodeReportRequest func (address net. Addr , sequenceNumber uint32 , msg messages.PFCPNodeReportRequest )
20
- type HandlePFCPNodeReportResponse func (address net. Addr , sequenceNumber uint32 , msg messages.PFCPNodeReportResponse )
21
- type HandlePFCPSessionEstablishmentRequest func (address net. Addr , sequenceNumber uint32 , seid uint64 , msg messages.PFCPSessionEstablishmentRequest )
22
- type HandlePFCPSessionEstablishmentResponse func (address net. Addr , sequenceNumber uint32 , seid uint64 , msg messages.PFCPSessionEstablishmentResponse )
23
- type HandlePFCPSessionDeletionRequest func (address net. Addr , sequenceNumber uint32 , seid uint64 , msg messages.PFCPSessionDeletionRequest )
24
- type HandlePFCPSessionDeletionResponse func (address net. Addr , sequenceNumber uint32 , seid uint64 , msg messages.PFCPSessionDeletionResponse )
25
- type HandlePFCPSessionReportRequest func (address net. Addr , sequenceNumber uint32 , seid uint64 , msg messages.PFCPSessionReportRequest )
26
- type HandlePFCPSessionReportResponse func (address net. Addr , sequenceNumber uint32 , seid uint64 , msg messages.PFCPSessionReportResponse )
13
+ type HandleHeartbeatRequest func (client * client. Pfcp , sequenceNumber uint32 , msg messages.HeartbeatRequest )
14
+ type HandleHeartbeatResponse func (client * client. Pfcp , sequenceNumber uint32 , msg messages.HeartbeatResponse )
15
+ type HandlePFCPAssociationSetupRequest func (client * client. Pfcp , sequenceNumber uint32 , msg messages.PFCPAssociationSetupRequest )
16
+ type HandlePFCPAssociationSetupResponse func (client * client. Pfcp , sequenceNumber uint32 , msg messages.PFCPAssociationSetupResponse )
17
+ type HandlePFCPAssociationUpdateRequest func (client * client. Pfcp , sequenceNumber uint32 , msg messages.PFCPAssociationUpdateRequest )
18
+ type HandlePFCPAssociationUpdateResponse func (client * client. Pfcp , sequenceNumber uint32 , msg messages.PFCPAssociationUpdateResponse )
19
+ type HandlePFCPAssociationReleaseRequest func (client * client. Pfcp , sequenceNumber uint32 , msg messages.PFCPAssociationReleaseRequest )
20
+ type HandlePFCPAssociationReleaseResponse func (client * client. Pfcp , sequenceNumber uint32 , msg messages.PFCPAssociationReleaseResponse )
21
+ type HandlePFCPNodeReportRequest func (client * client. Pfcp , sequenceNumber uint32 , msg messages.PFCPNodeReportRequest )
22
+ type HandlePFCPNodeReportResponse func (client * client. Pfcp , sequenceNumber uint32 , msg messages.PFCPNodeReportResponse )
23
+ type HandlePFCPSessionEstablishmentRequest func (client * client. Pfcp , sequenceNumber uint32 , seid uint64 , msg messages.PFCPSessionEstablishmentRequest )
24
+ type HandlePFCPSessionEstablishmentResponse func (client * client. Pfcp , sequenceNumber uint32 , seid uint64 , msg messages.PFCPSessionEstablishmentResponse )
25
+ type HandlePFCPSessionDeletionRequest func (client * client. Pfcp , sequenceNumber uint32 , seid uint64 , msg messages.PFCPSessionDeletionRequest )
26
+ type HandlePFCPSessionDeletionResponse func (client * client. Pfcp , sequenceNumber uint32 , seid uint64 , msg messages.PFCPSessionDeletionResponse )
27
+ type HandlePFCPSessionReportRequest func (client * client. Pfcp , sequenceNumber uint32 , seid uint64 , msg messages.PFCPSessionReportRequest )
28
+ type HandlePFCPSessionReportResponse func (client * client. Pfcp , sequenceNumber uint32 , seid uint64 , msg messages.PFCPSessionReportResponse )
27
29
28
30
type Server struct {
29
31
address string
30
32
udpServer * network.UdpServer
33
+ clients map [string ]* client.Pfcp
31
34
32
35
heartbeatRequestHandler HandleHeartbeatRequest
33
36
heartbeatResponseHandler HandleHeartbeatResponse
@@ -51,6 +54,7 @@ func New(address string) *Server {
51
54
server := & Server {
52
55
address : address ,
53
56
udpServer : network .NewUdpServer (),
57
+ clients : make (map [string ]* client.Pfcp ),
54
58
}
55
59
return server
56
60
}
@@ -65,6 +69,37 @@ func (server *Server) Close() {
65
69
server .udpServer .Close ()
66
70
}
67
71
72
+ func (server * Server ) GetClients () []* client.Pfcp {
73
+ clients := make ([]* client.Pfcp , 0 )
74
+ for _ , cl := range server .clients {
75
+ clients = append (clients , cl )
76
+ }
77
+ return clients
78
+ }
79
+
80
+ func (server * Server ) GetClientForAddress (addr net.Addr ) * client.Pfcp {
81
+ addrStr := addr .String ()
82
+ if cl , exists := server .clients [addrStr ]; exists {
83
+ return cl
84
+ }
85
+ return nil
86
+ }
87
+
88
+ func (server * Server ) ClientExistsForAddress (addr net.Addr ) bool {
89
+ client := server .GetClientForAddress (addr )
90
+ if client != nil {
91
+ return true
92
+ } else {
93
+ return false
94
+ }
95
+ }
96
+
97
+ func (server * Server ) AddClient (addr net.Addr ) {
98
+ addrStr := addr .String ()
99
+ cl := client .New (addrStr )
100
+ server .clients [addrStr ] = cl
101
+ }
102
+
68
103
func (server * Server ) HeartbeatRequest (handler HandleHeartbeatRequest ) {
69
104
server .heartbeatRequestHandler = handler
70
105
}
@@ -130,6 +165,7 @@ func (server *Server) PFCPSessionReportResponse(handler HandlePFCPSessionReportR
130
165
}
131
166
132
167
func (server * Server ) handlePFCPMessage (address net.Addr , payload []byte ) {
168
+
133
169
header , err := messages .DeserializeHeader (payload )
134
170
if err != nil {
135
171
log .Fatalf ("Error deserializing header: %v" , err )
@@ -147,6 +183,13 @@ func (server *Server) handlePFCPMessage(address net.Addr, payload []byte) {
147
183
}
148
184
payloadMessage := payload [payloadOffset :]
149
185
186
+ if ! server .ClientExistsForAddress (address ) {
187
+ fmt .Printf ("Adding client with address %s\n " , address )
188
+ server .AddClient (address )
189
+ }
190
+
191
+ pfcpClient := server .GetClientForAddress (address )
192
+
150
193
switch header .MessageType {
151
194
case messages .HeartbeatRequestMessageType :
152
195
if server .heartbeatRequestHandler == nil {
@@ -158,7 +201,7 @@ func (server *Server) handlePFCPMessage(address net.Addr, payload []byte) {
158
201
log .Printf ("Error deserializing Heartbeat Request: %v" , err )
159
202
return
160
203
}
161
- server .heartbeatRequestHandler (address , header .SequenceNumber , msg )
204
+ server .heartbeatRequestHandler (pfcpClient , header .SequenceNumber , msg )
162
205
case messages .HeartbeatResponseMessageType :
163
206
if server .heartbeatResponseHandler == nil {
164
207
log .Printf ("No handler for Heartbeat Response" )
@@ -169,7 +212,7 @@ func (server *Server) handlePFCPMessage(address net.Addr, payload []byte) {
169
212
log .Printf ("Error deserializing Heartbeat Response: %v" , err )
170
213
return
171
214
}
172
- server .heartbeatResponseHandler (address , header .SequenceNumber , msg )
215
+ server .heartbeatResponseHandler (pfcpClient , header .SequenceNumber , msg )
173
216
case messages .PFCPAssociationSetupRequestMessageType :
174
217
if server .pfcpAssociationSetupRequestHandler == nil {
175
218
log .Printf ("No handler for PFCP Association Setup Request" )
@@ -180,7 +223,7 @@ func (server *Server) handlePFCPMessage(address net.Addr, payload []byte) {
180
223
log .Printf ("Error deserializing PFCP Association Setup Request: %v" , err )
181
224
return
182
225
}
183
- server .pfcpAssociationSetupRequestHandler (address , header .SequenceNumber , msg )
226
+ server .pfcpAssociationSetupRequestHandler (pfcpClient , header .SequenceNumber , msg )
184
227
case messages .PFCPAssociationSetupResponseMessageType :
185
228
if server .pfcpAssociationSetupResponseHandler == nil {
186
229
log .Printf ("No handler for PFCP Association Setup Response" )
@@ -191,7 +234,7 @@ func (server *Server) handlePFCPMessage(address net.Addr, payload []byte) {
191
234
log .Printf ("Error deserializing PFCP Association Setup Response: %v" , err )
192
235
return
193
236
}
194
- server .pfcpAssociationSetupResponseHandler (address , header .SequenceNumber , msg )
237
+ server .pfcpAssociationSetupResponseHandler (pfcpClient , header .SequenceNumber , msg )
195
238
case messages .PFCPAssociationUpdateRequestMessageType :
196
239
if server .pfcpAssociationUpdateRequestHandler == nil {
197
240
log .Printf ("No handler for PFCP Association Update Request" )
@@ -202,7 +245,7 @@ func (server *Server) handlePFCPMessage(address net.Addr, payload []byte) {
202
245
log .Printf ("Error deserializing PFCP Association Update Request: %v" , err )
203
246
return
204
247
}
205
- server .pfcpAssociationUpdateRequestHandler (address , header .SequenceNumber , msg )
248
+ server .pfcpAssociationUpdateRequestHandler (pfcpClient , header .SequenceNumber , msg )
206
249
case messages .PFCPAssociationUpdateResponseMessageType :
207
250
if server .pfcpAssociationUpdateResponseHandler == nil {
208
251
log .Printf ("No handler for PFCP Association Update Response" )
@@ -213,7 +256,7 @@ func (server *Server) handlePFCPMessage(address net.Addr, payload []byte) {
213
256
log .Printf ("Error deserializing PFCP Association Update Response: %v" , err )
214
257
return
215
258
}
216
- server .pfcpAssociationUpdateResponseHandler (address , header .SequenceNumber , msg )
259
+ server .pfcpAssociationUpdateResponseHandler (pfcpClient , header .SequenceNumber , msg )
217
260
case messages .PFCPAssociationReleaseRequestMessageType :
218
261
if server .pfcpAssociationReleaseRequestHandler == nil {
219
262
log .Printf ("No handler for PFCP Association Release Request" )
@@ -224,7 +267,7 @@ func (server *Server) handlePFCPMessage(address net.Addr, payload []byte) {
224
267
log .Printf ("Error deserializing PFCP Association Release Request: %v" , err )
225
268
return
226
269
}
227
- server .pfcpAssociationReleaseRequestHandler (address , header .SequenceNumber , msg )
270
+ server .pfcpAssociationReleaseRequestHandler (pfcpClient , header .SequenceNumber , msg )
228
271
case messages .PFCPAssociationReleaseResponseMessageType :
229
272
if server .pfcpAssociationReleaseResponseHandler == nil {
230
273
log .Printf ("No handler for PFCP Association Release Response" )
@@ -235,7 +278,7 @@ func (server *Server) handlePFCPMessage(address net.Addr, payload []byte) {
235
278
log .Printf ("Error deserializing PFCP Association Release Response: %v" , err )
236
279
return
237
280
}
238
- server .pfcpAssociationReleaseResponseHandler (address , header .SequenceNumber , msg )
281
+ server .pfcpAssociationReleaseResponseHandler (pfcpClient , header .SequenceNumber , msg )
239
282
case messages .PFCPNodeReportRequestMessageType :
240
283
if server .pfcpNodeReportRequestHandler == nil {
241
284
log .Printf ("No handler for PFCP Node Report Request" )
@@ -246,7 +289,7 @@ func (server *Server) handlePFCPMessage(address net.Addr, payload []byte) {
246
289
log .Printf ("Error deserializing PFCP Node Report Request: %v" , err )
247
290
return
248
291
}
249
- server .pfcpNodeReportRequestHandler (address , header .SequenceNumber , msg )
292
+ server .pfcpNodeReportRequestHandler (pfcpClient , header .SequenceNumber , msg )
250
293
case messages .PFCPNodeReportResponseMessageType :
251
294
if server .pfcpNodeReportResponseHandler == nil {
252
295
log .Printf ("No handler for PFCP Node Report Response" )
@@ -257,7 +300,7 @@ func (server *Server) handlePFCPMessage(address net.Addr, payload []byte) {
257
300
log .Printf ("Error deserializing PFCP Node Report Response: %v" , err )
258
301
return
259
302
}
260
- server .pfcpNodeReportResponseHandler (address , header .SequenceNumber , msg )
303
+ server .pfcpNodeReportResponseHandler (pfcpClient , header .SequenceNumber , msg )
261
304
case messages .PFCPSessionEstablishmentRequestMessageType :
262
305
if server .pfcpSessionEstablishmentRequestHandler == nil {
263
306
log .Printf ("No handler for PFCP Session Establishment Request" )
@@ -268,7 +311,7 @@ func (server *Server) handlePFCPMessage(address net.Addr, payload []byte) {
268
311
log .Printf ("Error deserializing PFCP Session Establishment Request: %v" , err )
269
312
return
270
313
}
271
- server .pfcpSessionEstablishmentRequestHandler (address , header .SequenceNumber , header .SEID , msg )
314
+ server .pfcpSessionEstablishmentRequestHandler (pfcpClient , header .SequenceNumber , header .SEID , msg )
272
315
case messages .PFCPSessionEstablishmentResponseMessageType :
273
316
if server .pfcpSessionEstablishmentResponseHandler == nil {
274
317
log .Printf ("No handler for PFCP Session Establishment Response" )
@@ -279,7 +322,7 @@ func (server *Server) handlePFCPMessage(address net.Addr, payload []byte) {
279
322
log .Printf ("Error deserializing PFCP Session Establishment Response: %v" , err )
280
323
return
281
324
}
282
- server .pfcpSessionEstablishmentResponseHandler (address , header .SequenceNumber , header .SEID , msg )
325
+ server .pfcpSessionEstablishmentResponseHandler (pfcpClient , header .SequenceNumber , header .SEID , msg )
283
326
case messages .PFCPSessionDeletionRequestMessageType :
284
327
if server .pfcpSessionDeletionRequestHandler == nil {
285
328
log .Printf ("No handler for PFCP Session Deletion Request" )
@@ -290,7 +333,7 @@ func (server *Server) handlePFCPMessage(address net.Addr, payload []byte) {
290
333
log .Printf ("Error deserializing PFCP Session Deletion Request: %v" , err )
291
334
return
292
335
}
293
- server .pfcpSessionDeletionRequestHandler (address , header .SequenceNumber , header .SEID , msg )
336
+ server .pfcpSessionDeletionRequestHandler (pfcpClient , header .SequenceNumber , header .SEID , msg )
294
337
case messages .PFCPSessionDeletionResponseMessageType :
295
338
if server .pfcpSessionDeletionResponseHandler == nil {
296
339
log .Printf ("No handler for PFCP Session Deletion Response" )
@@ -301,7 +344,7 @@ func (server *Server) handlePFCPMessage(address net.Addr, payload []byte) {
301
344
log .Printf ("Error deserializing PFCP Session Deletion Response: %v" , err )
302
345
return
303
346
}
304
- server .pfcpSessionDeletionResponseHandler (address , header .SequenceNumber , header .SEID , msg )
347
+ server .pfcpSessionDeletionResponseHandler (pfcpClient , header .SequenceNumber , header .SEID , msg )
305
348
case messages .PFCPSessionReportRequestMessageType :
306
349
if server .pfcpSessionReportRequestHandler == nil {
307
350
log .Printf ("No handler for PFCP Session Report Request" )
@@ -312,7 +355,7 @@ func (server *Server) handlePFCPMessage(address net.Addr, payload []byte) {
312
355
log .Printf ("Error deserializing PFCP Session Report Request: %v" , err )
313
356
return
314
357
}
315
- server .pfcpSessionReportRequestHandler (address , header .SequenceNumber , header .SEID , msg )
358
+ server .pfcpSessionReportRequestHandler (pfcpClient , header .SequenceNumber , header .SEID , msg )
316
359
case messages .PFCPSessionReportResponseMessageType :
317
360
if server .pfcpSessionReportResponseHandler == nil {
318
361
log .Printf ("No handler for PFCP Session Report Response" )
@@ -323,7 +366,7 @@ func (server *Server) handlePFCPMessage(address net.Addr, payload []byte) {
323
366
log .Printf ("Error deserializing PFCP Session Report Response: %v" , err )
324
367
return
325
368
}
326
- server .pfcpSessionReportResponseHandler (address , header .SequenceNumber , header .SEID , msg )
369
+ server .pfcpSessionReportResponseHandler (pfcpClient , header .SequenceNumber , header .SEID , msg )
327
370
default :
328
371
log .Printf ("Unknown PFCP message type: %v" , header .MessageType )
329
372
}
0 commit comments