Holger Hans Peter Freyther | 97f66e2 | 2010-07-28 03:32:52 +0800 | [diff] [blame] | 1 | /* |
Holger Hans Peter Freyther | c840569 | 2011-01-02 20:24:08 +0100 | [diff] [blame] | 2 | * (C) 2010-2011 by Holger Hans Peter Freyther <zecke@selfish.org> |
| 3 | * (C) 2010-2011 by On-Waves |
Holger Hans Peter Freyther | 97f66e2 | 2010-07-28 03:32:52 +0800 | [diff] [blame] | 4 | * All Rights Reserved |
| 5 | * |
Holger Hans Peter Freyther | de56c22 | 2011-01-16 17:45:14 +0100 | [diff] [blame] | 6 | * 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 Freyther | 97f66e2 | 2010-07-28 03:32:52 +0800 | [diff] [blame] | 9 | * (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 Freyther | de56c22 | 2011-01-16 17:45:14 +0100 | [diff] [blame] | 14 | * GNU Affero General Public License for more details. |
Holger Hans Peter Freyther | 97f66e2 | 2010-07-28 03:32:52 +0800 | [diff] [blame] | 15 | * |
Holger Hans Peter Freyther | de56c22 | 2011-01-16 17:45:14 +0100 | [diff] [blame] | 16 | * 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 Freyther | 97f66e2 | 2010-07-28 03:32:52 +0800 | [diff] [blame] | 18 | * |
| 19 | */ |
| 20 | #ifndef mtp_data_h |
| 21 | #define mtp_data_h |
| 22 | |
Holger Hans Peter Freyther | cbf7d18 | 2010-07-31 05:25:35 +0800 | [diff] [blame] | 23 | #include <osmocore/msgb.h> |
| 24 | #include <osmocore/timer.h> |
| 25 | #include <osmocore/utils.h> |
Holger Hans Peter Freyther | 97f66e2 | 2010-07-28 03:32:52 +0800 | [diff] [blame] | 26 | |
Holger Hans Peter Freyther | c840569 | 2011-01-02 20:24:08 +0100 | [diff] [blame] | 27 | struct bsc_data; |
Holger Hans Peter Freyther | 0e2f911 | 2011-01-17 11:54:39 +0100 | [diff] [blame] | 28 | struct mtp_link; |
Holger Hans Peter Freyther | a8ce061 | 2011-01-20 16:30:24 +0100 | [diff] [blame] | 29 | struct mtp_level_3_mng *mng; |
Holger Hans Peter Freyther | c5d897e | 2011-01-21 20:54:55 +0100 | [diff] [blame] | 30 | struct rate_ctr_group; |
Holger Hans Peter Freyther | c840569 | 2011-01-02 20:24:08 +0100 | [diff] [blame] | 31 | |
Holger Hans Peter Freyther | 97f66e2 | 2010-07-28 03:32:52 +0800 | [diff] [blame] | 32 | /* 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 Freyther | 569f1e1 | 2011-01-02 18:47:49 +0100 | [diff] [blame] | 42 | struct mtp_link_set { |
Holger Hans Peter Freyther | 97f66e2 | 2010-07-28 03:32:52 +0800 | [diff] [blame] | 43 | /* routing info.. */ |
Holger Hans Peter Freyther | d8a73e2 | 2011-01-17 22:37:11 +0100 | [diff] [blame] | 44 | int dpc, opc, sccp_opc, isup_opc; |
Holger Hans Peter Freyther | 4e3e28e | 2010-11-26 21:05:39 +0100 | [diff] [blame] | 45 | int ni; |
Holger Hans Peter Freyther | e976df1 | 2010-11-26 21:07:11 +0100 | [diff] [blame] | 46 | int spare; |
Holger Hans Peter Freyther | 97f66e2 | 2010-07-28 03:32:52 +0800 | [diff] [blame] | 47 | |
Holger Hans Peter Freyther | 38d936a | 2011-01-26 12:41:42 +0100 | [diff] [blame^] | 48 | const char *name; |
| 49 | |
Holger Hans Peter Freyther | 97f66e2 | 2010-07-28 03:32:52 +0800 | [diff] [blame] | 50 | /* internal state */ |
| 51 | /* the MTP1 link is up */ |
| 52 | int available; |
| 53 | int running; |
| 54 | int sccp_up; |
Holger Hans Peter Freyther | 606eae8 | 2011-01-20 14:23:10 +0100 | [diff] [blame] | 55 | int linkset_up; |
Holger Hans Peter Freyther | 97f66e2 | 2010-07-28 03:32:52 +0800 | [diff] [blame] | 56 | |
Holger Hans Peter Freyther | 346e1c4 | 2011-01-02 18:11:37 +0100 | [diff] [blame] | 57 | int last_sls; |
| 58 | |
Holger Hans Peter Freyther | fe72c16 | 2011-01-04 13:21:52 +0100 | [diff] [blame] | 59 | struct llist_head links; |
Holger Hans Peter Freyther | 1cc2456 | 2011-01-20 18:26:18 +0100 | [diff] [blame] | 60 | int nr_links; |
Holger Hans Peter Freyther | 0e2f911 | 2011-01-17 11:54:39 +0100 | [diff] [blame] | 61 | struct mtp_link *slc[16]; |
Holger Hans Peter Freyther | a8ce061 | 2011-01-20 16:30:24 +0100 | [diff] [blame] | 62 | int sltm_once; |
Holger Hans Peter Freyther | 644aafb | 2011-01-03 23:51:07 +0100 | [diff] [blame] | 63 | |
Holger Hans Peter Freyther | f6375b4 | 2011-01-22 21:01:23 +0100 | [diff] [blame] | 64 | int pcap_fd; |
| 65 | |
Holger Hans Peter Freyther | efbd8c2 | 2011-01-17 20:21:45 +0100 | [diff] [blame] | 66 | /* special handling */ |
| 67 | int pass_all_isup; |
| 68 | |
Holger Hans Peter Freyther | c5d897e | 2011-01-21 20:54:55 +0100 | [diff] [blame] | 69 | /* statistics */ |
| 70 | struct rate_ctr_group *ctrg; |
| 71 | |
Holger Hans Peter Freyther | c840569 | 2011-01-02 20:24:08 +0100 | [diff] [blame] | 72 | /* custom data */ |
| 73 | struct bsc_data *bsc; |
Holger Hans Peter Freyther | 97f66e2 | 2010-07-28 03:32:52 +0800 | [diff] [blame] | 74 | }; |
| 75 | |
Holger Hans Peter Freyther | 0e2f911 | 2011-01-17 11:54:39 +0100 | [diff] [blame] | 76 | /** |
| 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 | */ |
| 82 | struct mtp_link { |
| 83 | struct llist_head entry; |
| 84 | |
| 85 | int pcap_fd; |
Holger Hans Peter Freyther | 2d845fc | 2011-01-20 15:42:13 +0100 | [diff] [blame] | 86 | struct mtp_link_set *set; |
Holger Hans Peter Freyther | 0e2f911 | 2011-01-17 11:54:39 +0100 | [diff] [blame] | 87 | |
| 88 | int available; |
| 89 | |
| 90 | struct timer_list link_activate; |
| 91 | |
Holger Hans Peter Freyther | a8ce061 | 2011-01-20 16:30:24 +0100 | [diff] [blame] | 92 | /* link test routine */ |
| 93 | uint8_t test_ptrn[14]; |
| 94 | |
Holger Hans Peter Freyther | ea5ce23 | 2011-01-23 23:31:26 +0100 | [diff] [blame] | 95 | int blocked; |
| 96 | |
Holger Hans Peter Freyther | 1ec2a74 | 2011-01-25 13:24:06 +0100 | [diff] [blame] | 97 | int first_sls; |
Holger Hans Peter Freyther | 1cc2456 | 2011-01-20 18:26:18 +0100 | [diff] [blame] | 98 | int link_no; |
Holger Hans Peter Freyther | a8ce061 | 2011-01-20 16:30:24 +0100 | [diff] [blame] | 99 | 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 Freyther | 4c1eb0e | 2011-01-22 15:52:07 +0100 | [diff] [blame] | 106 | /* statistics */ |
| 107 | struct rate_ctr_group *ctrg; |
| 108 | |
Holger Hans Peter Freyther | a8ce061 | 2011-01-20 16:30:24 +0100 | [diff] [blame] | 109 | /* callback's to implement */ |
Holger Hans Peter Freyther | 0e2f911 | 2011-01-17 11:54:39 +0100 | [diff] [blame] | 110 | 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 Freyther | 97f66e2 | 2010-07-28 03:32:52 +0800 | [diff] [blame] | 117 | |
Holger Hans Peter Freyther | 569f1e1 | 2011-01-02 18:47:49 +0100 | [diff] [blame] | 118 | struct mtp_link_set *mtp_link_set_alloc(void); |
| 119 | void mtp_link_set_stop(struct mtp_link_set *link); |
| 120 | void mtp_link_set_reset(struct mtp_link_set *link); |
Holger Hans Peter Freyther | bee2ed1 | 2011-01-18 13:29:42 +0100 | [diff] [blame] | 121 | int mtp_link_set_data(struct mtp_link *link, struct msgb *msg); |
Holger Hans Peter Freyther | 569f1e1 | 2011-01-02 18:47:49 +0100 | [diff] [blame] | 122 | int mtp_link_set_submit_sccp_data(struct mtp_link_set *link, int sls, const uint8_t *data, unsigned int length); |
| 123 | int mtp_link_set_submit_isup_data(struct mtp_link_set *link, int sls, const uint8_t *data, unsigned int length); |
Holger Hans Peter Freyther | 97f66e2 | 2010-07-28 03:32:52 +0800 | [diff] [blame] | 124 | |
Holger Hans Peter Freyther | 069e635 | 2011-01-04 13:01:23 +0100 | [diff] [blame] | 125 | void mtp_link_set_init_slc(struct mtp_link_set *set); |
Holger Hans Peter Freyther | 4c1eb0e | 2011-01-22 15:52:07 +0100 | [diff] [blame] | 126 | int mtp_link_set_add_link(struct mtp_link_set *set, struct mtp_link *link); |
Holger Hans Peter Freyther | 069e635 | 2011-01-04 13:01:23 +0100 | [diff] [blame] | 127 | |
Holger Hans Peter Freyther | ea5ce23 | 2011-01-23 23:31:26 +0100 | [diff] [blame] | 128 | void mtp_link_block(struct mtp_link *link); |
| 129 | void mtp_link_unblock(struct mtp_link *link); |
| 130 | |
Holger Hans Peter Freyther | 97f66e2 | 2010-07-28 03:32:52 +0800 | [diff] [blame] | 131 | |
| 132 | /* one time init function */ |
Holger Hans Peter Freyther | 569f1e1 | 2011-01-02 18:47:49 +0100 | [diff] [blame] | 133 | void mtp_link_set_init(void); |
Holger Hans Peter Freyther | 97f66e2 | 2010-07-28 03:32:52 +0800 | [diff] [blame] | 134 | |
| 135 | /* to be implemented for MSU sending */ |
Holger Hans Peter Freyther | 9543f4a | 2011-01-24 20:49:58 +0100 | [diff] [blame] | 136 | void mtp_link_submit(struct mtp_link *link, struct msgb *msg); |
Holger Hans Peter Freyther | 569f1e1 | 2011-01-02 18:47:49 +0100 | [diff] [blame] | 137 | void mtp_link_set_forward_sccp(struct mtp_link_set *link, struct msgb *msg, int sls); |
Holger Hans Peter Freyther | 1b6901e | 2011-01-17 16:13:28 +0100 | [diff] [blame] | 138 | void mtp_link_set_forward_isup(struct mtp_link_set *link, struct msgb *msg, int sls); |
Holger Hans Peter Freyther | 0e2f911 | 2011-01-17 11:54:39 +0100 | [diff] [blame] | 139 | void mtp_link_restart(struct mtp_link *link); |
Holger Hans Peter Freyther | 97f66e2 | 2010-07-28 03:32:52 +0800 | [diff] [blame] | 140 | |
Holger Hans Peter Freyther | a8ce061 | 2011-01-20 16:30:24 +0100 | [diff] [blame] | 141 | /* link related routines */ |
| 142 | void mtp_link_down(struct mtp_link *data); |
| 143 | void mtp_link_up(struct mtp_link *data); |
| 144 | |
Holger Hans Peter Freyther | 4c1eb0e | 2011-01-22 15:52:07 +0100 | [diff] [blame] | 145 | int mtp_link_init(struct mtp_link *link); |
Holger Hans Peter Freyther | a8ce061 | 2011-01-20 16:30:24 +0100 | [diff] [blame] | 146 | void mtp_link_start_link_test(struct mtp_link *link); |
| 147 | void mtp_link_stop_link_test(struct mtp_link *link); |
| 148 | int mtp_link_slta(struct mtp_link *link, uint16_t l3_len, struct mtp_level_3_mng *mng); |
| 149 | |
Holger Hans Peter Freyther | fa8cf2d | 2011-01-20 16:51:34 +0100 | [diff] [blame] | 150 | void mtp_link_failure(struct mtp_link *fail); |
| 151 | |
Holger Hans Peter Freyther | a8ce061 | 2011-01-20 16:30:24 +0100 | [diff] [blame] | 152 | /* internal routines */ |
| 153 | struct msgb *mtp_msg_alloc(struct mtp_link_set *link); |
Holger Hans Peter Freyther | a8ce061 | 2011-01-20 16:30:24 +0100 | [diff] [blame] | 154 | |
Holger Hans Peter Freyther | 97f66e2 | 2010-07-28 03:32:52 +0800 | [diff] [blame] | 155 | #endif |