Skip to content

Commit 45a89f8

Browse files
authored
chore: avoid re-fetching sm context unnecessarily in SMF (#949)
Signed-off-by: Guillaume Belanger <guillaume.belanger27@gmail.com>
1 parent 1652afc commit 45a89f8

13 files changed

Lines changed: 108 additions & 128 deletions

internal/decoder/nas/qos_rule.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ func unmarshalQosRule(b []byte) (QosRule, int, error) {
171171
// Packet filters
172172
r.PacketFilterList = r.PacketFilterList[:0]
173173

174-
for i := 0; i < numPF; i++ {
174+
for i := range numPF {
175175
if cc >= len(content) {
176176
return r, 0, io.ErrUnexpectedEOF
177177
}

internal/smf/context/datapath.go

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,10 @@ func (dp *DataPath) DeactivateDownLinkTunnel(smf *SMF) {
7777
dp.DownLinkTunnel = &GTPTunnel{}
7878
}
7979

80-
func (dp *DataPath) ActivateUpLinkPdr(dnn string, pduAddress net.IP, defQER *QER, defURR *URR, defPrecedence uint32) {
80+
func (dp *DataPath) ActivateUpLinkPdr(dnn string, pduAddress net.IP, defQER *QER, defURR *URR) {
8181
dp.UpLinkTunnel.PDR.QER = defQER
8282
dp.UpLinkTunnel.PDR.URR = defURR
8383

84-
// Set Default precedence
85-
if dp.UpLinkTunnel.PDR.Precedence == 0 {
86-
dp.UpLinkTunnel.PDR.Precedence = defPrecedence
87-
}
88-
8984
dp.UpLinkTunnel.PDR.PDI.SourceInterface = SourceInterface{InterfaceValue: SourceInterfaceAccess}
9085
dp.UpLinkTunnel.PDR.PDI.LocalFTeID = &FTEID{
9186
Ch: true,
@@ -116,14 +111,10 @@ func (dp *DataPath) ActivateUpLinkPdr(dnn string, pduAddress net.IP, defQER *QER
116111
dp.UpLinkTunnel.PDR.FAR.ForwardingParameters.DestinationInterface.InterfaceValue = DestinationInterfaceSgiLanN6Lan
117112
}
118113

119-
func (dp *DataPath) ActivateDlLinkPdr(dnn string, anIP net.IP, teid uint32, pduAddress net.IP, defQER *QER, defURR *URR, defPrecedence uint32) {
114+
func (dp *DataPath) ActivateDlLinkPdr(dnn string, anIP net.IP, teid uint32, pduAddress net.IP, defQER *QER, defURR *URR) {
120115
dp.DownLinkTunnel.PDR.QER = defQER
121116
dp.DownLinkTunnel.PDR.URR = defURR
122117

123-
if dp.DownLinkTunnel.PDR.Precedence == 0 {
124-
dp.DownLinkTunnel.PDR.Precedence = defPrecedence
125-
}
126-
127118
dp.DownLinkTunnel.PDR.PDI.SourceInterface = SourceInterface{InterfaceValue: SourceInterfaceCore}
128119
dp.DownLinkTunnel.PDR.PDI.NetworkInstance = dnn
129120
dp.DownLinkTunnel.PDR.PDI.UEIPAddress = &UEIPAddress{
@@ -146,8 +137,10 @@ func (dp *DataPath) ActivateDlLinkPdr(dnn string, anIP net.IP, teid uint32, pduA
146137
}
147138
}
148139

149-
func (dp *DataPath) ActivateTunnelAndPDR(smf *SMF, smContext *SMContext, smPolicyDecision *models.SmPolicyData, pduAddress net.IP, precedence uint32) error {
150-
smContext.AllocateLocalSEIDForDataPath(smf)
140+
func (dp *DataPath) ActivateTunnelAndPDR(smf *SMF, smContext *SMContext, smPolicyDecision *models.SmPolicyData, pduAddress net.IP) error {
141+
seid := smf.AllocateLocalSEID()
142+
143+
smContext.SetPFCPSession(seid)
151144

152145
ulPdr, err := smf.NewPDR()
153146
if err != nil {
@@ -178,9 +171,9 @@ func (dp *DataPath) ActivateTunnelAndPDR(smf *SMF, smContext *SMContext, smPolic
178171
return fmt.Errorf("could not create downlink URR: %v", err)
179172
}
180173

181-
dp.ActivateUpLinkPdr(smContext.Dnn, pduAddress, defQER, defULURR, precedence)
174+
dp.ActivateUpLinkPdr(smContext.Dnn, pduAddress, defQER, defULURR)
182175

183-
dp.ActivateDlLinkPdr(smContext.Dnn, smContext.Tunnel.ANInformation.IPAddress, smContext.Tunnel.ANInformation.TEID, pduAddress, defQER, defDLURR, precedence)
176+
dp.ActivateDlLinkPdr(smContext.Dnn, smContext.Tunnel.ANInformation.IPAddress, smContext.Tunnel.ANInformation.TEID, pduAddress, defQER, defDLURR)
184177

185178
dp.Activated = true
186179

internal/smf/context/datapath_test.go

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,14 @@ func TestActivateUpLinkPdr(t *testing.T) {
1818
dp := &context.DataPath{
1919
UpLinkTunnel: &context.GTPTunnel{
2020
PDR: &context.PDR{
21-
Precedence: 0,
22-
FAR: &context.FAR{},
21+
FAR: &context.FAR{},
2322
},
2423
},
2524
}
2625

2726
ip := net.IPv4(192, 168, 1, 1)
2827

29-
dp.ActivateUpLinkPdr("internet", ip, defQER, defURR, 10)
28+
dp.ActivateUpLinkPdr("internet", ip, defQER, defURR)
3029

3130
if dp.UpLinkTunnel.PDR == nil {
3231
t.Fatalf("expected pdr to be not nil")
@@ -68,16 +67,15 @@ func TestActivateDlLinkPdr(t *testing.T) {
6867
dp := &context.DataPath{
6968
DownLinkTunnel: &context.GTPTunnel{
7069
PDR: &context.PDR{
71-
Precedence: 0,
72-
FAR: &context.FAR{},
73-
URR: &context.URR{},
70+
FAR: &context.FAR{},
71+
URR: &context.URR{},
7472
},
7573
},
7674
}
7775

7876
ip := net.IPv4(192, 168, 1, 1)
7977

80-
dp.ActivateDlLinkPdr("internet", net.IP{10, 0, 0, 1}, 12345, ip, defQER, defURR, 10)
78+
dp.ActivateDlLinkPdr("internet", net.IP{10, 0, 0, 1}, 12345, ip, defQER, defURR)
8179

8280
if dp.DownLinkTunnel.PDR == nil {
8381
t.Fatalf("expected pdr to be not nil")

internal/smf/context/pfcp_rules.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,9 @@ type PDR struct {
4444
URR *URR
4545
QER *QER
4646

47-
PDI PDI
48-
State RuleState
49-
PDRID uint16
50-
Precedence uint32
47+
PDI PDI
48+
State RuleState
49+
PDRID uint16
5150
}
5251

5352
type FTEID struct {

internal/smf/context/sm_context.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,17 @@ func (smContext *SMContext) SetSMPolicyData(smPolicyData *models.SmPolicyData) {
5050

5151
smContext.PolicyData = smPolicyData
5252
}
53+
54+
func (smContext *SMContext) SetPFCPSession(seid uint64) {
55+
if smContext.PFCPContext != nil {
56+
return
57+
}
58+
59+
smContext.PFCPContext = &PFCPSessionContext{
60+
LocalSEID: seid,
61+
}
62+
}
63+
64+
func (smContext *SMContext) CanonicalName() string {
65+
return CanonicalName(smContext.Supi, smContext.PDUSessionID)
66+
}

internal/smf/context/smf.go

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ type SnssaiSmfInfo struct {
6969
}
7070

7171
// RetrieveDnnInformation gets the corresponding dnn info from S-NSSAI and DNN
72-
func (smf *SMF) RetrieveDnnInformation(ctx context.Context, ueSnssai models.Snssai, dnn string) (*SnssaiSmfDnnInfo, error) {
72+
func (smf *SMF) RetrieveDnnInformation(ctx context.Context, ueSnssai *models.Snssai, dnn string) (*SnssaiSmfDnnInfo, error) {
7373
supportedSnssai, err := smf.GetSnssaiInfo(ctx, dnn)
7474
if err != nil {
7575
return nil, fmt.Errorf("failed to get snssai information: %v", err)
@@ -195,25 +195,18 @@ func (smf *SMF) GetSMContextBySEID(seid uint64) *SMContext {
195195
return nil
196196
}
197197

198-
func (smContext *SMContext) AllocateLocalSEIDForDataPath(smf *SMF) {
199-
if smContext.PFCPContext != nil {
200-
return
201-
}
202-
203-
smContext.PFCPContext = &PFCPSessionContext{
204-
LocalSEID: smf.AllocateLocalSEID(),
205-
}
206-
}
207-
208-
func (smf *SMF) NewSMContext(supi string, pduSessID uint8) *SMContext {
198+
func (smf *SMF) NewSMContext(supi string, pduSessionID uint8, dnn string, snssai *models.Snssai) *SMContext {
209199
smf.Mutex.Lock()
210200
defer smf.Mutex.Unlock()
211201

212202
smContext := &SMContext{
213-
PDUSessionID: pduSessID,
203+
PDUSessionID: pduSessionID,
204+
Supi: supi,
205+
Dnn: dnn,
206+
Snssai: snssai,
214207
}
215208

216-
ref := CanonicalName(supi, pduSessID)
209+
ref := CanonicalName(supi, pduSessionID)
217210
smf.smContextPool[ref] = smContext
218211

219212
return smContext

internal/smf/pdusession/handle_create_sm_context.go

Lines changed: 29 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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

7878
func 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
9595
func 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

205197
func 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
}

internal/smf/pdusession/handle_release_sm_context.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ func ReleaseSmContext(ctx context.Context, smContextRef string) error {
3838

3939
err = releaseTunnel(ctx, smf, smContext)
4040
if err != nil {
41-
smf.RemoveSMContext(ctx, smfContext.CanonicalName(smContext.Supi, smContext.PDUSessionID))
41+
smf.RemoveSMContext(ctx, smContext.CanonicalName())
4242
return fmt.Errorf("release tunnel failed: %v", err)
4343
}
4444

45-
smf.RemoveSMContext(ctx, smfContext.CanonicalName(smContext.Supi, smContext.PDUSessionID))
45+
smf.RemoveSMContext(ctx, smContext.CanonicalName())
4646

4747
return nil
4848
}

internal/smf/pdusession/handle_update_sm_context_n2_info_pdu_res_rel_rsp.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func UpdateSmContextN2InfoPduResRelRsp(ctx context.Context, smContextRef string)
3939

4040
smContext.PDUSessionReleaseDueToDupPduID = false
4141

42-
smf.RemoveSMContext(ctx, smfContext.CanonicalName(smContext.Supi, smContext.PDUSessionID))
42+
smf.RemoveSMContext(ctx, smContext.CanonicalName())
4343

4444
return nil
4545
}

internal/smf/pfcp/build.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ func createPDIIE(pdi *context.PDI) *ie.IE {
8282
func pdrToCreatePDR(pdr *context.PDR) *ie.IE {
8383
ies := make([]*ie.IE, 0)
8484
ies = append(ies, ie.NewPDRID(pdr.PDRID))
85-
ies = append(ies, ie.NewPrecedence(pdr.Precedence))
8685
ies = append(ies, createPDIIE(&pdr.PDI))
8786

8887
if pdr.OuterHeaderRemoval != nil {
@@ -255,7 +254,6 @@ func boolToInt(b bool) int {
255254
func pdrToUpdatePDR(pdr *context.PDR) *ie.IE {
256255
updatePDRies := make([]*ie.IE, 0)
257256
updatePDRies = append(updatePDRies, ie.NewPDRID(pdr.PDRID))
258-
updatePDRies = append(updatePDRies, ie.NewPrecedence(pdr.Precedence))
259257
updatePDRies = append(updatePDRies, createPDIIE(&pdr.PDI))
260258

261259
if pdr.OuterHeaderRemoval != nil {

0 commit comments

Comments
 (0)