pdp: Introduce new API pdp_count_secondary
Change-Id: Id2d84ad1cdb0f3b500efeda4cc0fbccb24ae0c61
This commit is contained in:
parent
de72d26f49
commit
9ee8d3264b
14
gtp/gtp.c
14
gtp/gtp.c
|
@ -2454,8 +2454,7 @@ int gtp_delete_context_req2(struct gsn_t *gsn, struct pdp_t *pdp, void *cbp,
|
||||||
get_default_gtp(pdp->version, GTP_DELETE_PDP_REQ, &packet);
|
get_default_gtp(pdp->version, GTP_DELETE_PDP_REQ, &packet);
|
||||||
struct in_addr addr;
|
struct in_addr addr;
|
||||||
struct pdp_t *linked_pdp;
|
struct pdp_t *linked_pdp;
|
||||||
int n;
|
int count;
|
||||||
int count = 0;
|
|
||||||
|
|
||||||
if (gsna2in_addr(&addr, &pdp->gsnrc)) {
|
if (gsna2in_addr(&addr, &pdp->gsnrc)) {
|
||||||
gsn->err_address++;
|
gsn->err_address++;
|
||||||
|
@ -2470,9 +2469,7 @@ int gtp_delete_context_req2(struct gsn_t *gsn, struct pdp_t *pdp, void *cbp,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!teardown) {
|
if (!teardown) {
|
||||||
for (n = 0; n < PDP_MAXNSAPI; n++)
|
count = pdp_count_secondary(linked_pdp);
|
||||||
if (linked_pdp->secondary_tei[n])
|
|
||||||
count++;
|
|
||||||
if (count <= 1) {
|
if (count <= 1) {
|
||||||
LOGP(DLGTP, LOGL_ERROR,
|
LOGP(DLGTP, LOGL_ERROR,
|
||||||
"Must use teardown for last context: %d\n", count);
|
"Must use teardown for last context: %d\n", count);
|
||||||
|
@ -2562,8 +2559,7 @@ int gtp_delete_pdp_ind(struct gsn_t *gsn, int version,
|
||||||
|
|
||||||
uint8_t nsapi;
|
uint8_t nsapi;
|
||||||
uint8_t teardown = 0;
|
uint8_t teardown = 0;
|
||||||
int n;
|
int count;
|
||||||
int count = 0;
|
|
||||||
|
|
||||||
/* Is this a duplicate ? */
|
/* Is this a duplicate ? */
|
||||||
if (!gtp_duplicate(gsn, version, peer, seq)) {
|
if (!gtp_duplicate(gsn, version, peer, seq)) {
|
||||||
|
@ -2633,9 +2629,7 @@ int gtp_delete_pdp_ind(struct gsn_t *gsn, int version,
|
||||||
* signalling messages will eventually lead to a consistent
|
* signalling messages will eventually lead to a consistent
|
||||||
* situation, allowing the teardown of the PDP context.)
|
* situation, allowing the teardown of the PDP context.)
|
||||||
*/
|
*/
|
||||||
for (n = 0; n < PDP_MAXNSAPI; n++)
|
count = pdp_count_secondary(linked_pdp);
|
||||||
if (linked_pdp->secondary_tei[n])
|
|
||||||
count++;
|
|
||||||
if (count <= 1) {
|
if (count <= 1) {
|
||||||
GTP_LOGPKG(LOGL_NOTICE, peer, pack, len,
|
GTP_LOGPKG(LOGL_NOTICE, peer, pack, len,
|
||||||
"Ignoring CTX DEL without teardown and count=%d\n",
|
"Ignoring CTX DEL without teardown and count=%d\n",
|
||||||
|
|
14
gtp/pdp.c
14
gtp/pdp.c
|
@ -374,3 +374,17 @@ void pdp_set_imsi_nsapi(struct pdp_t *pdp, uint64_t teid)
|
||||||
pdp->imsi = teid & 0x0fffffffffffffffull;
|
pdp->imsi = teid & 0x0fffffffffffffffull;
|
||||||
pdp->nsapi = (teid & 0xf000000000000000ull) >> 60;
|
pdp->nsapi = (teid & 0xf000000000000000ull) >> 60;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Count amount of secondary PDP contexts linked to this primary PDP context
|
||||||
|
* (itself included). Must be called on a primary PDP context. */
|
||||||
|
unsigned int pdp_count_secondary(struct pdp_t *pdp)
|
||||||
|
{
|
||||||
|
unsigned int n;
|
||||||
|
unsigned int count = 0;
|
||||||
|
OSMO_ASSERT(!pdp->secondary);
|
||||||
|
|
||||||
|
for (n = 0; n < PDP_MAXNSAPI; n++)
|
||||||
|
if (pdp->secondary_tei[n])
|
||||||
|
count++;
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
|
@ -260,6 +260,8 @@ int pdp_tidget(struct pdp_t **pdp, uint64_t tid);
|
||||||
|
|
||||||
void pdp_set_imsi_nsapi(struct pdp_t *pdp, uint64_t teid);
|
void pdp_set_imsi_nsapi(struct pdp_t *pdp, uint64_t teid);
|
||||||
|
|
||||||
|
unsigned int pdp_count_secondary(struct pdp_t *pdp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
int pdp_iphash(void* ipif, struct ul66_t *eua);
|
int pdp_iphash(void* ipif, struct ul66_t *eua);
|
||||||
int pdp_ipset(struct pdp_t *pdp, void* ipif, struct ul66_t *eua);
|
int pdp_ipset(struct pdp_t *pdp, void* ipif, struct ul66_t *eua);
|
||||||
|
|
Loading…
Reference in New Issue