diff options
-rw-r--r-- | include/mtp_data.h | 5 | ||||
-rw-r--r-- | src/links.c | 6 | ||||
-rw-r--r-- | src/mtp_layer3.c | 19 |
3 files changed, 21 insertions, 9 deletions
diff --git a/include/mtp_data.h b/include/mtp_data.h index f2aeaec..a6e9368 100644 --- a/include/mtp_data.h +++ b/include/mtp_data.h @@ -65,6 +65,7 @@ struct mtp_link_set { struct timer_list delay_timer; struct link_data *link; + struct link_data *slc[16]; /* custom data */ struct bsc_data *bsc; @@ -78,12 +79,14 @@ int mtp_link_set_data(struct mtp_link_set *link, struct msgb *msg); int mtp_link_set_submit_sccp_data(struct mtp_link_set *link, int sls, const uint8_t *data, unsigned int length); int mtp_link_set_submit_isup_data(struct mtp_link_set *link, int sls, const uint8_t *data, unsigned int length); +void mtp_link_set_init_slc(struct mtp_link_set *set); + /* one time init function */ void mtp_link_set_init(void); /* to be implemented for MSU sending */ -void mtp_link_set_submit(struct mtp_link_set *link, struct msgb *msg); +void mtp_link_set_submit(struct link_data *link, struct msgb *msg); void mtp_link_set_forward_sccp(struct mtp_link_set *link, struct msgb *msg, int sls); void mtp_link_set_restart(struct mtp_link_set *link); void mtp_link_set_sccp_down(struct mtp_link_set *link); diff --git a/src/links.c b/src/links.c index 1102ee6..b9458e5 100644 --- a/src/links.c +++ b/src/links.c @@ -33,20 +33,22 @@ void mtp_link_down(struct link_data *link) { mtp_linkset_down(link->the_link); link->clear_queue(link); + mtp_link_set_init_slc(link->the_link); } void mtp_link_up(struct link_data *link) { mtp_linkset_up(link->the_link); + mtp_link_set_init_slc(link->the_link); } void mtp_link_set_sccp_down(struct mtp_link_set *link) { } -void mtp_link_set_submit(struct mtp_link_set *set, struct msgb *msg) +void mtp_link_set_submit(struct link_data *link, struct msgb *msg) { - set->link->write(set->link, msg); + link->write(link, msg); } void mtp_link_set_restart(struct mtp_link_set *set) diff --git a/src/mtp_layer3.c b/src/mtp_layer3.c index 0c835cd..e6eb2c3 100644 --- a/src/mtp_layer3.c +++ b/src/mtp_layer3.c @@ -202,7 +202,7 @@ static void mtp_send_sltm(struct mtp_link_set *link) return; } - mtp_link_set_submit(link, msg); + mtp_link_set_submit(link->slc[0], msg); } static void mtp_sltm_t1_timeout(void *_link) @@ -313,13 +313,13 @@ static int mtp_link_sign_msg(struct mtp_link_set *link, struct mtp_level_3_hdr * msg = mtp_tfp_alloc(link, 0); if (!msg) return -1; - mtp_link_set_submit(link, msg); + mtp_link_set_submit(link->slc[0], msg); msg = mtp_tra_alloc(link); if (!msg) return -1; - mtp_link_set_submit(link, msg); + mtp_link_set_submit(link->slc[0], msg); link->sccp_up = 1; link->was_up = 1; LOGP(DINP, LOGL_INFO, "SCCP traffic allowed. %p\n", link); @@ -371,7 +371,7 @@ static int mtp_link_regular_msg(struct mtp_link_set *link, struct mtp_level_3_hd out = mtp_create_slta(link, mng, l3_len); if (!out) return -1; - mtp_link_set_submit(link, out); + mtp_link_set_submit(link->slc[0], out); return 0; break; case MTP_TST_MSG_SLTA: @@ -455,7 +455,7 @@ static int mtp_link_sccp_data(struct mtp_link_set *link, struct mtp_level_3_hdr if (!out) return -1; - mtp_link_set_submit(link, out); + mtp_link_set_submit(link->slc[MTP_LINK_SLS(hdr->addr)], out); return 0; } @@ -544,6 +544,13 @@ static int mtp_int_submit(struct mtp_link_set *link, int pc, int sls, int type, put_ptr = msgb_put(msg, length); memcpy(put_ptr, data, length); - mtp_link_set_submit(link, msg); + mtp_link_set_submit(link->slc[sls % 16], msg); return 0; } + +void mtp_link_set_init_slc(struct mtp_link_set *set) +{ + int i; + for (i = 0; i < ARRAY_SIZE(set->slc); ++i) + set->slc[i] = set->link; +} |