9
0
Fork 0

Port from libm2ua to libxua

This commit is contained in:
Holger Hans Peter Freyther 2015-03-23 12:39:18 +01:00
parent 1cedd4a599
commit 4fd82de1ba
4 changed files with 74 additions and 71 deletions

View File

@ -20,7 +20,7 @@
#include "mtp_data.h" #include "mtp_data.h"
#include <osmocom/m2ua/m2ua_msg.h> #include <osmocom/sigtran/xua_msg.h>
#include <osmocom/core/write_queue.h> #include <osmocom/core/write_queue.h>
#include <netinet/in.h> #include <netinet/in.h>

View File

@ -29,4 +29,4 @@ osmo_stp_SOURCES = main_stp.c mtp_layer3.c thread.c pcap.c link_udp.c snmp_mtp.c
mgcp_callagent.c isup_filter.c mgcp_callagent.c isup_filter.c
osmo_stp_LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) $(LIBOSMOVTY_LIBS) \ osmo_stp_LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) $(LIBOSMOVTY_LIBS) \
$(LIBOSMOSCCP_LIBS) $(NEXUSWARE_C7_LIBS) \ $(LIBOSMOSCCP_LIBS) $(NEXUSWARE_C7_LIBS) \
-lpthread -lnetsnmp -lcrypto -lm2ua -lsctp -lpthread -lnetsnmp -lcrypto -lxua -lsctp

View File

