Skip to content

Commit

Permalink
Add basic support for enquire_link
Browse files Browse the repository at this point in the history
  • Loading branch information
victor-ciurel authored and razvancrainea committed Jan 23, 2019
1 parent 041a12e commit c7264f4
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 0 deletions.
87 changes: 87 additions & 0 deletions modules/proto_smpp/proto_smpp.c
Expand Up @@ -59,6 +59,7 @@ static int smpp_write_async_req(struct tcp_connection* con,int fd);
static int smpp_conn_init(struct tcp_connection* c);
static void smpp_conn_clean(struct tcp_connection* c);
static int send_smpp_msg(struct sip_msg* msg);
static void send_enquire_link_request(void);

static void build_smpp_sessions_from_db(void);

Expand Down Expand Up @@ -807,6 +808,16 @@ void handle_data_sm_resp_cmd(smpp_header_t *header, char *buffer, struct receive
LM_DBG("Received data_sm_resp command\n");
}

void handle_enquire_link_cmd(smpp_header_t *header, char *buffer, struct receive_info *rcv)
{
LM_DBG("Received enquire_link command\n");
}

void handle_enquire_link_resp_cmd(smpp_header_t *header, char *buffer, struct receive_info *rcv)
{
LM_DBG("Received enquire_link_resp command\n");
}

static void handle_smpp_msg(char* buffer, struct receive_info *rcv)
{
smpp_header_t header;
Expand Down Expand Up @@ -843,6 +854,12 @@ static void handle_smpp_msg(char* buffer, struct receive_info *rcv)
case DATA_SM_RESP_CID:
handle_data_sm_resp_cmd(&header, buffer, rcv);
break;
case ENQUIRE_LINK_CID:
handle_enquire_link_cmd(&header, buffer, rcv);
break;
case ENQUIRE_LINK_RESP_CID:
handle_enquire_link_resp_cmd(&header, buffer, rcv);
break;
default:
LM_WARN("Unknown or unsupported command received %08X\n", header.command_id);
}
Expand Down Expand Up @@ -1007,6 +1024,76 @@ void send_submit_sm_request(str *msg)
pkg_free(req);
}

static int build_enquire_link_request(smpp_enquire_link_req_t **preq, int32_t sequence_number)
{
if (!preq) {
LM_ERR("NULL param");
goto err;
}

/* request allocations */
smpp_enquire_link_req_t *req = pkg_malloc(sizeof(*req));
*preq = req;
if (!req) {
LM_ERR("malloc error for request");
goto err;
}

smpp_header_t *header = pkg_malloc(sizeof(*header));
if (!header) {
LM_ERR("malloc error for header");
goto header_err;
}

req->payload.s = pkg_malloc(REQ_MAX_SZ(ENQUIRE_LINK));
if (!req->payload.s) {
LM_ERR("malloc error for payload");
goto payload_err;
}

req->header = header;

header->command_length = HEADER_SZ;
header->command_id = ENQUIRE_LINK_CID;
header->command_status = 0;
header->sequence_number = sequence_number;

get_payload_from_header(req->payload.s, header);

req->payload.len = header->command_length;

return 0;

payload_err:
pkg_free(header);
header_err:
pkg_free(req);
err:
return -1;
}

static void send_enquire_link_request(void)
{
smpp_enquire_link_req_t *req;
if (build_enquire_link_request(&req, 0)) {
LM_ERR("error creating enquire_link_sm request\n");
return;
}

struct tcp_connection *conn;
int fd;
int ret = tcp_conn_get(0, (*g_sessions)->ip, (*g_sessions)->port, PROTO_SMPP, &conn, &fd);
if (ret < 0) {
LM_ERR("return code %d\n", ret);
goto free_req;
}
int n = tsend_stream(fd, req->payload.s, req->payload.len, 1000);
LM_INFO("send %d bytes\n", n);

free_req:
pkg_free(req);
}

static int send_smpp_msg(struct sip_msg *msg)
{
LM_INFO("send_smpp_msg called\n");
Expand Down
9 changes: 9 additions & 0 deletions modules/proto_smpp/proto_smpp.h
Expand Up @@ -16,6 +16,7 @@
#define BIND_RECEIVER_BODY_MAX_SZ 82
#define SUBMIT_SM_BODY_MAX_SZ 348
#define DELIVER_SM_RESP_BODY_MAX_SZ 1
#define ENQUIRE_LINK_BODY_MAX_SZ 0
#define REQ_MAX_SZ(_name) (HEADER_SZ + _name ## _BODY_MAX_SZ)


Expand Down Expand Up @@ -158,12 +159,20 @@ typedef struct { \
str payload; \
} _name ## _req_t

#define TYPEDEF_SIMPLE_SMPP_REQUEST(_name) \
typedef struct { \
smpp_header_t *header; \
str payload; \
} _name ## _req_t

TYPEDEF_SMPP_REQUEST(smpp_bind_receiver);
TYPEDEF_SMPP_REQUEST(smpp_bind_transmitter);
TYPEDEF_SMPP_REQUEST(smpp_bind_transceiver);
TYPEDEF_SMPP_REQUEST(smpp_deliver_sm);
TYPEDEF_SMPP_REQUEST(smpp_deliver_sm_resp);
TYPEDEF_SMPP_REQUEST(smpp_submit_sm);
TYPEDEF_SIMPLE_SMPP_REQUEST(smpp_enquire_link);
TYPEDEF_SIMPLE_SMPP_REQUEST(smpp_enquire_link_resp);

typedef struct smpp_session {
uint32_t id;
Expand Down

0 comments on commit c7264f4

Please sign in to comment.