blob: eed113fdd56ecaba63bae203c66c7009b06d9afe [file] [log] [blame]
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +08001/*
Holger Hans Peter Freytherc8405692011-01-02 20:24:08 +01002 * (C) 2010-2011 by Holger Hans Peter Freyther <zecke@selfish.org>
3 * (C) 2010-2011 by On-Waves
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +08004 * All Rights Reserved
5 *
Holger Hans Peter Freytherde56c222011-01-16 17:45:14 +01006 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU Affero General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +08009 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Holger Hans Peter Freytherde56c222011-01-16 17:45:14 +010014 * GNU Affero General Public License for more details.
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080015 *
Holger Hans Peter Freytherde56c222011-01-16 17:45:14 +010016 * You should have received a copy of the GNU Affero General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080018 *
19 */
20#ifndef mtp_data_h
21#define mtp_data_h
22
Holger Hans Peter Freythercbf7d182010-07-31 05:25:35 +080023#include <osmocore/msgb.h>
24#include <osmocore/timer.h>
25#include <osmocore/utils.h>
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080026
Holger Hans Peter Freytherc8405692011-01-02 20:24:08 +010027struct bsc_data;
Holger Hans Peter Freyther0e2f9112011-01-17 11:54:39 +010028struct mtp_link;
Holger Hans Peter Freythera8ce0612011-01-20 16:30:24 +010029struct mtp_level_3_mng *mng;
Holger Hans Peter Freytherc5d897e2011-01-21 20:54:55 +010030struct rate_ctr_group;
Holger Hans Peter Freythera7bc3aa2011-02-16 16:12:07 +010031struct ss7_application;
Holger Hans Peter Freytherc8405692011-01-02 20:24:08 +010032
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080033/* MTP Level3 timers */
34
35/* Timers for SS7 */
36#define MTP_T1 12, 0
37#define MTP_T2 30, 0
38#define START_DELAY 8, 0
39
40/**
41 * The state of the mtp_link in terms of layer3 and upwards
42 */
Holger Hans Peter Freyther569f1e12011-01-02 18:47:49 +010043struct mtp_link_set {
Holger Hans Peter Freyther89fa11a2011-02-10 18:26:07 +010044 struct llist_head entry;
Holger Hans Peter Freythera33b23f2011-02-16 23:37:40 +010045 int nr;
Holger Hans Peter Freyther599c9a42011-02-15 11:18:38 +010046 char *name;
47
Holger Hans Peter Freyther89fa11a2011-02-10 18:26:07 +010048
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080049 /* routing info.. */
Holger Hans Peter Freytherd8a73e22011-01-17 22:37:11 +010050 int dpc, opc, sccp_opc, isup_opc;
Holger Hans Peter Freyther4e3e28e2010-11-26 21:05:39 +010051 int ni;
Holger Hans Peter Freythere976df12010-11-26 21:07:11 +010052 int spare;
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080053
Holger Hans Peter Freyther38d936a2011-01-26 12:41:42 +010054
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080055 /* internal state */
56 /* the MTP1 link is up */
57 int available;
58 int running;
59 int sccp_up;
Holger Hans Peter Freyther606eae82011-01-20 14:23:10 +010060 int linkset_up;
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080061
Holger Hans Peter Freyther346e1c42011-01-02 18:11:37 +010062 int last_sls;
63
Holger Hans Peter Freytherfe72c162011-01-04 13:21:52 +010064 struct llist_head links;
Holger Hans Peter Freyther1cc24562011-01-20 18:26:18 +010065 int nr_links;
Holger Hans Peter Freyther0e2f9112011-01-17 11:54:39 +010066 struct mtp_link *slc[16];
Holger Hans Peter Freythera8ce0612011-01-20 16:30:24 +010067 int sltm_once;
Holger Hans Peter Freyther644aafb2011-01-03 23:51:07 +010068
Holger Hans Peter Freyther1b5d8462011-02-17 01:48:42 +010069 /* ssn map */
70 int supported_ssn[256];
71
Holger Hans Peter Freytherf6375b42011-01-22 21:01:23 +010072 int pcap_fd;
73
Holger Hans Peter Freytherefbd8c22011-01-17 20:21:45 +010074 /* special handling */
75 int pass_all_isup;
76
Holger Hans Peter Freytherc5d897e2011-01-21 20:54:55 +010077 /* statistics */
78 struct rate_ctr_group *ctrg;
79
Holger Hans Peter Freytherc8405692011-01-02 20:24:08 +010080 /* custom data */
Holger Hans Peter Freythera7bc3aa2011-02-16 16:12:07 +010081 struct ss7_application *app;
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080082};
83
Holger Hans Peter Freyther0e2f9112011-01-17 11:54:39 +010084/**
85 * One physical link to somewhere. This is the base
86 * with the interface used by the mtp_link_set. There
87 * will be specific implementations for M2UA, UDP and
88 * other transport means.
89 */
90struct mtp_link {
91 struct llist_head entry;
92
93 int pcap_fd;
Holger Hans Peter Freyther2d845fc2011-01-20 15:42:13 +010094 struct mtp_link_set *set;
Holger Hans Peter Freyther0e2f9112011-01-17 11:54:39 +010095
96 int available;
97
98 struct timer_list link_activate;
99
Holger Hans Peter Freythera8ce0612011-01-20 16:30:24 +0100100 /* link test routine */
101 uint8_t test_ptrn[14];
102
Holger Hans Peter Freytherea5ce232011-01-23 23:31:26 +0100103 int blocked;
104
Holger Hans Peter Freyther1ec2a742011-01-25 13:24:06 +0100105 int first_sls;
Holger Hans Peter Freyther1cc24562011-01-20 18:26:18 +0100106 int link_no;
Holger Hans Peter Freythera8ce0612011-01-20 16:30:24 +0100107 int sltm_pending;
108 int was_up;
109
110 int slta_misses;
111 struct timer_list t1_timer;
112 struct timer_list t2_timer;
113
Holger Hans Peter Freyther4c1eb0e2011-01-22 15:52:07 +0100114 /* statistics */
115 struct rate_ctr_group *ctrg;
116
Holger Hans Peter Freythera8ce0612011-01-20 16:30:24 +0100117 /* callback's to implement */
Holger Hans Peter Freyther0e2f9112011-01-17 11:54:39 +0100118 int (*start)(struct mtp_link *);
119 int (*write)(struct mtp_link *, struct msgb *msg);
120 int (*shutdown)(struct mtp_link *);
121 int (*reset)(struct mtp_link *data);
122 int (*clear_queue)(struct mtp_link *data);
123};
124
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800125
Holger Hans Peter Freyther569f1e12011-01-02 18:47:49 +0100126void mtp_link_set_stop(struct mtp_link_set *link);
127void mtp_link_set_reset(struct mtp_link_set *link);
Holger Hans Peter Freytherbee2ed12011-01-18 13:29:42 +0100128int mtp_link_set_data(struct mtp_link *link, struct msgb *msg);
Holger Hans Peter Freyther569f1e12011-01-02 18:47:49 +0100129int mtp_link_set_submit_sccp_data(struct mtp_link_set *link, int sls, const uint8_t *data, unsigned int length);
130int mtp_link_set_submit_isup_data(struct mtp_link_set *link, int sls, const uint8_t *data, unsigned int length);
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800131
Holger Hans Peter Freyther069e6352011-01-04 13:01:23 +0100132void mtp_link_set_init_slc(struct mtp_link_set *set);
Holger Hans Peter Freyther4c1eb0e2011-01-22 15:52:07 +0100133int mtp_link_set_add_link(struct mtp_link_set *set, struct mtp_link *link);
Holger Hans Peter Freyther069e6352011-01-04 13:01:23 +0100134
Holger Hans Peter Freytherea5ce232011-01-23 23:31:26 +0100135void mtp_link_block(struct mtp_link *link);
136void mtp_link_unblock(struct mtp_link *link);
137
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800138
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800139/* to be implemented for MSU sending */
Holger Hans Peter Freyther9543f4a2011-01-24 20:49:58 +0100140void mtp_link_submit(struct mtp_link *link, struct msgb *msg);
Holger Hans Peter Freyther569f1e12011-01-02 18:47:49 +0100141void mtp_link_set_forward_sccp(struct mtp_link_set *link, struct msgb *msg, int sls);
Holger Hans Peter Freyther1b6901e2011-01-17 16:13:28 +0100142void mtp_link_set_forward_isup(struct mtp_link_set *link, struct msgb *msg, int sls);
Holger Hans Peter Freyther0e2f9112011-01-17 11:54:39 +0100143void mtp_link_restart(struct mtp_link *link);
Holger Hans Peter Freyther0452f222011-02-03 13:35:42 +0100144int mtp_link_set_send(struct mtp_link_set *set, struct msgb *msg);
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800145
Holger Hans Peter Freythera8ce0612011-01-20 16:30:24 +0100146/* link related routines */
147void mtp_link_down(struct mtp_link *data);
148void mtp_link_up(struct mtp_link *data);
149
Holger Hans Peter Freyther4c1eb0e2011-01-22 15:52:07 +0100150int mtp_link_init(struct mtp_link *link);
Holger Hans Peter Freythera8ce0612011-01-20 16:30:24 +0100151void mtp_link_start_link_test(struct mtp_link *link);
152void mtp_link_stop_link_test(struct mtp_link *link);
153int mtp_link_slta(struct mtp_link *link, uint16_t l3_len, struct mtp_level_3_mng *mng);
154
Holger Hans Peter Freytherfa8cf2d2011-01-20 16:51:34 +0100155void mtp_link_failure(struct mtp_link *fail);
156
Holger Hans Peter Freythera8ce0612011-01-20 16:30:24 +0100157/* internal routines */
158struct msgb *mtp_msg_alloc(struct mtp_link_set *link);
Holger Hans Peter Freythera8ce0612011-01-20 16:30:24 +0100159
Holger Hans Peter Freyther599c9a42011-02-15 11:18:38 +0100160/* link management */
161struct mtp_link_set *mtp_link_set_alloc(struct bsc_data *bsc);
Holger Hans Peter Freyther694337f2011-02-15 11:24:05 +0100162struct mtp_link_set *mtp_link_set_num(struct bsc_data *bsc, int num);
Holger Hans Peter Freyther599c9a42011-02-15 11:18:38 +0100163
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800164#endif