Navigation


source: freeDiameter/extensions/dbg_interactive/routing.i @ 706:4ffbc9f1e922

Last change on this file since 706:4ffbc9f1e922 was 706:4ffbc9f1e922, checked in by Sebastien Decugis <sdecugis@nict.go.jp>, 11 years ago

Large UNTESTED commit with the following changes:

  • Improved DiameterIdentity? handling (esp. interationalization issues), and improve efficiency of some string operations in peers, sessions, and dictionary modules (closes #7)
  • Cleanup in the session module to free only unreferenced sessions (#16)
  • Removed fd_cpu_flush_cache(), replaced by more robust alternatives.
  • Improved peer state machine algorithm to counter SCTP multistream race condition.
File size: 7.2 KB
Line 
1/*********************************************************************************************************
2* Software License Agreement (BSD License)                                                               *
3* Author: Sebastien Decugis <sdecugis@nict.go.jp>                                                        *
4*                                                                                                        *
5* Copyright (c) 2010, WIDE Project and NICT                                                              *
6* All rights reserved.                                                                                   *
7*                                                                                                        *
8* Redistribution and use of this software in source and binary forms, with or without modification, are  *
9* permitted provided that the following conditions are met:                                              *
10*                                                                                                        *
11* * Redistributions of source code must retain the above                                                 *
12*   copyright notice, this list of conditions and the                                                    *
13*   following disclaimer.                                                                                *
14*                                                                                                        *
15* * Redistributions in binary form must reproduce the above                                              *
16*   copyright notice, this list of conditions and the                                                    *
17*   following disclaimer in the documentation and/or other                                               *
18*   materials provided with the distribution.                                                            *
19*                                                                                                        *
20* * Neither the name of the WIDE Project or NICT nor the                                                 *
21*   names of its contributors may be used to endorse or                                                  *
22*   promote products derived from this software without                                                  *
23*   specific prior written permission of WIDE Project and                                                *
24*   NICT.                                                                                                *
25*                                                                                                        *
26* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
27* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
28* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
29* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT     *
30* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS    *
31* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
32* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
33* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                                                             *
34*********************************************************************************************************/
35
36/* Do not include this directly, use dbg_interactive.i instead */
37
38/****** ROUTING *********/
39
40struct rt_data {
41};
42
43%extend rt_data {
44        rt_data() {
45                struct rt_data * r = NULL;
46                int ret = fd_rtd_init(&r);
47                if (ret != 0) {
48                        DI_ERROR(ret, NULL, NULL);
49                        return NULL;
50                }
51                return r;
52        }
53        ~rt_data() {
54                struct rt_data *r = self;
55                fd_rtd_free(&r);
56        }
57        %apply (char *STRING, int LENGTH) { (char * peerid, size_t peeridlen) };
58        %apply (char *STRING, int LENGTH) { (char * realm, size_t realmlen) };
59        void add(char * peerid, size_t peeridlen, char * realm, size_t realmlen) {
60                int ret = fd_rtd_candidate_add($self, peerid, peeridlen, realm, realmlen);
61                if (ret != 0) {
62                        DI_ERROR(ret, NULL, NULL);
63                }
64        }
65        void remove(char * STRING, size_t LENGTH) {
66                fd_rtd_candidate_del($self, (os0_t)STRING, LENGTH);
67        }
68        void error(char * peerid, size_t peeridlen, char * STRING, size_t LENGTH, uint32_t rcode) {
69                int ret =  fd_rtd_error_add($self, peerid, peeridlen, (os0_t)STRING, LENGTH, rcode);
70                if (ret != 0) {
71                        DI_ERROR(ret, NULL, NULL);
72                }
73        }
74        struct fd_list * extract(int score = 0) {
75                struct fd_list * li = NULL;
76                fd_rtd_candidate_extract($self, &li, score);
77                return li;
78        }
79}
80
81
82
83%extend rtd_candidate {
84        void dump() {
85                fd_log_debug("candidate %p\n", $self);
86                fd_log_debug("  id : %s\n",  $self->diamid);
87                fd_log_debug("  rlm: %s\n", $self->realm);
88                fd_log_debug("  sc : %d\n", $self->score);
89        }
90}
91
92
93%{
94/* call it (will be called from a different thread than the interpreter, when message arrives) */
95static int call_the_python_rt_fwd_callback(void * pycb, struct msg **msg) {
96        PyObject *PyMsg;
97        PyObject *cb, *result = NULL;
98        int ret = 0;
99       
100        if (!pycb) {
101                fd_log_debug("Internal error: missing the callback!\n");
102                return ENOTSUP;
103        }
104        cb = pycb;
105       
106        SWIG_PYTHON_THREAD_BEGIN_BLOCK;
107        /* Convert the arguments */
108        PyMsg  = SWIG_NewPointerObj((void *)*msg,     SWIGTYPE_p_msg,     0 );
109       
110        /* Call the function */
111        result = PyEval_CallFunction(cb, "(O)", PyMsg);
112       
113        /* The result is supposedly composed of: [ ret, *msg ] */
114        if ((result == NULL) || (!PyList_Check(result)) || (PyList_Size(result) != 2)) {
115                fd_log_debug("Error: The Python callback did not return [ ret, msg ].\n");
116                ret = EINVAL;
117                goto out;
118        }
119       
120        /* Convert the return values */
121        if (!SWIG_IsOK(SWIG_AsVal_int(PyList_GetItem(result, 0), &ret))) {
122                fd_log_debug("Error: Cannot convert the first return value to integer.\n");
123                ret = EINVAL;
124                goto out;
125        }
126        if (ret) {
127                TRACE_DEBUG(INFO, "The Python callback returned the error code %d (%s)\n", ret, strerror(ret));
128                goto out;
129        }
130       
131        if (!SWIG_IsOK(SWIG_ConvertPtr(PyList_GetItem(result, 1), (void *)msg, SWIGTYPE_p_msg, SWIG_POINTER_DISOWN))) {
132                fd_log_debug("Error: Cannot convert the second return value to message.\n");
133                ret = EINVAL;
134                goto out;
135        }
136       
137out:   
138        Py_XDECREF(result);
139       
140        SWIG_PYTHON_THREAD_END_BLOCK;
141        return ret;
142}
143%}
144
145
146struct fd_rt_fwd_hdl {
147};
148
149%extend fd_rt_fwd_hdl{
150        fd_rt_fwd_hdl(PyObject * PyCb, enum fd_rt_fwd_dir dir) {
151                struct fd_rt_fwd_hdl * r = NULL;
152                int ret;
153               
154                Py_XINCREF(PyCb);
155
156                ret = fd_rt_fwd_register( call_the_python_rt_fwd_callback, PyCb, dir, &r );
157                if (ret != 0) {
158                        DI_ERROR(ret, NULL, NULL);
159                        return NULL;
160                }
161                return r;
162        }
163       
164        ~fd_rt_fwd_hdl() {
165                PyObject * func;
166                int ret = fd_rt_fwd_unregister ( $self, (void *) &func );
167                if (ret != 0) {
168                        DI_ERROR(ret, NULL, NULL);
169                        return;
170                }
171                Py_XDECREF(func);
172                return;
173        }
174}
175
176
177%{
178/* call it (will be called from a different thread than the interpreter, when message arrives) */
179static int call_the_python_rt_out_callback(void * pycb, struct msg *msg, struct fd_list * candidates) {
180        PyObject *PyMsg, *PyCands;
181        PyObject *cb, *result = NULL;
182        int ret = 0;
183       
184        if (!pycb) {
185                fd_log_debug("Internal error: missing the callback!\n");
186                return ENOTSUP;
187        }
188        cb = pycb;
189       
190        SWIG_PYTHON_THREAD_BEGIN_BLOCK;
191        /* Convert the arguments */
192        PyMsg   = SWIG_NewPointerObj((void *)msg,        SWIGTYPE_p_msg,     0 );
193        PyCands = SWIG_NewPointerObj((void *)candidates, SWIGTYPE_p_fd_list, 0 );
194       
195        /* Call the function */
196        result = PyEval_CallFunction(cb, "(OO)", PyMsg, PyCands);
197       
198        /* The result is supposedly composed of: [ ret, *msg ] */
199        if (result == NULL){
200                fd_log_debug("Error: The Python callback raised an exception.\n");
201                ret = EINVAL;
202                goto out;
203        }
204       
205        /* Convert the return values */
206        if (!SWIG_IsOK(SWIG_AsVal_int(result, &ret))) {
207                fd_log_debug("Error: Cannot convert the return value to integer.\n");
208                ret = EINVAL;
209                goto out;
210        }
211out:   
212        Py_XDECREF(result);
213       
214        SWIG_PYTHON_THREAD_END_BLOCK;
215        return ret;
216}
217%}
218
219
220struct fd_rt_out_hdl {
221};
222
223%extend fd_rt_out_hdl{
224        fd_rt_out_hdl(PyObject * PyCb, int priority = 0) {
225                struct fd_rt_out_hdl * r = NULL;
226                int ret;
227               
228                Py_XINCREF(PyCb);
229
230                ret = fd_rt_out_register( call_the_python_rt_out_callback, PyCb, priority, &r );
231                if (ret != 0) {
232                        DI_ERROR(ret, NULL, NULL);
233                        return NULL;
234                }
235                return r;
236        }
237       
238        ~fd_rt_out_hdl() {
239                PyObject * func;
240                int ret = fd_rt_out_unregister ( $self, (void *) &func );
241                if (ret != 0) {
242                        DI_ERROR(ret, NULL, NULL);
243                        return;
244                }
245                Py_XDECREF(func);
246                return;
247        }
248}
249
Note: See TracBrowser for help on using the repository browser.