SIP: Extract IMSI from SIP URI
[lcr.git] / route.h
1 /*****************************************************************************\
2 **                                                                           **
3 ** PBX4Linux                                                                 **
4 **                                                                           **
5 **---------------------------------------------------------------------------**
6 ** Copyright: Andreas Eversberg                                              **
7 **                                                                           **
8 ** match header file                                                         **
9 **                                                                           **
10 \*****************************************************************************/ 
11
12
13 /* memory structure of rulesets */
14
15 enum { /* value types */
16         VALUE_TYPE_NULL,
17         VALUE_TYPE_INTEGER,
18         VALUE_TYPE_INTEGER_RANGE,
19         VALUE_TYPE_STRING,
20         VALUE_TYPE_STRING_RANGE,
21 };
22
23 enum { /* how to parse text file during startup */
24         COND_TYPE_NULL,
25         COND_TYPE_INTEGER,
26         COND_TYPE_TIME,
27         COND_TYPE_MDAY,
28         COND_TYPE_MONTH,
29         COND_TYPE_WDAY,
30         COND_TYPE_YEAR,
31         COND_TYPE_STRING,
32         COND_TYPE_IP,
33         COND_TYPE_CAPABILITY,
34         COND_TYPE_BMODE,
35         COND_TYPE_HLC,
36         COND_TYPE_IFATTR,
37 };
38
39 enum { /* what to check during runtime */
40         MATCH_EXTERN,
41         MATCH_INTERN,
42         MATCH_PORT,
43         MATCH_INTERFACE,
44         MATCH_CALLERID,
45         MATCH_CALLERID2,
46         MATCH_EXTENSION,
47         MATCH_DIALING,
48         MATCH_ENBLOCK,
49         MATCH_OVERLAP,
50         MATCH_ANONYMOUS,
51         MATCH_VISIBLE,
52         MATCH_UNKNOWN,
53         MATCH_AVAILABLE,
54         MATCH_FAKE,
55         MATCH_REAL,
56         MATCH_REDIRECTED,
57         MATCH_DIRECT,
58         MATCH_REDIRID,
59         MATCH_TIME,
60         MATCH_MDAY,
61         MATCH_MONTH,
62         MATCH_YEAR,
63         MATCH_WDAY,
64         MATCH_CAPABILITY,
65         MATCH_INFOLAYER1,
66         MATCH_HLC,
67         MATCH_FILE,
68         MATCH_EXECUTE,
69         MATCH_DEFAULT,
70         MATCH_TIMEOUT,
71         MATCH_FREE,
72         MATCH_NOTFREE,
73         MATCH_DOWN,
74         MATCH_UP,
75         MATCH_BUSY,
76         MATCH_IDLE,
77         MATCH_REMOTE,
78         MATCH_NOTREMOTE,
79         MATCH_POTS_FLASH,
80         MATCH_POTS_CW,
81         MATCH_POTS_CALLS,
82         MATCH_POTS_LAST,
83 };
84
85 enum { /* how to parse text file during startup */
86         PARAM_TYPE_NULL,
87         PARAM_TYPE_INTEGER,
88         PARAM_TYPE_STRING,
89         PARAM_TYPE_YESNO,
90         PARAM_TYPE_CAPABILITY,
91         PARAM_TYPE_BMODE,
92         PARAM_TYPE_HLC,
93         PARAM_TYPE_DIVERSION,
94         PARAM_TYPE_DESTIN,
95         PARAM_TYPE_PORTS,
96         PARAM_TYPE_TYPE,
97         PARAM_TYPE_CALLERIDTYPE,
98         PARAM_TYPE_ON,
99 };
100
101 enum { /* defines when a statement should be executed */
102         INFO_ON_INIT,
103         INFO_ON_HANGUP,
104 };
105
106 /* parameter ID bits */
107 #define PARAM_PROCEEDING        1LL
108 #define PARAM_ALERTING          (1LL<<1)
109 #define PARAM_CONNECT           (1LL<<2)
110 #define PARAM_EXTENSION         (1LL<<3)
111 #define PARAM_EXTENSIONS        (1LL<<4)
112 #define PARAM_PREFIX            (1LL<<5)
113 #define PARAM_CAPA              (1LL<<6)
114 #define PARAM_BMODE             (1LL<<7)
115 #define PARAM_INFO1             (1LL<<8)
116 #define PARAM_HLC               (1LL<<9)
117 #define PARAM_EXTHLC            (1LL<<10)
118 #define PARAM_PRESENT           (1LL<<11)
119 #define PARAM_DIVERSION         (1LL<<12)
120 #define PARAM_DEST              (1LL<<13)
121 #define PARAM_SELECT            (1LL<<14)
122 #define PARAM_DELAY             (1LL<<15)
123 #define PARAM_LIMIT             (1LL<<16)
124 #define PARAM_HOST              (1LL<<17)
125 #define PARAM_PORT              (1LL<<18)
126 #define PARAM_INTERFACES        (1LL<<19)
127 #define PARAM_ADDRESS           (1LL<<20)
128 #define PARAM_SAMPLE            (1LL<<21)
129 #define PARAM_ANNOUNCEMENT      (1LL<<22)
130 #define PARAM_RULESET           (1LL<<23)
131 #define PARAM_CAUSE             (1LL<<24)
132 #define PARAM_LOCATION          (1LL<<25)
133 #define PARAM_DISPLAY           (1LL<<26)
134 #define PARAM_PORTS             (1LL<<27)
135 #define PARAM_TPRESET           (1LL<<28)
136 #define PARAM_FILE              (1LL<<29)
137 #define PARAM_CONTENT           (1LL<<30)
138 #define PARAM_APPEND            (1LL<<31)
139 #define PARAM_EXECUTE           (1LL<<32)
140 #define PARAM_PARAM             (1LL<<33)
141 #define PARAM_TYPE              (1LL<<34)
142 #define PARAM_COMPLETE          (1LL<<35)
143 #define PARAM_CALLERID          (1LL<<36)
144 #define PARAM_CALLERIDTYPE      (1LL<<37)
145 #define PARAM_CALLTO            (1LL<<38)
146 #define PARAM_ROOM              (1LL<<39)
147 #define PARAM_JINGLE            (1LL<<40)
148 #define PARAM_TIMEOUT           (1LL<<41)
149 #define PARAM_NOPASSWORD        (1LL<<42)
150 #define PARAM_STRIP             (1LL<<43)
151 #define PARAM_APPLICATION       (1LL<<44)
152 #define PARAM_CONTEXT           (1LL<<45)
153 #define PARAM_EXTEN             (1LL<<46)
154 #define PARAM_ON                (1LL<<47)
155 #define PARAM_KEYPAD            (1LL<<48)
156 #define PARAM_POTS_CALL         (1LL<<49)
157
158 /* action index
159  * NOTE: The given index is the actual entry number of action_defs[], so add/remove both lists!!!
160  */
161 #define ACTION_EXTERNAL         0
162 #define ACTION_INTERNAL         1
163 #define ACTION_OUTDIAL          2
164 #define ACTION_VBOX_RECORD      3
165 #define ACTION_PARTYLINE        4
166 #define ACTION_LOGIN            5
167 #define ACTION_CALLERID         6
168 #define ACTION_CALLERIDNEXT     7
169 #define ACTION_FORWARD          8
170 #define ACTION_REDIAL           9
171 #define ACTION_REPLY            10
172 #define ACTION_POWERDIAL        11      
173 #define ACTION_CALLBACK         12
174 #define ACTION_ABBREV           13
175 #define ACTION_TEST             14
176 #define ACTION_PLAY             15
177 #define ACTION_VBOX_PLAY        16
178 #define ACTION_CALCULATOR       17
179 #define ACTION_TIMER            18
180 #define ACTION_GOTO             19
181 #define ACTION_MENU             20
182 #define ACTION_DISCONNECT       21
183 #define ACTION_RELEASE          22
184 #define ACTION_DEFLECT          23
185 #define ACTION_SETFORWARD       24
186 #define ACTION_EXECUTE          25
187 #define ACTION_FILE             26
188 #define ACTION_PICK             27
189 #define ACTION_PASSWORD         28
190 #define ACTION_PASSWORD_WRITE   29
191 #define ACTION_NOTHING          30
192 #define ACTION_EFI              31
193 #define ACTION_POTS_RETRIEVE    32
194 #define ACTION_POTS_RELEASE     33
195 #define ACTION_POTS_REJECT      34
196 #define ACTION_POTS_ANSWER      35
197 #define ACTION_POTS_3PTY        36
198 #define ACTION_POTS_TRANSFER    37
199
200 struct route_cond { /* an item */
201         struct route_cond       *next;                  /* next entry */
202         int                     index;                  /* index of cond_defs */
203         int                     match;                  /* what is matching (MATCH_*) */
204         int                     value_type;             /* type of value (VALUE_TYPE_*) */
205         int                     value_extension;        /* will it be extended? */
206         int                     integer_value;          /* first integer */
207         int                     integer_value_to;       /* second integer */
208         char                    *string_value;          /* first string */
209         char                    *string_value_to;       /* second string */
210         int                     comp_string;            /* compare value of strings */
211 };
212
213 struct route_param { /* a parameter */
214         struct route_param      *next;                  /* next item */
215         int                     index;                  /* index of param_defs */
216         unsigned long long      id;                     /* what is it (PARAM_*) */
217         int                     value_type;             /* type of value (VALUE_TYPE_*) */
218         int                     value_extension;        /* will it be extended? */
219         int                     integer_value;          /* integer value */
220         char                    *string_value;          /* string value */
221 };
222
223 struct route_action { /* an action has a list of parameters */
224         struct route_action     *next;                  /* next item */
225         struct route_param      *param_first;           /* link to parameter list */
226         int                     index;                  /* index of action_defs */
227         int                     timeout;                /* timeout value for action (0 = no timeout) */
228         int                     line;                   /* line parsed from */
229 };
230
231 struct route_rule { /* a rule has a list of items and actions */
232         struct route_rule       *next;                  /* next item */
233         char                    file[128];              /* filename */
234         int                     line;                   /* line parsed from */
235         struct route_cond       *cond_first;            /* link to condition list */
236         struct route_action     *action_first;          /* link to action list */
237 //      int                     temp_couldmatch;        /* stores, if the dialing could match. this is used to make a list of rules, that could match */
238 };
239
240 struct route_ruleset { /* the ruleset is a list of rules */
241         struct route_ruleset    *next;                  /* next item */
242         char                    file[128];              /* filename */
243         int                     line;                   /* line parsed from */
244         char                    name[64];               /* name of ruleset */
245         struct route_rule       *rule_first;            /* linke to rule list */
246 };
247
248 struct cond_defs { /* defintion of all conditions */
249         const char              *name;                  /* item's name */
250         int                     match;                  /* what to check */
251         int                     type;                   /* type of value (COND_TYPE) */
252         const char              *doc;                   /* syntax */
253         const char              *help;                  /* short help */
254 };
255
256 struct param_defs { /* definition of all options */
257         unsigned long long      id;                     /* ID of parameter (just for checking) */
258         const char              *name;                  /* name of parameter */
259         int                     type;                   /* type of value (PARAM_TYPE_*) */
260         const char              *doc;                   /* syntax */
261         const char              *help;                  /* quick help */
262 };
263
264 struct action_defs { /* definition of all actions */
265         int                     id;                     /* ID of parameter (just for checking) */
266         const char              *name;
267         void                    (EndpointAppPBX::*init_func)(void);
268         void                    (EndpointAppPBX::*dialing_func)(void);
269         void                    (EndpointAppPBX::*hangup_func)(void);
270         unsigned long long       params;
271         const char              *help;
272 };
273
274
275
276 extern struct cond_defs         cond_defs[];
277 extern struct param_defs        param_defs[];
278 extern struct action_defs       action_defs[];
279 extern struct route_ruleset     *ruleset_first;
280 extern struct route_ruleset     *ruleset_main;
281 extern struct route_action      action_external;
282 extern struct route_action      action_internal;
283 extern struct route_action      action_remote;
284 extern struct route_action      action_vbox;
285 extern struct route_action      action_partyline;
286 extern struct route_action      action_password;
287 extern struct route_action      action_password_write;
288 extern struct route_action      action_disconnect;
289
290 /* functions */
291
292 void doc_rules(const char *action);
293 void ruleset_free(struct route_ruleset *ruleset_start);
294 void ruleset_debug(struct route_ruleset *ruleset_start);
295 extern char ruleset_error[256];
296 struct route_ruleset *ruleset_parse(void);
297 struct route_ruleset *getrulesetbyname(const char *name);
298