@ -30,7 +30,8 @@
#include <sctp_m2ua.h> #include <sctp_m2ua.h>
#include <ss7_application.h> #include <ss7_application.h>
#include <osmocom/m2ua/m2ua_msg.h> #include <osmocom/sigtran/xua_msg.h>
#include <osmocom/sigtran/m2ua_types.h>
#include <osmocom/core/application.h> #include <osmocom/core/application.h>
#include <osmocom/core/rate_ctr.h> #include <osmocom/core/rate_ctr.h>
@ -91,9 +92,9 @@ static struct mtp_link_set *find_link_set(struct bsc_data *bsc,
static int inject_read_cb(struct osmo_fd *fd, unsigned int what) static int inject_read_cb(struct osmo_fd *fd, unsigned int what)
{ {
struct msgb *msg; struct msgb *msg;
struct m2ua_msg_part *data, *link; struct xua_msg_part *data, *link;
struct bsc_data *bsc; struct bsc_data *bsc;
struct m2ua_msg *m2ua; struct xua_msg *m2ua;
struct mtp_link_set *out_set; struct mtp_link_set *out_set;
uint8_t buf[4096]; uint8_t buf[4096];
@ -110,14 +111,14 @@ static int inject_read_cb(struct osmo_fd *fd, unsigned int what)
return -1; return -1;
} }
m2ua = m2ua_from_msg(rc, buf); m2ua = xua_from_msg(M2UA_VERSION, rc, buf);
if (!m2ua) { if (!m2ua) {
LOGP(DINP, LOGL_ERROR, "Failed to parse M2UA.\n"); LOGP(DINP, LOGL_ERROR, "Failed to parse M2UA.\n");
return -1; return -1;
} }
if (m2ua->hdr.msg_class == M2UA_CLS_MAUP && m2ua->hdr.msg_type == M2UA_MAUP_DATA) { if (m2ua->hdr.msg_class == M2UA_CLS_MAUP && m2ua->hdr.msg_type == M2UA_MAUP_DATA) {
data = m2ua_msg_find_tag(m2ua, M2UA_TAG_DATA); data = xua_msg_find_tag(m2ua, M2UA_TAG_DATA);
if (!data) { if (!data) {
LOGP(DINP, LOGL_ERROR, "MAUP Data without data.\n"); LOGP(DINP, LOGL_ERROR, "MAUP Data without data.\n");
goto exit; goto exit;
@ -128,7 +129,7 @@ static int inject_read_cb(struct osmo_fd *fd, unsigned int what)
goto exit; goto exit;
} }
link = m2ua_msg_find_tag(m2ua, MUA_TAG_IDENT_TEXT); link = xua_msg_find_tag(m2ua, MUA_TAG_IDENT_TEXT);
if (!link) { if (!link) {
LOGP(DINP, LOGL_ERROR, "Interface Identifier Text is mandantory.\n"); LOGP(DINP, LOGL_ERROR, "Interface Identifier Text is mandantory.\n");
goto exit; goto exit;
@ -162,7 +163,7 @@ static int inject_read_cb(struct osmo_fd *fd, unsigned int what)
} }
exit: exit:
m2ua_msg_free(m2ua); xua_msg_free(m2ua);
return 0; return 0;
} }
@ -219,7 +220,7 @@ int main(int argc, char **argv)
log_set_use_color(osmo_stderr_target, 0); log_set_use_color(osmo_stderr_target, 0);
sccp_set_log_area(DSCCP); sccp_set_log_area(DSCCP);
m2ua_set_log_area(DM2UA); xua_set_log_area(DM2UA);
bsc = bsc_data_create(); bsc = bsc_data_create();
if (!bsc) if (!bsc)

View File

@ -24,6 +24,8 @@
#include <osmocom/core/talloc.h> #include <osmocom/core/talloc.h>
#include <osmocom/sigtran/m2ua_types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <arpa/inet.h> #include <arpa/inet.h>
@ -89,11 +91,11 @@ static void m2ua_conn_destroy(struct sctp_m2ua_conn *conn)
} }
static int m2ua_conn_send(struct sctp_m2ua_conn *conn, static int m2ua_conn_send(struct sctp_m2ua_conn *conn,
struct m2ua_msg *m2ua, struct xua_msg *m2ua,
struct sctp_sndrcvinfo *info) struct sctp_sndrcvinfo *info)
{ {
struct msgb *msg; struct msgb *msg;
msg = m2ua_to_msg(m2ua); msg = xua_to_msg(M2UA_VERSION, m2ua);
if (!msg) if (!msg)
return -1; return -1;
@ -115,12 +117,12 @@ static int m2ua_conn_send_ntfy(struct mtp_m2ua_link *link,
struct sctp_m2ua_conn *conn, struct sctp_m2ua_conn *conn,
struct sctp_sndrcvinfo *info) struct sctp_sndrcvinfo *info)
{ {
struct m2ua_msg *msg; struct xua_msg *msg;
uint16_t state[2]; uint16_t state[2];
uint32_t ident; uint32_t ident;
int rc; int rc;
msg = m2ua_msg_alloc(); msg = xua_msg_alloc();
if (!msg) if (!msg)
return -1; return -1;
msg->hdr.msg_class = M2UA_CLS_MGMT; msg->hdr.msg_class = M2UA_CLS_MGMT;
@ -134,28 +136,28 @@ static int m2ua_conn_send_ntfy(struct mtp_m2ua_link *link,
else else
state[1] = ntohs(M2UA_STP_AS_INACTIVE); state[1] = ntohs(M2UA_STP_AS_INACTIVE);
m2ua_msg_add_data(msg, MUA_TAG_STATUS, 4, (uint8_t *) state); xua_msg_add_data(msg, MUA_TAG_STATUS, 4, (uint8_t *) state);
m2ua_msg_add_data(msg, MUA_TAG_ASP_IDENT, 4, conn->asp_ident); xua_msg_add_data(msg, MUA_TAG_ASP_IDENT, 4, conn->asp_ident);
ident = htonl(link->link_index); ident = htonl(link->link_index);
m2ua_msg_add_data(msg, MUA_TAG_IDENT_INT, 4, (uint8_t *) &ident); xua_msg_add_data(msg, MUA_TAG_IDENT_INT, 4, (uint8_t *) &ident);
rc = m2ua_conn_send(conn, msg, info); rc = m2ua_conn_send(conn, msg, info);
m2ua_msg_free(msg); xua_msg_free(msg);
return rc; return rc;
} }
static int m2ua_handle_asp_ack(struct sctp_m2ua_conn *conn, static int m2ua_handle_asp_ack(struct sctp_m2ua_conn *conn,
struct m2ua_msg *m2ua, struct xua_msg *m2ua,
struct sctp_sndrcvinfo *info) struct sctp_sndrcvinfo *info)
{ {
struct sctp_m2ua_transport *trans = conn->trans; struct sctp_m2ua_transport *trans = conn->trans;
struct sctp_m2ua_conn *tmp; struct sctp_m2ua_conn *tmp;
struct m2ua_msg_part *asp_ident; struct xua_msg_part *asp_ident;
struct m2ua_msg *ack; struct xua_msg *ack;
asp_ident = m2ua_msg_find_tag(m2ua, MUA_TAG_ASP_IDENT); asp_ident = xua_msg_find_tag(m2ua, MUA_TAG_ASP_IDENT);
if (!asp_ident) { if (!asp_ident) {
LOGP(DINP, LOGL_ERROR, "ASP UP lacks ASP IDENT\n"); LOGP(DINP, LOGL_ERROR, "ASP UP lacks ASP IDENT\n");
return -1; return -1;
@ -166,7 +168,7 @@ static int m2ua_handle_asp_ack(struct sctp_m2ua_conn *conn,
} }
/* TODO: Better handling for fail over is needed here */ /* TODO: Better handling for fail over is needed here */
ack = m2ua_msg_alloc(); ack = xua_msg_alloc();
if (!ack) { if (!ack) {
LOGP(DINP, LOGL_ERROR, "Failed to create response\n"); LOGP(DINP, LOGL_ERROR, "Failed to create response\n");
return -1; return -1;
@ -175,7 +177,7 @@ static int m2ua_handle_asp_ack(struct sctp_m2ua_conn *conn,
ack->hdr.msg_class = M2UA_CLS_ASPSM; ack->hdr.msg_class = M2UA_CLS_ASPSM;
ack->hdr.msg_type = M2UA_ASPSM_UP_ACK; ack->hdr.msg_type = M2UA_ASPSM_UP_ACK;
if (m2ua_conn_send(conn, ack, info) != 0) { if (m2ua_conn_send(conn, ack, info) != 0) {
m2ua_msg_free(ack); xua_msg_free(ack);
return -1; return -1;
} }
@ -195,12 +197,12 @@ static int m2ua_handle_asp_ack(struct sctp_m2ua_conn *conn,
tmp, conn); tmp, conn);
} }
m2ua_msg_free(ack); xua_msg_free(ack);
return 0; return 0;
} }
static int m2ua_handle_asp(struct sctp_m2ua_conn *conn, static int m2ua_handle_asp(struct sctp_m2ua_conn *conn,
struct m2ua_msg *m2ua, struct sctp_sndrcvinfo *info) struct xua_msg *m2ua, struct sctp_sndrcvinfo *info)
{ {
switch (m2ua->hdr.msg_type) { switch (m2ua->hdr.msg_type) {
case M2UA_ASPSM_UP: case M2UA_ASPSM_UP:
@ -216,13 +218,13 @@ static int m2ua_handle_asp(struct sctp_m2ua_conn *conn,
} }
static int m2ua_handle_asptm_act(struct sctp_m2ua_conn *conn, static int m2ua_handle_asptm_act(struct sctp_m2ua_conn *conn,
struct m2ua_msg *m2ua, struct xua_msg *m2ua,
struct sctp_sndrcvinfo *info) struct sctp_sndrcvinfo *info)
{ {
struct m2ua_msg_part *part; struct xua_msg_part *part;
struct m2ua_msg *ack; struct xua_msg *ack;
ack = m2ua_msg_alloc(); ack = xua_msg_alloc();
if (!ack) if (!ack)
return -1; return -1;
@ -252,12 +254,12 @@ static int m2ua_handle_asptm_act(struct sctp_m2ua_conn *conn,
link->conn = conn; link->conn = conn;
link->asp_active = 1; link->asp_active = 1;
m2ua_msg_add_data(ack, MUA_TAG_IDENT_INT, 4, (uint8_t *) &interf); xua_msg_add_data(ack, MUA_TAG_IDENT_INT, 4, (uint8_t *) &interf);
} }
if (m2ua_conn_send(conn, ack, info) != 0) { if (m2ua_conn_send(conn, ack, info) != 0) {
m2ua_msg_free(ack); xua_msg_free(ack);
return -1; return -1;
} }
@ -279,12 +281,12 @@ static int m2ua_handle_asptm_act(struct sctp_m2ua_conn *conn,
m2ua_conn_send_ntfy(link, conn, info); m2ua_conn_send_ntfy(link, conn, info);
} }
m2ua_msg_free(ack); xua_msg_free(ack);
return 0; return 0;
} }
static int m2ua_handle_asptm(struct sctp_m2ua_conn *conn, static int m2ua_handle_asptm(struct sctp_m2ua_conn *conn,
struct m2ua_msg *m2ua, struct xua_msg *m2ua,
struct sctp_sndrcvinfo *info) struct sctp_sndrcvinfo *info)
{ {
switch (m2ua->hdr.msg_type) { switch (m2ua->hdr.msg_type) {
@ -302,15 +304,15 @@ static int m2ua_handle_asptm(struct sctp_m2ua_conn *conn,
static int m2ua_handle_state_req(struct mtp_m2ua_link *link, static int m2ua_handle_state_req(struct mtp_m2ua_link *link,
struct sctp_m2ua_conn *conn, struct sctp_m2ua_conn *conn,
struct m2ua_msg *m2ua, struct xua_msg *m2ua,
struct sctp_sndrcvinfo *info) struct sctp_sndrcvinfo *info)
{ {
struct m2ua_msg_part *state; struct xua_msg_part *state;
struct m2ua_msg *conf; struct xua_msg *conf;
uint32_t index; uint32_t index;
int req; int req;
state = m2ua_msg_find_tag(m2ua, M2UA_TAG_STATE_REQ); state = xua_msg_find_tag(m2ua, M2UA_TAG_STATE_REQ);
if (!state || state->len != 4) { if (!state || state->len != 4) {
LOGP(DINP, LOGL_ERROR, "Mandantory state request not present.\n"); LOGP(DINP, LOGL_ERROR, "Mandantory state request not present.\n");
return -1; return -1;
@ -321,7 +323,7 @@ static int m2ua_handle_state_req(struct mtp_m2ua_link *link,
switch (req) { switch (req) {
case M2UA_STATUS_EMER_SET: case M2UA_STATUS_EMER_SET:
conf = m2ua_msg_alloc(); conf = xua_msg_alloc();
if (!conf) if (!conf)
return -1; return -1;
@ -329,13 +331,13 @@ static int m2ua_handle_state_req(struct mtp_m2ua_link *link,
req = htonl(req); req = htonl(req);
conf->hdr.msg_class = M2UA_CLS_MAUP; conf->hdr.msg_class = M2UA_CLS_MAUP;
conf->hdr.msg_type = M2UA_MAUP_STATE_CON; conf->hdr.msg_type = M2UA_MAUP_STATE_CON;
m2ua_msg_add_data(conf, MUA_TAG_IDENT_INT, 4, (uint8_t *) &index); xua_msg_add_data(conf, MUA_TAG_IDENT_INT, 4, (uint8_t *) &index);
m2ua_msg_add_data(conf, M2UA_TAG_STATE_REQ, 4, (uint8_t *) &req); xua_msg_add_data(conf, M2UA_TAG_STATE_REQ, 4, (uint8_t *) &req);
if (m2ua_conn_send(conn, conf, info) != 0) { if (m2ua_conn_send(conn, conf, info) != 0) {
m2ua_msg_free(conf); xua_msg_free(conf);
return -1; return -1;
} }
m2ua_msg_free(conf); xua_msg_free(conf);
LOGP(DINP, LOGL_NOTICE, "M2UA link-index %d is running.\n", link->link_index); LOGP(DINP, LOGL_NOTICE, "M2UA link-index %d is running.\n", link->link_index);
link->active = 1; link->active = 1;
@ -351,13 +353,13 @@ static int m2ua_handle_state_req(struct mtp_m2ua_link *link,
static int m2ua_handle_est_req(struct mtp_m2ua_link *link, static int m2ua_handle_est_req(struct mtp_m2ua_link *link,
struct sctp_m2ua_conn *conn, struct sctp_m2ua_conn *conn,
struct m2ua_msg *m2ua, struct xua_msg *m2ua,
struct sctp_sndrcvinfo *info) struct sctp_sndrcvinfo *info)
{ {
uint32_t index; uint32_t index;
struct m2ua_msg *conf; struct xua_msg *conf;
conf = m2ua_msg_alloc(); conf = xua_msg_alloc();
if (!conf) if (!conf)
return -1; return -1;
@ -365,28 +367,28 @@ static int m2ua_handle_est_req(struct mtp_m2ua_link *link,
conf->hdr.msg_type = M2UA_MAUP_EST_CON; conf->hdr.msg_type = M2UA_MAUP_EST_CON;
index = htonl(link->link_index); index = htonl(link->link_index);
m2ua_msg_add_data(conf, MUA_TAG_IDENT_INT, 4, (uint8_t *) &index); xua_msg_add_data(conf, MUA_TAG_IDENT_INT, 4, (uint8_t *) &index);
if (m2ua_conn_send(conn, conf, info) != 0) { if (m2ua_conn_send(conn, conf, info) != 0) {
link->established = 0; link->established = 0;
m2ua_msg_free(conf); xua_msg_free(conf);
return -1; return -1;
} }
link->established = 1; link->established = 1;
m2ua_msg_free(conf); xua_msg_free(conf);
return 0; return 0;
} }
static int m2ua_handle_rel_req(struct mtp_m2ua_link *link, static int m2ua_handle_rel_req(struct mtp_m2ua_link *link,
struct sctp_m2ua_conn *conn, struct sctp_m2ua_conn *conn,
struct m2ua_msg *m2ua, struct xua_msg *m2ua,
struct sctp_sndrcvinfo *info) struct sctp_sndrcvinfo *info)
{ {
uint32_t index; uint32_t index;
struct m2ua_msg *conf; struct xua_msg *conf;
conf = m2ua_msg_alloc(); conf = xua_msg_alloc();
if (!conf) if (!conf)
return -1; return -1;
@ -394,10 +396,10 @@ static int m2ua_handle_rel_req(struct mtp_m2ua_link *link,
conf->hdr.msg_type = M2UA_MAUP_REL_CON; conf->hdr.msg_type = M2UA_MAUP_REL_CON;
index = htonl(link->link_index); index = htonl(link->link_index);
m2ua_msg_add_data(conf, MUA_TAG_IDENT_INT, 4, (uint8_t *) &index); xua_msg_add_data(conf, MUA_TAG_IDENT_INT, 4, (uint8_t *) &index);
if (m2ua_conn_send(conn, conf, info) != 0) { if (m2ua_conn_send(conn, conf, info) != 0) {
m2ua_msg_free(conf); xua_msg_free(conf);
return -1; return -1;
} }
@ -405,20 +407,20 @@ static int m2ua_handle_rel_req(struct mtp_m2ua_link *link,
link->active = 0; link->active = 0;
LOGP(DINP, LOGL_NOTICE, "M2UA/Link link-index %d is released.\n", link->link_index); LOGP(DINP, LOGL_NOTICE, "M2UA/Link link-index %d is released.\n", link->link_index);
link_down(link->base); link_down(link->base);
m2ua_msg_free(conf); xua_msg_free(conf);
return 0; return 0;
} }
static int m2ua_handle_data(struct mtp_m2ua_link *_link, static int m2ua_handle_data(struct mtp_m2ua_link *_link,
struct sctp_m2ua_conn *conn, struct sctp_m2ua_conn *conn,
struct m2ua_msg *m2ua, struct xua_msg *m2ua,
struct sctp_sndrcvinfo *info) struct sctp_sndrcvinfo *info)
{ {
struct msgb *msg; struct msgb *msg;
struct m2ua_msg_part *data; struct xua_msg_part *data;
struct mtp_link *link; struct mtp_link *link;
data = m2ua_msg_find_tag(m2ua, M2UA_TAG_DATA); data = xua_msg_find_tag(m2ua, M2UA_TAG_DATA);
if (!data) { if (!data) {
LOGP(DINP, LOGL_ERROR, "No DATA in DATA message.\n"); LOGP(DINP, LOGL_ERROR, "No DATA in DATA message.\n");
return -1; return -1;
@ -450,7 +452,7 @@ static int m2ua_handle_data(struct mtp_m2ua_link *_link,
static int m2ua_handle_maup(struct mtp_m2ua_link *link, static int m2ua_handle_maup(struct mtp_m2ua_link *link,
struct sctp_m2ua_conn *conn, struct sctp_m2ua_conn *conn,
struct m2ua_msg *m2ua, struct xua_msg *m2ua,
struct sctp_sndrcvinfo *info) struct sctp_sndrcvinfo *info)
{ {
if (!link) { if (!link) {
@ -497,7 +499,7 @@ static int m2ua_handle_maup(struct mtp_m2ua_link *link,
} }
static int m2ua_handle_mgmt(struct sctp_m2ua_conn *conn, static int m2ua_handle_mgmt(struct sctp_m2ua_conn *conn,
struct m2ua_msg *m2ua, struct sctp_sndrcvinfo *info) struct xua_msg *m2ua, struct sctp_sndrcvinfo *info)
{ {
switch (m2ua->hdr.msg_type) { switch (m2ua->hdr.msg_type) {
case M2UA_MGMT_ERROR: case M2UA_MGMT_ERROR:
@ -511,11 +513,11 @@ static int m2ua_handle_mgmt(struct sctp_m2ua_conn *conn,
return 0; return 0;
} }
static int m2ua_find_interface(struct m2ua_msg *m2ua, int def) static int m2ua_find_interface(struct xua_msg *m2ua, int def)
{ {
struct m2ua_msg_part *ident; struct xua_msg_part *ident;
ident = m2ua_msg_find_tag(m2ua, MUA_TAG_IDENT_INT); ident = xua_msg_find_tag(m2ua, MUA_TAG_IDENT_INT);
if (ident && ident->len == 4) { if (ident && ident->len == 4) {
memcpy(&def, ident->dat, 4); memcpy(&def, ident->dat, 4);
def = ntohl(def); def = ntohl(def);
@ -528,8 +530,8 @@ static int m2ua_conn_handle(struct sctp_m2ua_conn *conn,
struct msgb *msg, struct sctp_sndrcvinfo *info) struct msgb *msg, struct sctp_sndrcvinfo *info)
{ {
struct mtp_m2ua_link *link; struct mtp_m2ua_link *link;
struct m2ua_msg *m2ua; struct xua_msg *m2ua;
m2ua = m2ua_from_msg(msg->len, msg->data); m2ua = xua_from_msg(M2UA_VERSION, msg->len, msg->data);
if (!m2ua) { if (!m2ua) {
LOGP(DINP, LOGL_ERROR, "Failed to parse the message.\n"); LOGP(DINP, LOGL_ERROR, "Failed to parse the message.\n");
return -1; return -1;
@ -556,7 +558,7 @@ static int m2ua_conn_handle(struct sctp_m2ua_conn *conn,
break; break;
} }
m2ua_msg_free(m2ua); xua_msg_free(m2ua);
return 0; return 0;
} }
@ -604,7 +606,7 @@ static int sctp_m2ua_write(struct mtp_link *link, struct msgb *msg)
{ {
struct mtp_m2ua_link *mlink; struct mtp_m2ua_link *mlink;
struct sctp_sndrcvinfo info; struct sctp_sndrcvinfo info;
struct m2ua_msg *m2ua; struct xua_msg *m2ua;
uint32_t interface; uint32_t interface;
mlink = (struct mtp_m2ua_link *) link->data; mlink = (struct mtp_m2ua_link *) link->data;
@ -622,7 +624,7 @@ static int sctp_m2ua_write(struct mtp_link *link, struct msgb *msg)
goto clean; goto clean;
} }
m2ua = m2ua_msg_alloc(); m2ua = xua_msg_alloc();
if (!m2ua) if (!m2ua)
goto clean; goto clean;
@ -632,8 +634,8 @@ static int sctp_m2ua_write(struct mtp_link *link, struct msgb *msg)
m2ua->hdr.msg_type = M2UA_MAUP_DATA; m2ua->hdr.msg_type = M2UA_MAUP_DATA;
interface = htonl(mlink->link_index); interface = htonl(mlink->link_index);
m2ua_msg_add_data(m2ua, MUA_TAG_IDENT_INT, 4, (uint8_t *) &interface); xua_msg_add_data(m2ua, MUA_TAG_IDENT_INT, 4, (uint8_t *) &interface);
m2ua_msg_add_data(m2ua, M2UA_TAG_DATA, msg->len, msg->data); xua_msg_add_data(m2ua, M2UA_TAG_DATA, msg->len, msg->data);
memset(&info, 0, sizeof(info)); memset(&info, 0, sizeof(info));
info.sinfo_stream = 1; info.sinfo_stream = 1;
@ -641,7 +643,7 @@ static int sctp_m2ua_write(struct mtp_link *link, struct msgb *msg)
info.sinfo_ppid = htonl(SCTP_PPID_M2UA); info.sinfo_ppid = htonl(SCTP_PPID_M2UA);
m2ua_conn_send(mlink->conn, m2ua, &info); m2ua_conn_send(mlink->conn, m2ua, &info);
m2ua_msg_free(m2ua); xua_msg_free(m2ua);
clean: clean:
msgb_free(msg); msgb_free(msg);