Make esme struct shared
This helps to merge similar code from smpp_mirror and smpp_* in follow-up patches. Related: OS#5568 Change-Id: I8f7ac2c00d16660925dd0b03aa1a0973edf9eb70
This commit is contained in:
parent
62977d0484
commit
23a00eb820
|
@ -11,6 +11,20 @@ enum esme_read_state {
|
||||||
READ_ST_IN_MSG = 1,
|
READ_ST_IN_MSG = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct esme {
|
||||||
|
uint32_t own_seq_nr;
|
||||||
|
|
||||||
|
struct osmo_wqueue wqueue;
|
||||||
|
enum esme_read_state read_state;
|
||||||
|
uint32_t read_len;
|
||||||
|
uint32_t read_idx;
|
||||||
|
struct msgb *read_msg;
|
||||||
|
|
||||||
|
uint8_t smpp_version;
|
||||||
|
char system_id[SMPP_SYS_ID_LEN + 1];
|
||||||
|
char password[SMPP_SYS_ID_LEN + 1];
|
||||||
|
};
|
||||||
|
|
||||||
#define LOGPESME(ESME, LEVEL, FMT, ARGS...) \
|
#define LOGPESME(ESME, LEVEL, FMT, ARGS...) \
|
||||||
LOGP(DSMPP, LEVEL, "[%s] " FMT, (ESME)->system_id, ##ARGS)
|
LOGP(DSMPP, LEVEL, "[%s] " FMT, (ESME)->system_id, ##ARGS)
|
||||||
|
|
||||||
|
@ -32,6 +46,7 @@ enum esme_read_state {
|
||||||
(resp)->command_status = ESME_ROK; \
|
(resp)->command_status = ESME_ROK; \
|
||||||
(resp)->sequence_number = (req)->sequence_number; }
|
(resp)->sequence_number = (req)->sequence_number; }
|
||||||
|
|
||||||
|
struct esme *esme_alloc(void *ctx);
|
||||||
uint32_t smpp_msgb_cmdid(struct msgb *msg);
|
uint32_t smpp_msgb_cmdid(struct msgb *msg);
|
||||||
int smpp_openbsc_alloc_init(void *ctx);
|
int smpp_openbsc_alloc_init(void *ctx);
|
||||||
int smpp_openbsc_start(struct gsm_network *net);
|
int smpp_openbsc_start(struct gsm_network *net);
|
||||||
|
|
|
@ -29,23 +29,13 @@ struct osmo_smpp_addr {
|
||||||
struct osmo_esme {
|
struct osmo_esme {
|
||||||
struct llist_head list;
|
struct llist_head list;
|
||||||
struct smsc *smsc;
|
struct smsc *smsc;
|
||||||
|
struct esme *esme;
|
||||||
struct osmo_smpp_acl *acl;
|
struct osmo_smpp_acl *acl;
|
||||||
int use;
|
int use;
|
||||||
|
|
||||||
struct llist_head smpp_cmd_list;
|
struct llist_head smpp_cmd_list;
|
||||||
|
|
||||||
uint32_t own_seq_nr;
|
|
||||||
|
|
||||||
struct osmo_wqueue wqueue;
|
|
||||||
|
|
||||||
enum esme_read_state read_state;
|
|
||||||
uint32_t read_len;
|
|
||||||
uint32_t read_idx;
|
|
||||||
struct msgb *read_msg;
|
|
||||||
|
|
||||||
uint8_t smpp_version;
|
uint8_t smpp_version;
|
||||||
char system_id[SMPP_SYS_ID_LEN+1];
|
|
||||||
|
|
||||||
uint8_t bind_flags;
|
uint8_t bind_flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -341,7 +341,7 @@ static void alert_all_esme(struct smsc *smsc, struct vlr_subscr *vsub,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (esme->acl && !esme->acl->alert_notifications) {
|
if (esme->acl && !esme->acl->alert_notifications) {
|
||||||
LOGPESME(esme, LOGL_DEBUG, "is not set to receive Alert Notifications\n");
|
LOGPESME(esme->esme, LOGL_DEBUG, "is not set to receive Alert Notifications\n");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (esme->acl && esme->acl->deliver_src_imsi) {
|
if (esme->acl && esme->acl->deliver_src_imsi) {
|
||||||
|
|
|
@ -159,12 +159,12 @@ void smpp_acl_delete(struct osmo_smpp_acl *acl)
|
||||||
|
|
||||||
/* kill any active ESMEs */
|
/* kill any active ESMEs */
|
||||||
if (acl->esme) {
|
if (acl->esme) {
|
||||||
struct osmo_esme *esme = acl->esme;
|
struct esme *esme = acl->esme->esme;
|
||||||
osmo_fd_unregister(&esme->wqueue.bfd);
|
osmo_fd_unregister(&esme->wqueue.bfd);
|
||||||
close(esme->wqueue.bfd.fd);
|
close(esme->wqueue.bfd.fd);
|
||||||
esme->wqueue.bfd.fd = -1;
|
esme->wqueue.bfd.fd = -1;
|
||||||
esme->acl = NULL;
|
acl->esme = NULL;
|
||||||
smpp_esme_put(esme);
|
smpp_esme_put(acl->esme);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* delete all routes for this ACL */
|
/* delete all routes for this ACL */
|
||||||
|
@ -238,10 +238,10 @@ void smpp_esme_get(struct osmo_esme *esme)
|
||||||
|
|
||||||
static void esme_destroy(struct osmo_esme *esme)
|
static void esme_destroy(struct osmo_esme *esme)
|
||||||
{
|
{
|
||||||
osmo_wqueue_clear(&esme->wqueue);
|
osmo_wqueue_clear(&esme->esme->wqueue);
|
||||||
if (esme->wqueue.bfd.fd >= 0) {
|
if (esme->esme->wqueue.bfd.fd >= 0) {
|
||||||
osmo_fd_unregister(&esme->wqueue.bfd);
|
osmo_fd_unregister(&esme->esme->wqueue.bfd);
|
||||||
close(esme->wqueue.bfd.fd);
|
close(esme->esme->wqueue.bfd.fd);
|
||||||
}
|
}
|
||||||
smpp_cmd_flush_pending(esme);
|
smpp_cmd_flush_pending(esme);
|
||||||
llist_del(&esme->list);
|
llist_del(&esme->list);
|
||||||
|
@ -250,7 +250,7 @@ static void esme_destroy(struct osmo_esme *esme)
|
||||||
talloc_free(esme);
|
talloc_free(esme);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t esme_inc_seq_nr(struct osmo_esme *esme)
|
static uint32_t esme_inc_seq_nr(struct esme *esme)
|
||||||
{
|
{
|
||||||
esme->own_seq_nr++;
|
esme->own_seq_nr++;
|
||||||
if (esme->own_seq_nr > 0x7fffffff)
|
if (esme->own_seq_nr > 0x7fffffff)
|
||||||
|
@ -315,7 +315,7 @@ int smpp_route(const struct smsc *smsc, const struct osmo_smpp_addr *dest, struc
|
||||||
*pesme = esme;
|
*pesme = esme;
|
||||||
return 0;
|
return 0;
|
||||||
} else
|
} else
|
||||||
LOGPESME(esme, LOGL_NOTICE, "is matching route, but not bound for Rx, discarding MO SMS\n");
|
LOGPESME(esme->esme, LOGL_NOTICE, "is matching route, but not bound for Rx, discarding MO SMS\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
*pesme = NULL;
|
*pesme = NULL;
|
||||||
|
@ -326,7 +326,7 @@ int smpp_route(const struct smsc *smsc, const struct osmo_smpp_addr *dest, struc
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief pack a libsmpp34 data strcutrure and send it to the ESME */
|
/*! \brief pack a libsmpp34 data strcutrure and send it to the ESME */
|
||||||
static int pack_and_send(struct osmo_esme *esme, uint32_t type, void *ptr)
|
static int pack_and_send(struct esme *esme, uint32_t type, void *ptr)
|
||||||
{
|
{
|
||||||
struct msgb *msg;
|
struct msgb *msg;
|
||||||
int rc, rlen;
|
int rc, rlen;
|
||||||
|
@ -357,7 +357,7 @@ static int pack_and_send(struct osmo_esme *esme, uint32_t type, void *ptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief transmit a generic NACK to a remote ESME */
|
/*! \brief transmit a generic NACK to a remote ESME */
|
||||||
static int smpp_tx_gen_nack(struct osmo_esme *esme, uint32_t seq, uint32_t status)
|
static int smpp_tx_gen_nack(struct esme *esme, uint32_t seq, uint32_t status)
|
||||||
{
|
{
|
||||||
struct generic_nack_t nack;
|
struct generic_nack_t nack;
|
||||||
char buf[SMALL_BUFF];
|
char buf[SMALL_BUFF];
|
||||||
|
@ -380,7 +380,7 @@ static inline uint32_t smpp_msgb_seq(struct msgb *msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief handle an incoming SMPP generic NACK */
|
/*! \brief handle an incoming SMPP generic NACK */
|
||||||
static int smpp_handle_gen_nack(struct osmo_esme *esme, struct msgb *msg)
|
static int smpp_handle_gen_nack(struct esme *esme, struct msgb *msg)
|
||||||
{
|
{
|
||||||
struct generic_nack_t nack;
|
struct generic_nack_t nack;
|
||||||
char buf[SMALL_BUFF];
|
char buf[SMALL_BUFF];
|
||||||
|
@ -411,9 +411,9 @@ static int _process_bind(struct osmo_esme *esme, uint8_t if_version,
|
||||||
return ESME_RALYBND;
|
return ESME_RALYBND;
|
||||||
|
|
||||||
esme->smpp_version = if_version;
|
esme->smpp_version = if_version;
|
||||||
snprintf(esme->system_id, sizeof(esme->system_id), "%s", sys_id);
|
snprintf(esme->esme->system_id, sizeof(esme->esme->system_id), "%s", sys_id);
|
||||||
|
|
||||||
acl = smpp_acl_by_system_id(esme->smsc, esme->system_id);
|
acl = smpp_acl_by_system_id(esme->smsc, esme->esme->system_id);
|
||||||
if (!esme->smsc->accept_all) {
|
if (!esme->smsc->accept_all) {
|
||||||
if (!acl) {
|
if (!acl) {
|
||||||
/* This system is unknown */
|
/* This system is unknown */
|
||||||
|
@ -446,7 +446,7 @@ static int smpp_handle_bind_rx(struct osmo_esme *esme, struct msgb *msg)
|
||||||
SMPP34_UNPACK(rc, BIND_RECEIVER, &bind, msgb_data(msg),
|
SMPP34_UNPACK(rc, BIND_RECEIVER, &bind, msgb_data(msg),
|
||||||
msgb_length(msg));
|
msgb_length(msg));
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
LOGPESMERR(esme, "in smpp34_unpack()\n");
|
LOGPESMERR(esme->esme, "in smpp34_unpack()\n");
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -459,7 +459,7 @@ static int smpp_handle_bind_rx(struct osmo_esme *esme, struct msgb *msg)
|
||||||
(const char *)bind.system_id, (const char *)bind.password);
|
(const char *)bind.system_id, (const char *)bind.password);
|
||||||
bind_r.command_status = rc;
|
bind_r.command_status = rc;
|
||||||
|
|
||||||
return PACK_AND_SEND(esme, &bind_r);
|
return PACK_AND_SEND(esme->esme, &bind_r);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief handle an incoming SMPP BIND TRANSMITTER */
|
/*! \brief handle an incoming SMPP BIND TRANSMITTER */
|
||||||
|
@ -473,7 +473,7 @@ static int smpp_handle_bind_tx(struct osmo_esme *esme, struct msgb *msg)
|
||||||
SMPP34_UNPACK(rc, BIND_TRANSMITTER, &bind, msgb_data(msg),
|
SMPP34_UNPACK(rc, BIND_TRANSMITTER, &bind, msgb_data(msg),
|
||||||
msgb_length(msg));
|
msgb_length(msg));
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
LOGPESMERR(esme, "in smpp34_unpack()\n");
|
LOGPESMERR(esme->esme, "in smpp34_unpack()\n");
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -495,7 +495,7 @@ static int smpp_handle_bind_tx(struct osmo_esme *esme, struct msgb *msg)
|
||||||
tlv.value.val16 = esme->smpp_version;
|
tlv.value.val16 = esme->smpp_version;
|
||||||
build_tlv(&bind_r.tlv, &tlv);
|
build_tlv(&bind_r.tlv, &tlv);
|
||||||
|
|
||||||
rc = PACK_AND_SEND(esme, &bind_r);
|
rc = PACK_AND_SEND(esme->esme, &bind_r);
|
||||||
destroy_tlv(bind_r.tlv);
|
destroy_tlv(bind_r.tlv);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -510,7 +510,7 @@ static int smpp_handle_bind_trx(struct osmo_esme *esme, struct msgb *msg)
|
||||||
SMPP34_UNPACK(rc, BIND_TRANSCEIVER, &bind, msgb_data(msg),
|
SMPP34_UNPACK(rc, BIND_TRANSCEIVER, &bind, msgb_data(msg),
|
||||||
msgb_length(msg));
|
msgb_length(msg));
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
LOGPESMERR(esme, "in smpp34_unpack()\n");
|
LOGPESMERR(esme->esme, "in smpp34_unpack()\n");
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -523,7 +523,7 @@ static int smpp_handle_bind_trx(struct osmo_esme *esme, struct msgb *msg)
|
||||||
(const char *)bind.system_id, (const char *)bind.password);
|
(const char *)bind.system_id, (const char *)bind.password);
|
||||||
bind_r.command_status = rc;
|
bind_r.command_status = rc;
|
||||||
|
|
||||||
return PACK_AND_SEND(esme, &bind_r);
|
return PACK_AND_SEND(esme->esme, &bind_r);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief handle an incoming SMPP UNBIND */
|
/*! \brief handle an incoming SMPP UNBIND */
|
||||||
|
@ -536,13 +536,13 @@ static int smpp_handle_unbind(struct osmo_esme *esme, struct msgb *msg)
|
||||||
SMPP34_UNPACK(rc, UNBIND, &unbind, msgb_data(msg),
|
SMPP34_UNPACK(rc, UNBIND, &unbind, msgb_data(msg),
|
||||||
msgb_length(msg));
|
msgb_length(msg));
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
LOGPESMERR(esme, "in smpp34_unpack()\n");
|
LOGPESMERR(esme->esme, "in smpp34_unpack()\n");
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
INIT_RESP(UNBIND_RESP, &unbind_r, &unbind);
|
INIT_RESP(UNBIND_RESP, &unbind_r, &unbind);
|
||||||
|
|
||||||
LOGPESME(esme, LOGL_INFO, "Rx UNBIND\n");
|
LOGPESME(esme->esme, LOGL_INFO, "Rx UNBIND\n");
|
||||||
|
|
||||||
if (esme->bind_flags == 0) {
|
if (esme->bind_flags == 0) {
|
||||||
unbind_r.command_status = ESME_RINVBNDSTS;
|
unbind_r.command_status = ESME_RINVBNDSTS;
|
||||||
|
@ -551,7 +551,7 @@ static int smpp_handle_unbind(struct osmo_esme *esme, struct msgb *msg)
|
||||||
|
|
||||||
esme->bind_flags = 0;
|
esme->bind_flags = 0;
|
||||||
err:
|
err:
|
||||||
return PACK_AND_SEND(esme, &unbind_r);
|
return PACK_AND_SEND(esme->esme, &unbind_r);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief handle an incoming SMPP ENQUIRE LINK */
|
/*! \brief handle an incoming SMPP ENQUIRE LINK */
|
||||||
|
@ -564,17 +564,17 @@ static int smpp_handle_enq_link(struct osmo_esme *esme, struct msgb *msg)
|
||||||
SMPP34_UNPACK(rc, ENQUIRE_LINK, &enq, msgb_data(msg),
|
SMPP34_UNPACK(rc, ENQUIRE_LINK, &enq, msgb_data(msg),
|
||||||
msgb_length(msg));
|
msgb_length(msg));
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
LOGPESMERR(esme, "in smpp34_unpack()\n");
|
LOGPESMERR(esme->esme, "in smpp34_unpack()\n");
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOGPESME(esme, LOGL_DEBUG, "Rx Enquire Link\n");
|
LOGPESME(esme->esme, LOGL_DEBUG, "Rx Enquire Link\n");
|
||||||
|
|
||||||
INIT_RESP(ENQUIRE_LINK_RESP, &enq_r, &enq);
|
INIT_RESP(ENQUIRE_LINK_RESP, &enq_r, &enq);
|
||||||
|
|
||||||
LOGPESME(esme, LOGL_DEBUG, "Tx Enquire Link Response\n");
|
LOGPESME(esme->esme, LOGL_DEBUG, "Tx Enquire Link Response\n");
|
||||||
|
|
||||||
return PACK_AND_SEND(esme, &enq_r);
|
return PACK_AND_SEND(esme->esme, &enq_r);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief send a SUBMIT-SM RESPONSE to a remote ESME */
|
/*! \brief send a SUBMIT-SM RESPONSE to a remote ESME */
|
||||||
|
@ -590,7 +590,7 @@ int smpp_tx_submit_r(struct osmo_esme *esme, uint32_t sequence_nr,
|
||||||
submit_r.sequence_number= sequence_nr;
|
submit_r.sequence_number= sequence_nr;
|
||||||
snprintf((char *) submit_r.message_id, sizeof(submit_r.message_id), "%s", msg_id);
|
snprintf((char *) submit_r.message_id, sizeof(submit_r.message_id), "%s", msg_id);
|
||||||
|
|
||||||
return PACK_AND_SEND(esme, &submit_r);
|
return PACK_AND_SEND(esme->esme, &submit_r);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct value_string smpp_avail_strs[] = {
|
static const struct value_string smpp_avail_strs[] = {
|
||||||
|
@ -612,7 +612,7 @@ int smpp_tx_alert(struct osmo_esme *esme, uint8_t ton, uint8_t npi,
|
||||||
alert.command_length = 0;
|
alert.command_length = 0;
|
||||||
alert.command_id = ALERT_NOTIFICATION;
|
alert.command_id = ALERT_NOTIFICATION;
|
||||||
alert.command_status = ESME_ROK;
|
alert.command_status = ESME_ROK;
|
||||||
alert.sequence_number = esme_inc_seq_nr(esme);
|
alert.sequence_number = esme_inc_seq_nr(esme->esme);
|
||||||
alert.source_addr_ton = ton;
|
alert.source_addr_ton = ton;
|
||||||
alert.source_addr_npi = npi;
|
alert.source_addr_npi = npi;
|
||||||
snprintf((char *)alert.source_addr, sizeof(alert.source_addr), "%s", addr);
|
snprintf((char *)alert.source_addr, sizeof(alert.source_addr), "%s", addr);
|
||||||
|
@ -622,12 +622,12 @@ int smpp_tx_alert(struct osmo_esme *esme, uint8_t ton, uint8_t npi,
|
||||||
tlv.value.val08 = avail_status;
|
tlv.value.val08 = avail_status;
|
||||||
build_tlv(&alert.tlv, &tlv);
|
build_tlv(&alert.tlv, &tlv);
|
||||||
|
|
||||||
LOGPESME(esme, LOGL_DEBUG, "Tx ALERT_NOTIFICATION (%s/%u/%u): %s\n",
|
LOGPESME(esme->esme, LOGL_DEBUG, "Tx ALERT_NOTIFICATION (%s/%u/%u): %s\n",
|
||||||
alert.source_addr, alert.source_addr_ton,
|
alert.source_addr, alert.source_addr_ton,
|
||||||
alert.source_addr_npi,
|
alert.source_addr_npi,
|
||||||
get_value_string(smpp_avail_strs, avail_status));
|
get_value_string(smpp_avail_strs, avail_status));
|
||||||
|
|
||||||
rc = PACK_AND_SEND(esme, &alert);
|
rc = PACK_AND_SEND(esme->esme, &alert);
|
||||||
destroy_tlv(alert.tlv);
|
destroy_tlv(alert.tlv);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -635,11 +635,11 @@ int smpp_tx_alert(struct osmo_esme *esme, uint8_t ton, uint8_t npi,
|
||||||
/* \brief send a DELIVER-SM message to given ESME */
|
/* \brief send a DELIVER-SM message to given ESME */
|
||||||
int smpp_tx_deliver(struct osmo_esme *esme, struct deliver_sm_t *deliver)
|
int smpp_tx_deliver(struct osmo_esme *esme, struct deliver_sm_t *deliver)
|
||||||
{
|
{
|
||||||
deliver->sequence_number = esme_inc_seq_nr(esme);
|
deliver->sequence_number = esme_inc_seq_nr(esme->esme);
|
||||||
|
|
||||||
LOGPESME(esme, LOGL_DEBUG, "Tx DELIVER-SM (from %s)\n", deliver->source_addr);
|
LOGPESME(esme->esme, LOGL_DEBUG, "Tx DELIVER-SM (from %s)\n", deliver->source_addr);
|
||||||
|
|
||||||
return PACK_AND_SEND(esme, deliver);
|
return PACK_AND_SEND(esme->esme, deliver);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief handle an incoming SMPP DELIVER-SM RESPONSE */
|
/*! \brief handle an incoming SMPP DELIVER-SM RESPONSE */
|
||||||
|
@ -653,13 +653,13 @@ static int smpp_handle_deliver_resp(struct osmo_esme *esme, struct msgb *msg)
|
||||||
SMPP34_UNPACK(rc, DELIVER_SM_RESP, &deliver_r, msgb_data(msg),
|
SMPP34_UNPACK(rc, DELIVER_SM_RESP, &deliver_r, msgb_data(msg),
|
||||||
msgb_length(msg));
|
msgb_length(msg));
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
LOGPESMERR(esme, "in smpp34_unpack()\n");
|
LOGPESMERR(esme->esme, "in smpp34_unpack()\n");
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd = smpp_cmd_find_by_seqnum(esme, deliver_r.sequence_number);
|
cmd = smpp_cmd_find_by_seqnum(esme, deliver_r.sequence_number);
|
||||||
if (!cmd) {
|
if (!cmd) {
|
||||||
LOGPESME(esme, LOGL_ERROR, "Rx DELIVER-SM RESP !? (%s)\n",
|
LOGPESME(esme->esme, LOGL_ERROR, "Rx DELIVER-SM RESP !? (%s)\n",
|
||||||
get_value_string(smpp_status_strs, deliver_r.command_status));
|
get_value_string(smpp_status_strs, deliver_r.command_status));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -669,7 +669,7 @@ static int smpp_handle_deliver_resp(struct osmo_esme *esme, struct msgb *msg)
|
||||||
else
|
else
|
||||||
smpp_cmd_err(cmd, deliver_r.command_status);
|
smpp_cmd_err(cmd, deliver_r.command_status);
|
||||||
|
|
||||||
LOGPESME(esme, LOGL_INFO, "Rx DELIVER-SM RESP (%s)\n",
|
LOGPESME(esme->esme, LOGL_INFO, "Rx DELIVER-SM RESP (%s)\n",
|
||||||
get_value_string(smpp_status_strs, deliver_r.command_status));
|
get_value_string(smpp_status_strs, deliver_r.command_status));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -686,7 +686,7 @@ static int smpp_handle_submit(struct osmo_esme *esme, struct msgb *msg)
|
||||||
SMPP34_UNPACK(rc, SUBMIT_SM, &submit, msgb_data(msg),
|
SMPP34_UNPACK(rc, SUBMIT_SM, &submit, msgb_data(msg),
|
||||||
msgb_length(msg));
|
msgb_length(msg));
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
LOGPESMERR(esme, "in smpp34_unpack()\n");
|
LOGPESMERR(esme->esme, "in smpp34_unpack()\n");
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -694,17 +694,17 @@ static int smpp_handle_submit(struct osmo_esme *esme, struct msgb *msg)
|
||||||
|
|
||||||
if (!(esme->bind_flags & ESME_BIND_TX)) {
|
if (!(esme->bind_flags & ESME_BIND_TX)) {
|
||||||
submit_r.command_status = ESME_RINVBNDSTS;
|
submit_r.command_status = ESME_RINVBNDSTS;
|
||||||
return PACK_AND_SEND(esme, &submit_r);
|
return PACK_AND_SEND(esme->esme, &submit_r);
|
||||||
}
|
}
|
||||||
|
|
||||||
LOGPESME(esme, LOGL_INFO, "Rx SUBMIT-SM (%s/%u/%u)\n",
|
LOGPESME(esme->esme, LOGL_INFO, "Rx SUBMIT-SM (%s/%u/%u)\n",
|
||||||
submit.destination_addr, submit.dest_addr_ton, submit.dest_addr_npi);
|
submit.destination_addr, submit.dest_addr_ton, submit.dest_addr_npi);
|
||||||
|
|
||||||
INIT_RESP(SUBMIT_SM_RESP, &submit_r, &submit);
|
INIT_RESP(SUBMIT_SM_RESP, &submit_r, &submit);
|
||||||
|
|
||||||
rc = handle_smpp_submit(esme, &submit, &submit_r);
|
rc = handle_smpp_submit(esme, &submit, &submit_r);
|
||||||
if (rc == 0)
|
if (rc == 0)
|
||||||
return PACK_AND_SEND(esme, &submit_r);
|
return PACK_AND_SEND(esme->esme, &submit_r);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -715,11 +715,11 @@ static int smpp_pdu_rx(struct osmo_esme *esme, struct msgb *msg __uses)
|
||||||
uint32_t cmd_id = smpp_msgb_cmdid(msg);
|
uint32_t cmd_id = smpp_msgb_cmdid(msg);
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
LOGPESME(esme, LOGL_DEBUG, "smpp_pdu_rx(%s)\n", msgb_hexdump(msg));
|
LOGPESME(esme->esme, LOGL_DEBUG, "smpp_pdu_rx(%s)\n", msgb_hexdump(msg));
|
||||||
|
|
||||||
switch (cmd_id) {
|
switch (cmd_id) {
|
||||||
case GENERIC_NACK:
|
case GENERIC_NACK:
|
||||||
rc = smpp_handle_gen_nack(esme, msg);
|
rc = smpp_handle_gen_nack(esme->esme, msg);
|
||||||
break;
|
break;
|
||||||
case BIND_RECEIVER:
|
case BIND_RECEIVER:
|
||||||
rc = smpp_handle_bind_rx(esme, msg);
|
rc = smpp_handle_bind_rx(esme, msg);
|
||||||
|
@ -750,11 +750,11 @@ static int smpp_pdu_rx(struct osmo_esme *esme, struct msgb *msg __uses)
|
||||||
case QUERY_SM:
|
case QUERY_SM:
|
||||||
case REPLACE_SM:
|
case REPLACE_SM:
|
||||||
case SUBMIT_MULTI:
|
case SUBMIT_MULTI:
|
||||||
LOGPESME(esme, LOGL_NOTICE, "Unimplemented PDU Command 0x%08x\n", cmd_id);
|
LOGPESME(esme->esme, LOGL_NOTICE, "Unimplemented PDU Command 0x%08x\n", cmd_id);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
LOGPESME(esme, LOGL_ERROR, "Unknown PDU Command 0x%08x\n", cmd_id);
|
LOGPESME(esme->esme, LOGL_ERROR, "Unknown PDU Command 0x%08x\n", cmd_id);
|
||||||
rc = smpp_tx_gen_nack(esme, smpp_msgb_seq(msg), ESME_RINVCMDID);
|
rc = smpp_tx_gen_nack(esme->esme, smpp_msgb_seq(msg), ESME_RINVCMDID);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -781,7 +781,8 @@ static int smpp_pdu_rx(struct osmo_esme *esme, struct msgb *msg __uses)
|
||||||
/* !\brief call-back when per-ESME TCP socket has some data to be read */
|
/* !\brief call-back when per-ESME TCP socket has some data to be read */
|
||||||
static int esme_link_read_cb(struct osmo_fd *ofd)
|
static int esme_link_read_cb(struct osmo_fd *ofd)
|
||||||
{
|
{
|
||||||
struct osmo_esme *esme = ofd->data;
|
struct osmo_esme *e = ofd->data;
|
||||||
|
struct esme *esme = e->esme;
|
||||||
uint32_t len;
|
uint32_t len;
|
||||||
uint8_t *lenptr = (uint8_t *) &len;
|
uint8_t *lenptr = (uint8_t *) &len;
|
||||||
uint8_t *cur;
|
uint8_t *cur;
|
||||||
|
@ -828,7 +829,7 @@ static int esme_link_read_cb(struct osmo_fd *ofd)
|
||||||
msgb_put(msg, rc);
|
msgb_put(msg, rc);
|
||||||
|
|
||||||
if (esme->read_idx >= esme->read_len) {
|
if (esme->read_idx >= esme->read_len) {
|
||||||
rc = smpp_pdu_rx(esme, esme->read_msg);
|
rc = smpp_pdu_rx(e, esme->read_msg);
|
||||||
msgb_free(esme->read_msg);
|
msgb_free(esme->read_msg);
|
||||||
esme->read_msg = NULL;
|
esme->read_msg = NULL;
|
||||||
esme->read_idx = 0;
|
esme->read_idx = 0;
|
||||||
|
@ -844,9 +845,9 @@ dead_socket:
|
||||||
osmo_fd_unregister(&esme->wqueue.bfd);
|
osmo_fd_unregister(&esme->wqueue.bfd);
|
||||||
close(esme->wqueue.bfd.fd);
|
close(esme->wqueue.bfd.fd);
|
||||||
esme->wqueue.bfd.fd = -1;
|
esme->wqueue.bfd.fd = -1;
|
||||||
if (esme->acl)
|
if (e->acl)
|
||||||
esme->acl->esme = NULL;
|
e->acl->esme = NULL;
|
||||||
smpp_esme_put(esme);
|
smpp_esme_put(e);
|
||||||
|
|
||||||
return -EBADF;
|
return -EBADF;
|
||||||
}
|
}
|
||||||
|
@ -859,20 +860,33 @@ static int esme_link_write_cb(struct osmo_fd *ofd, struct msgb *msg)
|
||||||
|
|
||||||
rc = write(ofd->fd, msgb_data(msg), msgb_length(msg));
|
rc = write(ofd->fd, msgb_data(msg), msgb_length(msg));
|
||||||
if (rc == 0) {
|
if (rc == 0) {
|
||||||
osmo_fd_unregister(&esme->wqueue.bfd);
|
osmo_fd_unregister(&esme->esme->wqueue.bfd);
|
||||||
close(esme->wqueue.bfd.fd);
|
close(esme->esme->wqueue.bfd.fd);
|
||||||
esme->wqueue.bfd.fd = -1;
|
esme->esme->wqueue.bfd.fd = -1;
|
||||||
if (esme->acl)
|
if (esme->acl)
|
||||||
esme->acl->esme = NULL;
|
esme->acl->esme = NULL;
|
||||||
smpp_esme_put(esme);
|
smpp_esme_put(esme);
|
||||||
} else if (rc < msgb_length(msg)) {
|
} else if (rc < msgb_length(msg)) {
|
||||||
LOGPESME(esme, LOGL_ERROR, "Short write\n");
|
LOGPESME(esme->esme, LOGL_ERROR, "Short write\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct esme *esme_alloc(void *ctx)
|
||||||
|
{
|
||||||
|
struct esme *e = talloc_zero(ctx, struct esme);
|
||||||
|
if (!e)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
e->own_seq_nr = rand();
|
||||||
|
esme_inc_seq_nr(e);
|
||||||
|
osmo_wqueue_init(&e->wqueue, 10);
|
||||||
|
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
/* callback for already-accepted new TCP socket */
|
/* callback for already-accepted new TCP socket */
|
||||||
static int link_accept_cb(struct smsc *smsc, int fd,
|
static int link_accept_cb(struct smsc *smsc, int fd,
|
||||||
struct sockaddr_storage *s, socklen_t s_len)
|
struct sockaddr_storage *s, socklen_t s_len)
|
||||||
|
@ -883,22 +897,25 @@ static int link_accept_cb(struct smsc *smsc, int fd,
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
esme->esme = esme_alloc(esme);
|
||||||
|
if (!esme->esme) {
|
||||||
|
close(fd);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
INIT_LLIST_HEAD(&esme->smpp_cmd_list);
|
INIT_LLIST_HEAD(&esme->smpp_cmd_list);
|
||||||
smpp_esme_get(esme);
|
smpp_esme_get(esme);
|
||||||
esme->own_seq_nr = rand();
|
|
||||||
esme_inc_seq_nr(esme);
|
|
||||||
esme->smsc = smsc;
|
esme->smsc = smsc;
|
||||||
osmo_wqueue_init(&esme->wqueue, 10);
|
osmo_fd_setup(&esme->esme->wqueue.bfd, fd, OSMO_FD_READ, osmo_wqueue_bfd_cb, esme, 0);
|
||||||
osmo_fd_setup(&esme->wqueue.bfd, fd, OSMO_FD_READ, osmo_wqueue_bfd_cb, esme, 0);
|
|
||||||
|
|
||||||
if (osmo_fd_register(&esme->wqueue.bfd) != 0) {
|
if (osmo_fd_register(&esme->esme->wqueue.bfd) != 0) {
|
||||||
close(fd);
|
close(fd);
|
||||||
talloc_free(esme);
|
talloc_free(esme);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
esme->wqueue.read_cb = esme_link_read_cb;
|
esme->esme->wqueue.read_cb = esme_link_read_cb;
|
||||||
esme->wqueue.write_cb = esme_link_write_cb;
|
esme->esme->wqueue.write_cb = esme_link_write_cb;
|
||||||
|
|
||||||
llist_add_tail(&esme->list, &smsc->esme_list);
|
llist_add_tail(&esme->list, &smsc->esme_list);
|
||||||
|
|
||||||
|
|
|
@ -525,9 +525,9 @@ DEFUN(cfg_esme_no_alert_notif, cfg_esme_no_alert_notif_cmd,
|
||||||
static void dump_one_esme(struct vty *vty, struct osmo_esme *esme)
|
static void dump_one_esme(struct vty *vty, struct osmo_esme *esme)
|
||||||
{
|
{
|
||||||
vty_out(vty, "ESME System ID: %s, Password: %s, SMPP Version %02x%s",
|
vty_out(vty, "ESME System ID: %s, Password: %s, SMPP Version %02x%s",
|
||||||
esme->system_id, esme->acl ? esme->acl->passwd : "",
|
esme->esme->system_id, esme->acl ? esme->acl->passwd : "",
|
||||||
esme->smpp_version, VTY_NEWLINE);
|
esme->smpp_version, VTY_NEWLINE);
|
||||||
vty_out(vty, " Connection %s%s", osmo_sock_get_name(tall_vty_ctx, esme->wqueue.bfd.fd), VTY_NEWLINE);
|
vty_out(vty, " Connection %s%s", osmo_sock_get_name(tall_vty_ctx, esme->esme->wqueue.bfd.fd), VTY_NEWLINE);
|
||||||
if (esme->smsc->def_route == esme->acl)
|
if (esme->smsc->def_route == esme->acl)
|
||||||
vty_out(vty, " Is current default route%s", VTY_NEWLINE);
|
vty_out(vty, " Is current default route%s", VTY_NEWLINE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,9 +41,19 @@ smpp_mirror_CFLAGS = \
|
||||||
|
|
||||||
smpp_mirror_LDADD = \
|
smpp_mirror_LDADD = \
|
||||||
$(top_builddir)/src/libsmpputil/libsmpputil.a \
|
$(top_builddir)/src/libsmpputil/libsmpputil.a \
|
||||||
|
$(top_builddir)/src/libmsc/libmsc.a \
|
||||||
|
$(top_builddir)/src/libvlr/libvlr.a \
|
||||||
$(LIBOSMOCORE_LIBS) \
|
$(LIBOSMOCORE_LIBS) \
|
||||||
$(LIBOSMOGSM_LIBS) \
|
$(LIBOSMOGSM_LIBS) \
|
||||||
|
$(LIBOSMOVTY_LIBS) \
|
||||||
$(LIBOSMONETIF_LIBS) \
|
$(LIBOSMONETIF_LIBS) \
|
||||||
$(LIBSMPP34_LIBS) \
|
$(LIBSMPP34_LIBS) \
|
||||||
|
$(LIBOSMORANAP_LIBS) \
|
||||||
|
$(LIBASN1C_LIBS) \
|
||||||
|
$(LIBOSMOSIGTRAN_LIBS) \
|
||||||
|
$(LIBOSMOMGCPCLIENT_LIBS) \
|
||||||
|
$(LIBOSMOGSUPCLIENT_LIBS) \
|
||||||
|
$(LIBSQLITE3_LIBS) \
|
||||||
|
-lsctp \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -21,21 +21,6 @@
|
||||||
#include <osmocom/msc/debug.h>
|
#include <osmocom/msc/debug.h>
|
||||||
#include <osmocom/smpp/smpp.h>
|
#include <osmocom/smpp/smpp.h>
|
||||||
|
|
||||||
/* FIXME: merge with smpp_smsc.c */
|
|
||||||
|
|
||||||
struct esme {
|
|
||||||
uint32_t own_seq_nr;
|
|
||||||
|
|
||||||
struct osmo_wqueue wqueue;
|
|
||||||
enum esme_read_state read_state;
|
|
||||||
uint32_t read_len;
|
|
||||||
uint32_t read_idx;
|
|
||||||
struct msgb *read_msg;
|
|
||||||
|
|
||||||
uint8_t smpp_version;
|
|
||||||
char system_id[SMPP_SYS_ID_LEN+1];
|
|
||||||
char password[SMPP_SYS_ID_LEN+1];
|
|
||||||
};
|
|
||||||
|
|
||||||
/* FIXME: merge with smpp_smsc.c */
|
/* FIXME: merge with smpp_smsc.c */
|
||||||
static uint32_t esme_inc_seq_nr(struct esme *esme)
|
static uint32_t esme_inc_seq_nr(struct esme *esme)
|
||||||
|
@ -292,9 +277,6 @@ static int smpp_esme_init(struct esme *esme, const char *host, uint16_t port)
|
||||||
if (port == 0)
|
if (port == 0)
|
||||||
port = 2775;
|
port = 2775;
|
||||||
|
|
||||||
esme->own_seq_nr = rand();
|
|
||||||
esme_inc_seq_nr(esme);
|
|
||||||
osmo_wqueue_init(&esme->wqueue, 10);
|
|
||||||
esme->wqueue.bfd.data = esme;
|
esme->wqueue.bfd.data = esme;
|
||||||
esme->wqueue.read_cb = esme_read_cb;
|
esme->wqueue.read_cb = esme_read_cb;
|
||||||
esme->wqueue.write_cb = esme_write_cb;
|
esme->wqueue.write_cb = esme_write_cb;
|
||||||
|
@ -322,7 +304,7 @@ const struct log_info log_info = {
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct esme esme;
|
struct esme *esme;
|
||||||
char *host = "localhost";
|
char *host = "localhost";
|
||||||
int port = 0;
|
int port = 0;
|
||||||
int rc;
|
int rc;
|
||||||
|
@ -330,20 +312,22 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
msgb_talloc_ctx_init(ctx, 0);
|
msgb_talloc_ctx_init(ctx, 0);
|
||||||
|
|
||||||
memset(&esme, 0, sizeof(esme));
|
|
||||||
|
|
||||||
osmo_init_logging2(ctx, &log_info);
|
osmo_init_logging2(ctx, &log_info);
|
||||||
|
|
||||||
snprintf((char *) esme.system_id, sizeof(esme.system_id), "mirror");
|
esme = esme_alloc(ctx);
|
||||||
snprintf((char *) esme.password, sizeof(esme.password), "mirror");
|
if (!esme)
|
||||||
esme.smpp_version = 0x34;
|
exit(2);
|
||||||
|
|
||||||
|
snprintf((char *) esme->system_id, sizeof(esme->system_id), "mirror");
|
||||||
|
snprintf((char *) esme->password, sizeof(esme->password), "mirror");
|
||||||
|
esme->smpp_version = 0x34;
|
||||||
|
|
||||||
if (argc >= 2)
|
if (argc >= 2)
|
||||||
host = argv[1];
|
host = argv[1];
|
||||||
if (argc >= 3)
|
if (argc >= 3)
|
||||||
port = atoi(argv[2]);
|
port = atoi(argv[2]);
|
||||||
|
|
||||||
rc = smpp_esme_init(&esme, host, port);
|
rc = smpp_esme_init(esme, host, port);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue