blob: 0e35ab5776114067f928f11ad06295d38712bcf3 [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 Freytherc8405692011-01-02 20:24:08 +010031
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080032/* MTP Level3 timers */
33
34/* Timers for SS7 */
35#define MTP_T1 12, 0
36#define MTP_T2 30, 0
37#define START_DELAY 8, 0
38
39/**
40 * The state of the mtp_link in terms of layer3 and upwards
41 */
Holger Hans Peter Freyther569f1e12011-01-02 18:47:49 +010042struct mtp_link_set {
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080043 /* routing info.. */
Holger Hans Peter Freytherd8a73e22011-01-17 22:37:11 +010044 int dpc, opc, sccp_opc, isup_opc;
Holger Hans Peter Freyther4e3e28e2010-11-26 21:05:39 +010045 int ni;
Holger Hans Peter Freythere976df12010-11-26 21:07:11 +010046 int spare;
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080047
Holger Hans Peter Freyther38d936a2011-01-26 12:41:42 +010048 const char *name;
49
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080050 /* internal state */
51 /* the MTP1 link is up */
52 int available;
53 int running;
54 int sccp_up;
Holger Hans Peter Freyther606eae82011-01-20 14:23:10 +010055 int linkset_up;
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080056
Holger Hans Peter Freyther346e1c42011-01-02 18:11:37 +010057 int last_sls;
58
Holger Hans Peter Freytherfe72c162011-01-04 13:21:52 +010059 struct llist_head links;
Holger Hans Peter Freyther1cc24562011-01-20 18:26:18 +010060 int nr_links;
Holger Hans Peter Freyther0e2f9112011-01-17 11:54:39 +010061 struct mtp_link *slc[16];
Holger Hans Peter Freythera8ce0612011-01-20 16:30:24 +010062 int sltm_once;
Holger Hans Peter Freyther644aafb2011-01-03 23:51:07 +010063
Holger Hans Peter Freytherf6375b42011-01-22 21:01:23 +010064 int pcap_fd;
65
Holger Hans Peter Freytherefbd8c22011-01-17 20:21:45 +010066 /* special handling */
67 int pass_all_isup;
68
Holger Hans Peter Freytherc5d897e2011-01-21 20:54:55 +010069 /* statistics */
70 struct rate_ctr_group *ctrg;
71
Holger Hans Peter Freytherc8405692011-01-02 20:24:08 +010072 /* custom data */
73 struct bsc_data *bsc;
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +080074};
75
Holger Hans Peter Freyther0e2f9112011-01-17 11:54:39 +010076/**
77 * One physical link to somewhere. This is the base
78 * with the interface used by the mtp_link_set. There
79 * will be specific implementations for M2UA, UDP and
80 * other transport means.
81 */
82struct mtp_link {
83 struct llist_head entry;
84
85 int pcap_fd;
Holger Hans Peter Freyther2d845fc2011-01-20 15:42:13 +010086 struct mtp_link_set *set;
Holger Hans Peter Freyther0e2f9112011-01-17 11:54:39 +010087
88 int available;
89
90 struct timer_list link_activate;
91
Holger Hans Peter Freythera8ce0612011-01-20 16:30:24 +010092 /* link test routine */
93 uint8_t test_ptrn[14];
94
Holger Hans Peter Freytherea5ce232011-01-23 23:31:26 +010095 int blocked;
96
Holger Hans Peter Freyther1ec2a742011-01-25 13:24:06 +010097 int first_sls;
Holger Hans Peter Freyther1cc24562011-01-20 18:26:18 +010098 int link_no;
Holger Hans Peter Freythera8ce0612011-01-20 16:30:24 +010099 int sltm_pending;
100 int was_up;
101
102 int slta_misses;
103 struct timer_list t1_timer;
104 struct timer_list t2_timer;
105
Holger Hans Peter Freyther4c1eb0e2011-01-22 15:52:07 +0100106 /* statistics */
107 struct rate_ctr_group *ctrg;
108
Holger Hans Peter Freythera8ce0612011-01-20 16:30:24 +0100109 /* callback's to implement */
Holger Hans Peter Freyther0e2f9112011-01-17 11:54:39 +0100110 int (*start)(struct mtp_link *);
111 int (*write)(struct mtp_link *, struct msgb *msg);
112 int (*shutdown)(struct mtp_link *);
113 int (*reset)(struct mtp_link *data);
114 int (*clear_queue)(struct mtp_link *data);
115};
116
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800117
Holger Hans Peter Freyther569f1e12011-01-02 18:47:49 +0100118struct mtp_link_set *mtp_link_set_alloc(void);
119void mtp_link_set_stop(struct mtp_link_set *link);
120void mtp_link_set_reset(struct mtp_link_set *link);
Holger Hans Peter Freytherbee2ed12011-01-18 13:29:42 +0100121int mtp_link_set_data(struct mtp_link *link, struct msgb *msg);
Holger Hans Peter Freyther569f1e12011-01-02 18:47:49 +0100122int mtp_link_set_submit_sccp_data(struct mtp_link_set *link, int sls, const uint8_t *data, unsigned int length);
123int 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 +0800124
Holger Hans Peter Freyther069e6352011-01-04 13:01:23 +0100125void mtp_link_set_init_slc(struct mtp_link_set *set);
Holger Hans Peter Freyther4c1eb0e2011-01-22 15:52:07 +0100126int mtp_link_set_add_link(struct mtp_link_set *set, struct mtp_link *link);
Holger Hans Peter Freyther069e6352011-01-04 13:01:23 +0100127
Holger Hans Peter Freytherea5ce232011-01-23 23:31:26 +0100128void mtp_link_block(struct mtp_link *link);
129void mtp_link_unblock(struct mtp_link *link);
130
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800131
132/* one time init function */
Holger Hans Peter Freyther569f1e12011-01-02 18:47:49 +0100133void mtp_link_set_init(void);
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800134
135/* to be implemented for MSU sending */
Holger Hans Peter Freyther9543f4a2011-01-24 20:49:58 +0100136void mtp_link_submit(struct mtp_link *link, struct msgb *msg);
Holger Hans Peter Freyther569f1e12011-01-02 18:47:49 +0100137void mtp_link_set_forward_sccp(struct mtp_link_set *link, struct msgb *msg, int sls);
Holger Hans Peter Freyther1b6901e2011-01-17 16:13:28 +0100138void mtp_link_set_forward_isup(struct mtp_link_set *link, struct msgb *msg, int sls);
Holger Hans Peter Freyther0e2f9112011-01-17 11:54:39 +0100139void mtp_link_restart(struct mtp_link *link);
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800140
Holger Hans Peter Freythera8ce0612011-01-20 16:30:24 +0100141/* link related routines */
142void mtp_link_down(struct mtp_link *data);
143void mtp_link_up(struct mtp_link *data);
144
Holger Hans Peter Freyther4c1eb0e2011-01-22 15:52:07 +0100145int mtp_link_init(struct mtp_link *link);
Holger Hans Peter Freythera8ce0612011-01-20 16:30:24 +0100146void mtp_link_start_link_test(struct mtp_link *link);
147void mtp_link_stop_link_test(struct mtp_link *link);
148int mtp_link_slta(struct mtp_link *link, uint16_t l3_len, struct mtp_level_3_mng *mng);
149
Holger Hans Peter Freytherfa8cf2d2011-01-20 16:51:34 +0100150void mtp_link_failure(struct mtp_link *fail);
151
Holger Hans Peter Freythera8ce0612011-01-20 16:30:24 +0100152/* internal routines */
153struct msgb *mtp_msg_alloc(struct mtp_link_set *link);
Holger Hans Peter Freythera8ce0612011-01-20 16:30:24 +0100154
Holger Hans Peter Freyther97f66e22010-07-28 03:32:52 +0800155#endif