Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
spbro
OpenXG-RAN
Commits
e7a43fb3
Commit
e7a43fb3
authored
May 11, 2021
by
Laurent THOMAS
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix 4G DL rb id
parent
bfd7954f
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
43 additions
and
30 deletions
+43
-30
openair3/ocp-gtpu/gtp_itf.cpp
openair3/ocp-gtpu/gtp_itf.cpp
+42
-29
openair3/ocp-gtpu/gtp_itf.h
openair3/ocp-gtpu/gtp_itf.h
+1
-1
No files found.
openair3/ocp-gtpu/gtp_itf.cpp
View file @
e7a43fb3
...
...
@@ -62,7 +62,7 @@ typedef struct {
typedef
struct
{
rnti_t
rnti
;
ebi_t
rb_id
;
ebi_t
incoming_
rb_id
;
gtpCallback
callBack
;
}
rntiData_t
;
...
...
@@ -156,14 +156,14 @@ static int gtpv1uCreateAndSendMsg(int h, uint32_t peerIp, uint16_t peerPort, te
static
void
gtpv1uSend
(
instance_t
instance
,
gtpv1u_enb_tunnel_data_req_t
*
req
,
bool
seqNumFlag
,
bool
npduNumFlag
)
{
uint8_t
*
buffer
=
req
->
buffer
+
req
->
offset
;
size_t
length
=
req
->
length
;
uint64
_t
rnti
=
req
->
rnti
;
rnti
_t
rnti
=
req
->
rnti
;
int
rab_id
=
req
->
rab_id
;
pthread_mutex_lock
(
&
globGtp
.
gtp_lock
);
auto
inst
=&
globGtp
.
instances
[
compatInst
(
instance
)];
auto
ptrRnti
=
inst
->
ue2te_mapping
.
find
(
rnti
);
if
(
ptrRnti
==
inst
->
ue2te_mapping
.
end
()
)
{
LOG_E
(
GTPU
,
"gtpv1uSend failed: while getting ue rnti %
l
x in hashtable ue_mapping
\n
"
,
rnti
);
LOG_E
(
GTPU
,
"gtpv1uSend failed: while getting ue rnti %x in hashtable ue_mapping
\n
"
,
rnti
);
pthread_mutex_unlock
(
&
globGtp
.
gtp_lock
);
return
;
}
...
...
@@ -171,11 +171,11 @@ static void gtpv1uSend(instance_t instance, gtpv1u_enb_tunnel_data_req_t *req, b
auto
ptr
=
ptrRnti
->
second
.
bearers
;
if
(
ptr
.
find
(
rab_id
)
==
ptr
.
end
()
)
{
LOG_E
(
GTPU
,
"sending a packet to a non existant RNTI:RAB: %
l
x/%x
\n
"
,
rnti
,
rab_id
);
LOG_E
(
GTPU
,
"sending a packet to a non existant RNTI:RAB: %x/%x
\n
"
,
rnti
,
rab_id
);
pthread_mutex_unlock
(
&
globGtp
.
gtp_lock
);
return
;
}
else
LOG_D
(
GTPU
,
"sending a packet to RNTI:RAB:teid %
l
x/%x/%x, len %lu, oldseq %d, oldnum %d
\n
"
,
LOG_D
(
GTPU
,
"sending a packet to RNTI:RAB:teid %x/%x/%x, len %lu, oldseq %d, oldnum %d
\n
"
,
rnti
,
rab_id
,
ptr
[
rab_id
].
teid_outgoing
,
length
,
ptr
[
rab_id
].
seqNum
,
ptr
[
rab_id
].
npduNum
);
if
(
seqNumFlag
)
...
...
@@ -197,14 +197,14 @@ static void gtpv1uSend(instance_t instance, gtpv1u_enb_tunnel_data_req_t *req, b
static
void
gtpv1uSend2
(
instance_t
instance
,
gtpv1u_gnb_tunnel_data_req_t
*
req
,
bool
seqNumFlag
,
bool
npduNumFlag
)
{
uint8_t
*
buffer
=
req
->
buffer
+
req
->
offset
;
size_t
length
=
req
->
length
;
uint64
_t
rnti
=
req
->
rnti
;
rnti
_t
rnti
=
req
->
rnti
;
int
rab_id
=
req
->
pdusession_id
;
pthread_mutex_lock
(
&
globGtp
.
gtp_lock
);
auto
inst
=&
globGtp
.
instances
[
compatInst
(
instance
)];
auto
ptrRnti
=
inst
->
ue2te_mapping
.
find
(
rnti
);
if
(
ptrRnti
==
inst
->
ue2te_mapping
.
end
()
)
{
LOG_E
(
GTPU
,
"gtpv1uSend failed: while getting ue rnti %
l
x in hashtable ue_mapping
\n
"
,
rnti
);
LOG_E
(
GTPU
,
"gtpv1uSend failed: while getting ue rnti %x in hashtable ue_mapping
\n
"
,
rnti
);
pthread_mutex_unlock
(
&
globGtp
.
gtp_lock
);
return
;
}
...
...
@@ -212,11 +212,11 @@ static void gtpv1uSend2(instance_t instance, gtpv1u_gnb_tunnel_data_req_t *req,
auto
ptr
=
ptrRnti
->
second
.
bearers
;
if
(
ptr
.
find
(
rab_id
)
==
ptr
.
end
()
)
{
LOG_E
(
GTPU
,
"sending a packet to a non existant RNTI:RAB: %
l
x/%x
\n
"
,
rnti
,
rab_id
);
LOG_E
(
GTPU
,
"sending a packet to a non existant RNTI:RAB: %x/%x
\n
"
,
rnti
,
rab_id
);
pthread_mutex_unlock
(
&
globGtp
.
gtp_lock
);
return
;
}
else
LOG_D
(
GTPU
,
"sending a packet to RNTI:RAB:teid %
l
x/%x/%x, len %lu, oldseq %d, oldnum %d
\n
"
,
LOG_D
(
GTPU
,
"sending a packet to RNTI:RAB:teid %x/%x/%x, len %lu, oldseq %d, oldnum %d
\n
"
,
rnti
,
rab_id
,
ptr
[
rab_id
].
teid_outgoing
,
length
,
ptr
[
rab_id
].
seqNum
,
ptr
[
rab_id
].
npduNum
);
if
(
seqNumFlag
)
...
...
@@ -236,14 +236,14 @@ static void gtpv1uSend2(instance_t instance, gtpv1u_gnb_tunnel_data_req_t *req,
}
static
void
gtpv1uEndTunnel
(
instance_t
instance
,
gtpv1u_enb_tunnel_data_req_t
*
req
)
{
uint64
_t
rnti
=
req
->
rnti
;
rnti
_t
rnti
=
req
->
rnti
;
int
rab_id
=
req
->
rab_id
;
pthread_mutex_lock
(
&
globGtp
.
gtp_lock
);
auto
inst
=&
globGtp
.
instances
[
compatInst
(
instance
)];
auto
ptrRnti
=
inst
->
ue2te_mapping
.
find
(
rnti
);
if
(
ptrRnti
==
inst
->
ue2te_mapping
.
end
()
)
{
LOG_E
(
GTPU
,
"gtpv1uSend failed: while getting ue rnti %
l
x in hashtable ue_mapping
\n
"
,
rnti
);
LOG_E
(
GTPU
,
"gtpv1uSend failed: while getting ue rnti %x in hashtable ue_mapping
\n
"
,
rnti
);
pthread_mutex_unlock
(
&
globGtp
.
gtp_lock
);
return
;
}
...
...
@@ -251,11 +251,11 @@ static void gtpv1uEndTunnel(instance_t instance, gtpv1u_enb_tunnel_data_req_t *r
auto
ptr
=
ptrRnti
->
second
.
bearers
;
if
(
ptr
.
find
(
rab_id
)
==
ptr
.
end
()
)
{
LOG_E
(
GTPU
,
"sending a packet to a non existant RNTI:RAB: %
l
x/%x
\n
"
,
rnti
,
rab_id
);
LOG_E
(
GTPU
,
"sending a packet to a non existant RNTI:RAB: %x/%x
\n
"
,
rnti
,
rab_id
);
pthread_mutex_unlock
(
&
globGtp
.
gtp_lock
);
return
;
}
else
LOG_D
(
GTPU
,
"sending a end packet packet to RNTI:RAB:teid %
l
x/%x/%x
\n
"
,
LOG_D
(
GTPU
,
"sending a end packet packet to RNTI:RAB:teid %x/%x/%x
\n
"
,
rnti
,
rab_id
,
ptr
[
rab_id
].
teid_outgoing
);
ocp_gtpv1u_bearer_t
tmp
=
ptr
[
rab_id
];
...
...
@@ -386,8 +386,8 @@ instance_t ocp_gtpv1Init(openAddr_t context) {
return
id
;
}
teid_t
newGtpuCreateTunnel
(
instance_t
instance
,
rnti_t
rnti
,
int
bearer_id
,
teid_t
outgoing_teid
,
transport_layer_addr_t
remoteAddr
,
int
port
,
gtpCallback
callBack
)
{
teid_t
newGtpuCreateTunnel
(
instance_t
instance
,
rnti_t
rnti
,
int
incoming_bearer_id
,
int
outgoing_
bearer_id
,
teid_t
outgoing_teid
,
transport_layer_addr_t
remoteAddr
,
int
port
,
gtpCallback
callBack
)
{
pthread_mutex_lock
(
&
globGtp
.
gtp_lock
);
auto
inst
=&
globGtp
.
instances
[
instance
];
auto
it
=
inst
->
ue2te_mapping
.
find
(
rnti
);
...
...
@@ -400,17 +400,17 @@ teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int bearer_id, teid
uint32_t
incoming_teid
=
gtpv1uNewTeid
();
while
(
inst
->
te2ue_mapping
.
find
(
incoming_teid
)
!=
inst
->
te2ue_mapping
.
end
()
)
{
LOG_W
(
GTPU
,
"generated a random Teid that exists, re-generating (%
u
)
\n
"
,
incoming_teid
);
LOG_W
(
GTPU
,
"generated a random Teid that exists, re-generating (%
x
)
\n
"
,
incoming_teid
);
incoming_teid
=
gtpv1uNewTeid
();
};
inst
->
te2ue_mapping
[
incoming_teid
].
rnti
=
rnti
;
inst
->
te2ue_mapping
[
incoming_teid
].
rb_id
=
outgoing_te
id
;
inst
->
te2ue_mapping
[
incoming_teid
].
incoming_rb_id
=
incoming_bearer_
id
;
inst
->
te2ue_mapping
[
incoming_teid
].
callBack
=
callBack
;
auto
tmp
=&
inst
->
ue2te_mapping
[
rnti
].
bearers
[
bearer_id
];
auto
tmp
=&
inst
->
ue2te_mapping
[
rnti
].
bearers
[
outgoing_
bearer_id
];
int
addrs_length_in_bytes
=
remoteAddr
.
length
/
8
;
...
...
@@ -433,14 +433,15 @@ teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int bearer_id, teid
default:
AssertFatal
(
false
,
"SGW Address size impossible"
);
}
tmp
->
teid_incoming
=
incoming_teid
;
tmp
->
outgoing_port
=
port
;
tmp
->
teid_outgoing
=
outgoing_teid
;
pthread_mutex_unlock
(
&
globGtp
.
gtp_lock
);
LOG_I
(
GTPU
,
"Created tunnel for RNTI %x,
teid for DL: %d, teid for UL %d
\n
"
,
LOG_I
(
GTPU
,
"Created tunnel for RNTI %x,
bearer: %d/%d teid for DL: %x, teid for UL %x
\n
"
,
rnti
,
tmp
->
teid_incoming
,
outgoing_bearer_id
,
incoming_bearer_id
,
tmp
->
teid_incoming
,
tmp
->
teid_outgoing
);
return
incoming_teid
;
}
...
...
@@ -448,13 +449,18 @@ teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int bearer_id, teid
int
ocp_gtpv1u_create_s1u_tunnel
(
instance_t
instance
,
const
gtpv1u_enb_create_tunnel_req_t
*
create_tunnel_req
,
gtpv1u_enb_create_tunnel_resp_t
*
create_tunnel_resp
)
{
LOG_D
(
GTPU
,
"Start create tunnels for RNTI %x, num_tunnels %d, sgw_S1u_teid %
d
\n
"
,
LOG_D
(
GTPU
,
"Start create tunnels for RNTI %x, num_tunnels %d, sgw_S1u_teid %
x
\n
"
,
create_tunnel_req
->
rnti
,
create_tunnel_req
->
num_tunnels
,
create_tunnel_req
->
sgw_S1u_teid
[
0
]);
for
(
int
i
=
0
;
i
<
create_tunnel_req
->
num_tunnels
;
i
++
)
{
AssertFatal
(
create_tunnel_req
->
eps_bearer_id
[
i
]
>
4
,
"From legacy code not clear, seems impossible (bearer=%d)
\n
"
,
create_tunnel_req
->
eps_bearer_id
[
i
]);
int
incoming_rb_id
=
create_tunnel_req
->
eps_bearer_id
[
i
]
-
4
;
teid_t
teid
=
newGtpuCreateTunnel
(
compatInst
(
instance
),
create_tunnel_req
->
rnti
,
incoming_rb_id
,
create_tunnel_req
->
eps_bearer_id
[
i
],
create_tunnel_req
->
sgw_S1u_teid
[
i
],
create_tunnel_req
->
sgw_addr
[
i
],
2152
,
...
...
@@ -477,7 +483,7 @@ int ocp_gtpv1u_update_s1u_tunnel(
const
gtpv1u_enb_create_tunnel_req_t
*
const
create_tunnel_req
,
const
rnti_t
prior_rnti
)
{
LOG_D
(
GTPU
,
"Start update tunnels for old RNTI %x, new RNTI %x, num_tunnels %d, sgw_S1u_teid %
d, eps_bearer_id %d
\n
"
,
LOG_D
(
GTPU
,
"Start update tunnels for old RNTI %x, new RNTI %x, num_tunnels %d, sgw_S1u_teid %
x, eps_bearer_id %x
\n
"
,
prior_rnti
,
create_tunnel_req
->
rnti
,
create_tunnel_req
->
num_tunnels
,
...
...
@@ -509,13 +515,14 @@ int ocp_gtpv1u_update_s1u_tunnel(
int
gtpv1u_create_ngu_tunnel
(
const
instance_t
instance
,
const
gtpv1u_gnb_create_tunnel_req_t
*
const
create_tunnel_req
,
gtpv1u_gnb_create_tunnel_resp_t
*
const
create_tunnel_resp
)
{
LOG_D
(
GTPU
,
"Start create tunnels for RNTI %x, num_tunnels %d, sgw_S1u_teid %
d
\n
"
,
LOG_D
(
GTPU
,
"Start create tunnels for RNTI %x, num_tunnels %d, sgw_S1u_teid %
x
\n
"
,
create_tunnel_req
->
rnti
,
create_tunnel_req
->
num_tunnels
,
create_tunnel_req
->
upf_NGu_teid
[
0
]);
for
(
int
i
=
0
;
i
<
create_tunnel_req
->
num_tunnels
;
i
++
)
{
teid_t
teid
=
newGtpuCreateTunnel
(
compatInst
(
instance
),
create_tunnel_req
->
rnti
,
create_tunnel_req
->
pdusession_id
[
i
],
create_tunnel_req
->
pdusession_id
[
i
],
create_tunnel_req
->
upf_NGu_teid
[
i
],
create_tunnel_req
->
upf_addr
[
i
],
2152
,
...
...
@@ -560,13 +567,19 @@ int newGtpuDeleteTunnel(instance_t instance, rnti_t rnti) {
return
-
1
;
}
int
nb
=
0
;
for
(
auto
j
=
it
->
second
.
bearers
.
begin
();
j
!=
it
->
second
.
bearers
.
end
();
++
j
)
++
j
)
{
inst
->
te2ue_mapping
.
erase
(
j
->
second
.
teid_incoming
);
nb
++
;
}
inst
->
ue2te_mapping
.
erase
(
it
);
pthread_mutex_unlock
(
&
globGtp
.
gtp_lock
);
LOG_I
(
GTPU
,
"Deleted all tunnels for RNTI %d (%d tunnels deleted)
\n
"
,
rnti
,
nb
);
return
!
GTPNOK
;
}
...
...
@@ -634,7 +647,7 @@ static int Gtpv1uHandleEndMarker(int h,
auto
tunnel
=
inst
->
te2ue_mapping
.
find
(
ntohl
(
msgHdr
->
teid
));
if
(
tunnel
==
inst
->
te2ue_mapping
.
end
()
)
{
LOG_E
(
GTPU
,
"Received a incoming packet on unknown teid (%
d
) Dropping!
\n
"
,
msgHdr
->
teid
);
LOG_E
(
GTPU
,
"Received a incoming packet on unknown teid (%
x
) Dropping!
\n
"
,
msgHdr
->
teid
);
pthread_mutex_unlock
(
&
globGtp
.
gtp_lock
);
return
GTPNOK
;
}
...
...
@@ -653,7 +666,7 @@ static int Gtpv1uHandleEndMarker(int h,
ctxt
.
configured
=
0
;
ctxt
.
brOption
=
0
;
const
srb_flag_t
srb_flag
=
SRB_FLAG_NO
;
const
rb_id_t
rb_id
=
tunnel
->
second
.
rb_id
;
const
rb_id_t
rb_id
=
tunnel
->
second
.
incoming_
rb_id
;
const
mui_t
mui
=
RLC_MUI_UNDEFINED
;
const
confirm_t
confirm
=
RLC_SDU_CONFIRM_NO
;
const
pdcp_transmission_mode_t
mode
=
PDCP_TRANSMISSION_MODE_DATA
;
...
...
@@ -695,7 +708,7 @@ static int Gtpv1uHandleGpdu(int h,
auto
tunnel
=
inst
->
te2ue_mapping
.
find
(
ntohl
(
msgHdr
->
teid
));
if
(
tunnel
==
inst
->
te2ue_mapping
.
end
()
)
{
LOG_E
(
GTPU
,
"Received a incoming packet on unknown teid (%
d
) Dropping!
\n
"
,
msgHdr
->
teid
);
LOG_E
(
GTPU
,
"Received a incoming packet on unknown teid (%
x
) Dropping!
\n
"
,
msgHdr
->
teid
);
pthread_mutex_unlock
(
&
globGtp
.
gtp_lock
);
return
GTPNOK
;
}
...
...
@@ -719,7 +732,7 @@ static int Gtpv1uHandleGpdu(int h,
ctxt
.
configured
=
0
;
ctxt
.
brOption
=
0
;
const
srb_flag_t
srb_flag
=
SRB_FLAG_NO
;
const
rb_id_t
rb_id
=
tunnel
->
second
.
rb_id
;
const
rb_id_t
rb_id
=
tunnel
->
second
.
incoming_
rb_id
;
const
mui_t
mui
=
RLC_MUI_UNDEFINED
;
const
confirm_t
confirm
=
RLC_SDU_CONFIRM_NO
;
const
sdu_size_t
sdu_buffer_size
=
msgBufLen
-
offset
;
...
...
openair3/ocp-gtpu/gtp_itf.h
View file @
e7a43fb3
...
...
@@ -60,7 +60,7 @@ int ocp_gtpv1u_create_x2u_tunnel(
// New API
teid_t
newGtpuCreateTunnel
(
instance_t
instance
,
rnti_t
rnti
,
int
bearer
_id
,
teid_t
teid
,
teid_t
newGtpuCreateTunnel
(
instance_t
instance
,
rnti_t
rnti
,
int
incoming_bearer_id
,
int
outgoing_rb
_id
,
teid_t
teid
,
transport_layer_addr_t
remoteAddr
,
int
port
,
gtpCallback
callBack
);
instance_t
ocp_gtpv1Init
(
openAddr_t
context
);
void
*
ocp_gtpv1uTask
(
void
*
args
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment