Change-Id: Ia8d595095462c30a56b8a0b30c8d24632776e4cc
This commit is contained in:
Daniel Willmann
2024-03-06 11:53:37 +01:00
parent 6536376527
commit 54fcd64fc7
4 changed files with 26 additions and 15 deletions

View File

@@ -245,7 +245,7 @@ int gtp_set_cb_data_ind(struct gsn_t *gsn,
return 0; return 0;
} }
int gtp_set_cb_sgsn_context_request_ind(struct gsn_t *gsn, int gtp_set_cb_sgsn_context_request_ind(struct gsn_t *gsn,
int (*cb) (struct gsn_t *gsn, struct sockaddr_in *peer, const struct osmo_routing_area_id *rai, uint32_t teic, struct osmo_mobile_identity *mi, union gtpie_member **ie)) int (*cb) (struct gsn_t *gsn, struct sockaddr_in *peer, uint16_t seq, const struct osmo_routing_area_id *rai, uint32_t teic, struct osmo_mobile_identity *mi, union gtpie_member **ie))
{ {
gsn->cb_sgsn_context_request_ind = cb; gsn->cb_sgsn_context_request_ind = cb;
return 0; return 0;

View File

@@ -109,7 +109,7 @@ struct gsn_t {
int (*cb_recovery) (struct sockaddr_in * peer, uint8_t recovery); int (*cb_recovery) (struct sockaddr_in * peer, uint8_t recovery);
int (*cb_recovery2) (struct sockaddr_in * peer, struct pdp_t * pdp, uint8_t recovery); int (*cb_recovery2) (struct sockaddr_in * peer, struct pdp_t * pdp, uint8_t recovery);
int (*cb_recovery3) (struct gsn_t *gsn, struct sockaddr_in *peer, struct pdp_t *pdp, uint8_t recovery); int (*cb_recovery3) (struct gsn_t *gsn, struct sockaddr_in *peer, struct pdp_t *pdp, uint8_t recovery);
int (*cb_sgsn_context_request_ind) (struct gsn_t *gsn, struct sockaddr_in *peer, const struct osmo_routing_area_id *rai, uint32_t teic, struct osmo_mobile_identity *mi, union gtpie_member **ie); /* Pass RAI and TLLI/TMSI/IMSI directly */ int (*cb_sgsn_context_request_ind) (struct gsn_t *gsn, struct sockaddr_in *peer, uint16_t seq, const struct osmo_routing_area_id *rai, uint32_t teic, struct osmo_mobile_identity *mi, union gtpie_member **ie); /* Pass RAI and TLLI/TMSI/IMSI directly */
/* Counters */ /* Counters */
struct rate_ctr_group *ctrg; struct rate_ctr_group *ctrg;
@@ -158,7 +158,7 @@ extern int gtp_set_cb_ran_info_relay_ind(struct gsn_t *gsn,
int (*cb) (struct sockaddr_in * peer, union gtpie_member **ie)); int (*cb) (struct sockaddr_in * peer, union gtpie_member **ie));
extern int gtp_set_cb_sgsn_context_request_ind(struct gsn_t *gsn, extern int gtp_set_cb_sgsn_context_request_ind(struct gsn_t *gsn,
int (*cb) (struct gsn_t *gsn, struct sockaddr_in *peer, const struct osmo_routing_area_id *rai, uint32_t teic, struct osmo_mobile_identity *mi, union gtpie_member **ie)); int (*cb) (struct gsn_t *gsn, struct sockaddr_in *peer, uint16_t seq, const struct osmo_routing_area_id *rai, uint32_t teic, struct osmo_mobile_identity *mi, union gtpie_member **ie));
extern int gtp_set_cb_conf(struct gsn_t *gsn, extern int gtp_set_cb_conf(struct gsn_t *gsn,
int (*cb) (int type, int cause, struct pdp_t * pdp, int (*cb) (int type, int cause, struct pdp_t * pdp,

View File

@@ -537,8 +537,9 @@ static int gtp_resp(uint8_t version, struct gsn_t *gsn, struct pdp_t *pdp,
return -1; return -1;
} }
gtp_resp2(gsn, packet, len, peer, fd, seq, tid, flow, tei); return gtp_resp2(gsn, packet, len, peer, fd, seq, tid, flow, tei);
} }
static int gtp_notification(struct gsn_t *gsn, uint8_t version, static int gtp_notification(struct gsn_t *gsn, uint8_t version,
union gtp_packet *packet, int len, union gtp_packet *packet, int len,
const struct sockaddr_in *peer, int fd, uint16_t seq) const struct sockaddr_in *peer, int fd, uint16_t seq)
@@ -840,8 +841,9 @@ int gtp_ran_info_relay_req(struct gsn_t *gsn, const struct sockaddr_in *peer,
#define GSM_MI_TYPE_TLLI 0x05 #define GSM_MI_TYPE_TLLI 0x05
/* Send an SGSN Context Request for an MI */
int gtp_sgsn_context_req(struct gsn_t *gsn, const struct in_addr *peer, int gtp_sgsn_context_req(struct gsn_t *gsn, const struct in_addr *peer,
const struct osmo_mobile_identity *mi, uint32_t teic, const struct osmo_mobile_identity *mi, uint16_t tlli, uint32_t teic,
const struct ul16_t *sgsn_addr, const struct ul255_t *rai, void *cbp) const struct ul16_t *sgsn_addr, const struct ul255_t *rai, void *cbp)
{ {
union gtp_packet packet; union gtp_packet packet;
@@ -855,8 +857,12 @@ int gtp_sgsn_context_req(struct gsn_t *gsn, const struct in_addr *peer,
switch (mi->type) { switch (mi->type) {
case GSM_MI_TYPE_IMSI: case GSM_MI_TYPE_IMSI:
gtpie_tv8(&packet, &length, GTP_MAX, GTPIE_IMSI, *(uint64_t *)mi->imsi); /* FIXME: proper decoding*/ {
uint64_t imsi = gtp_imsi_str2gtp(mi->imsi);
imsi = ntoh64(imsi);
gtpie_tv8(&packet, &length, GTP_MAX, GTPIE_IMSI, imsi);
break; break;
}
case GSM_MI_TYPE_TLLI: case GSM_MI_TYPE_TLLI:
gtpie_tv4(&packet, &length, GTP_MAX, GTPIE_TLLI, mi->tmsi); gtpie_tv4(&packet, &length, GTP_MAX, GTPIE_TLLI, mi->tmsi);
break; break;
@@ -864,6 +870,7 @@ int gtp_sgsn_context_req(struct gsn_t *gsn, const struct in_addr *peer,
gtpie_tv4(&packet, &length, GTP_MAX, GTPIE_P_TMSI, mi->tmsi); gtpie_tv4(&packet, &length, GTP_MAX, GTPIE_P_TMSI, mi->tmsi);
break; break;
default: default:
return -1;
/* TODO: Error */ /* TODO: Error */
break; break;
} }
@@ -941,8 +948,9 @@ static int gtp_sgsn_context_ind(struct gsn_t *gsn, int version, struct sockaddr_
} }
if (!gtpie_gettv8(ie, GTPIE_IMSI, 0, &imsi)) { if (!gtpie_gettv8(ie, GTPIE_IMSI, 0, &imsi)) {
imsi = ntoh64(imsi);
mi.type = GSM_MI_TYPE_IMSI; mi.type = GSM_MI_TYPE_IMSI;
/* NOTE: gtpie_gettv8 already converts to host byte order, but imsi_gtp2str seems to prefer big endian */
imsi = ntoh64(imsi);
const char *imsi_str = imsi_gtp2str(&imsi); const char *imsi_str = imsi_gtp2str(&imsi);
memcpy(mi.imsi, imsi_str, sizeof(mi.imsi)); memcpy(mi.imsi, imsi_str, sizeof(mi.imsi));
} else { } else {
@@ -953,7 +961,7 @@ static int gtp_sgsn_context_ind(struct gsn_t *gsn, int version, struct sockaddr_
done: done:
if (gsn->cb_sgsn_context_request_ind) if (gsn->cb_sgsn_context_request_ind)
gsn->cb_sgsn_context_request_ind(gsn, peer, &rai_parsed, teic, &mi, ie); gsn->cb_sgsn_context_request_ind(gsn, peer, seq, &rai_parsed, teic, &mi, ie);
return 0; return 0;
@@ -1029,9 +1037,9 @@ static int gtp_pdp_ctx(uint8_t *buf, unsigned int size, const struct pdp_t *pdp,
*ptr++ = pdp->pdp_id; *ptr++ = pdp->pdp_id;
// PDP Type Org // PDP Type Org
*ptr++ = PDP_EUA_ORG_IETF; *ptr++ = PDP_EUA_ORG_IETF;
// PDP Type No. // PDP Type No.
// PDP Address // PDP Address
switch (pdp->eua.v[1]) { switch (pdp->eua.v[1]) {
case PDP_EUA_TYPE_v4: case PDP_EUA_TYPE_v4:
case PDP_EUA_TYPE_v4v6: case PDP_EUA_TYPE_v4v6:
@@ -1079,7 +1087,7 @@ static int gtp_pdp_ctx(uint8_t *buf, unsigned int size, const struct pdp_t *pdp,
} }
int gtp_sgsn_context_conf(struct gsn_t *gsn, struct sockaddr_in *peer, uint16_t seq, int gtp_sgsn_context_conf(struct gsn_t *gsn, struct sockaddr_in *peer, uint16_t seq,
uint32_t teic, uint8_t cause, const struct in_addr *sgsn_addr, struct pdp_t *pdpctx, uint16_t sapi, struct ul255_t *mmctx, void *cbp) uint32_t teic, uint8_t cause, uint64_t imsi, const struct in_addr *sgsn_addr, struct pdp_t *pdpctx, uint16_t sapi, uint8_t *mmctx, int mm_len, void *cbp)
{ {
union gtp_packet packet; union gtp_packet packet;
struct ul255_t pdp; struct ul255_t pdp;
@@ -1089,14 +1097,18 @@ int gtp_sgsn_context_conf(struct gsn_t *gsn, struct sockaddr_in *peer, uint16_t
// Cause - TV1 // Cause - TV1
gtpie_tv1(&packet, &length, GTP_MAX, GTPIE_CAUSE, cause); gtpie_tv1(&packet, &length, GTP_MAX, GTPIE_CAUSE, cause);
if (cause != GTPCAUSE_ACC_REQ)
return gtp_resp2(gsn, &packet, length, peer, gsn->fd1c, seq, 0, 0, teic);
// IMSI - TV8 // IMSI - TV8
//gtpie_tv8(&packet, &length, GTP_MAX, GTPIE_IMSI, imsi); gtpie_tv8(&packet, &length, GTP_MAX, GTPIE_IMSI, imsi);
// TEIC - TV4 // TEIC - TV4
gtpie_tv4(&packet, &length, GTP_MAX, GTPIE_TEI_C, pdpctx->teic_own); gtpie_tv4(&packet, &length, GTP_MAX, GTPIE_TEI_C, pdpctx->teic_own);
// MM Ctx - TLV // MM Ctx - TLV
gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_MM_CONTEXT, mmctx->l, mmctx->v); gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_MM_CONTEXT, mm_len, mmctx);
// PDP Ctx - TLV // PDP Ctx - TLV
if (pdpctx) { if (pdpctx) {
@@ -1129,7 +1141,6 @@ static int gtp_sgsn_context_conf_ind(struct gsn_t *gsn, int version, struct sock
uint8_t cause; uint8_t cause;
union gtpie_member *ie[GTPIE_SIZE]; union gtpie_member *ie[GTPIE_SIZE];
struct pdp_t *pdp = NULL; struct pdp_t *pdp = NULL;
uint64_t imsi;
uint32_t teic; uint32_t teic;
struct ul16_t sgsn_addr; struct ul16_t sgsn_addr;

View File

@@ -263,10 +263,10 @@ extern int gtp_ran_info_relay_req(struct gsn_t *gsn, const struct sockaddr_in *p
uint8_t rim_route_addr_discr); uint8_t rim_route_addr_discr);
extern int gtp_sgsn_context_req(struct gsn_t *gsn, const struct in_addr *peer, extern int gtp_sgsn_context_req(struct gsn_t *gsn, const struct in_addr *peer,
const struct osmo_mobile_identity *mi, uint32_t teic, const struct osmo_mobile_identity *mi, uint16_t tlli, uint32_t teic,
const struct ul16_t *sgsn_addr, const struct ul255_t *rai, void *cbp); const struct ul16_t *sgsn_addr, const struct ul255_t *rai, void *cbp);
extern int gtp_sgsn_context_conf(struct gsn_t *gsn, struct sockaddr_in *peer, uint16_t seq, extern int gtp_sgsn_context_conf(struct gsn_t *gsn, struct sockaddr_in *peer, uint16_t seq,
uint32_t teic, uint8_t cause, const struct in_addr *sgsn_addr, struct pdp_t *pdpctx, uint16_t sapi, struct ul255_t *mmctx, void *cbp); uint32_t teic, uint8_t cause, uint64_t imsi, const struct in_addr *sgsn_addr, struct pdp_t *pdpctx, uint16_t sapi, uint8_t *mmctx, int mm_len, void *cbp);
extern int gtp_decaps0(struct gsn_t *gsn); extern int gtp_decaps0(struct gsn_t *gsn);
extern int gtp_decaps1c(struct gsn_t *gsn); extern int gtp_decaps1c(struct gsn_t *gsn);