annotate extensions/rt_redirect/redir_entries.c @ 1260:4f6f61e67599

Store redirect information for ALL_SESSION and ALL_USER in a hash. This is a speedup if many of these exist (compared to checking a linked list for matches as before). Refactor a bit while here. Use the uthash code from Troy D. Hanson, http://troydhanson.github.com/uthash/
author Thomas Klausner <tk@giga.or.at>
date Mon, 24 Mar 2014 13:21:41 +0100
parents 82280e745a89
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
1 /*********************************************************************************************************
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
2 * Software License Agreement (BSD License) *
1260
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
3 * Authors: Sebastien Decugis <sdecugis@freediameter.net> *
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
4 * and Thomas Klausner <tk@giga.or.at> *
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
5 * *
1260
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
6 * Copyright (c) 2011, 2014, WIDE Project and NICT *
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
7 * All rights reserved. *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
8 * *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
9 * Redistribution and use of this software in source and binary forms, with or without modification, are *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
10 * permitted provided that the following conditions are met: *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
11 * *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
12 * * Redistributions of source code must retain the above *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
13 * copyright notice, this list of conditions and the *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
14 * following disclaimer. *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
15 * *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
16 * * Redistributions in binary form must reproduce the above *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
17 * copyright notice, this list of conditions and the *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
18 * following disclaimer in the documentation and/or other *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
19 * materials provided with the distribution. *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
20 * *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
21 * * Neither the name of the WIDE Project or NICT nor the *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
22 * names of its contributors may be used to endorse or *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
23 * promote products derived from this software without *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
24 * specific prior written permission of WIDE Project and *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
25 * NICT. *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
26 * *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
27 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
28 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
29 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
30 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
33 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
34 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
35 *********************************************************************************************************/
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
36
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
37 #include "rt_redir.h"
1260
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
38 #include "uthash.h"
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
39
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
40 /* The array with all entries ordered by their data */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
41 struct redir_line redirects_usages[H_U_MAX + 1];
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
42
1260
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
43 /* for symmetry reasons, hash tables for all types exist, but only ALL_SESSION and ALL_USER will be used */
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
44 struct redir_entry *redirect_hash_table[H_U_MAX+1];
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
45
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
46 /* Initialize the array */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
47 int redir_entry_init()
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
48 {
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
49 int i;
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
50
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
51 TRACE_ENTRY("");
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
52
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
53 /* redirects_usages */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
54 memset(&redirects_usages, 0, sizeof(redirects_usages));
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
55
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
56 for (i = 0; i <= H_U_MAX; i++) {
1260
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
57 /* only one of the two will be used for each type, but initialize both to be on the safe side */
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
58
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
59 /* initialize list */
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
60 CHECK_POSIX( pthread_rwlock_init( &redirects_usages[i].lock, NULL) );
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
61 fd_list_init( &redirects_usages[i].sentinel, &redirects_usages[i] );
1260
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
62
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
63 /* initialize hash table */
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
64 redirect_hash_table[i] = NULL;
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
65 }
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
66
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
67 /* initialize the scores */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
68 redirects_usages[ DONT_CACHE ].score = FD_SCORE_REDIR_ONCE;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
69 redirects_usages[ ALL_SESSION ].score = FD_SCORE_REDIR_SESSION;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
70 redirects_usages[ ALL_REALM ].score = FD_SCORE_REDIR_REALM;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
71 redirects_usages[ REALM_AND_APPLICATION ].score = FD_SCORE_REDIR_REALM_APP;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
72 redirects_usages[ ALL_APPLICATION ].score = FD_SCORE_REDIR_APP;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
73 redirects_usages[ ALL_HOST ].score = FD_SCORE_REDIR_HOST;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
74 redirects_usages[ ALL_USER ].score = FD_SCORE_REDIR_USER;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
75
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
76 return 0;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
77 }
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
78
1260
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
79 int redir_entry_fini()
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
80 {
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
81 int i;
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
82 struct redir_entry *current_entry, *tmp;
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
83
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
84 /* Empty all entries */
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
85 CHECK_POSIX_DO( pthread_mutex_lock(&redir_exp_peer_lock), );
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
86 for (i = 0; i <= H_U_MAX; i++) {
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
87 CHECK_POSIX_DO( pthread_rwlock_wrlock( &redirects_usages[i].lock), );
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
88 switch(i) {
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
89 case ALL_SESSION:
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
90 case ALL_USER:
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
91 HASH_ITER(hh, redirect_hash_table[i], current_entry, tmp) {
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
92 HASH_DEL(redirect_hash_table[i], current_entry);
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
93 CHECK_FCT_DO( redir_entry_destroy(current_entry), );
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
94 }
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
95 break;
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
96 default:
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
97 while (!FD_IS_LIST_EMPTY(&redirects_usages[i].sentinel)) {
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
98 struct redir_entry * e = redirects_usages[i].sentinel.next->o;
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
99 fd_list_unlink(&e->redir_list);
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
100 CHECK_FCT_DO( redir_entry_destroy(e), );
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
101 }
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
102 }
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
103 CHECK_POSIX_DO( pthread_rwlock_unlock( &redirects_usages[i].lock), );
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
104 CHECK_POSIX_DO( pthread_rwlock_destroy( &redirects_usages[i].lock), );
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
105 }
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
106 CHECK_POSIX_DO( pthread_mutex_unlock(&redir_exp_peer_lock), );
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
107
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
108 return 0;
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
109 }
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
110
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
111 /* Create a new redir_entry and add the correct data */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
112 int redir_entry_new(struct redir_entry ** e, struct fd_list * targets, uint32_t rhu, struct msg * qry, DiamId_t nh, size_t nhlen, os0_t oh, size_t ohlen)
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
113 {
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
114 struct redir_entry * entry = NULL;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
115 os0_t s;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
116 size_t l;
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
117
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
118 TRACE_ENTRY("%p %p %d %p %p %zd %p %zd", e, targets, rhu, qry, nh, nhlen, oh, ohlen)
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
119 ASSERT(e && targets && (rhu <= H_U_MAX) && qry && nh && nhlen && oh && ohlen);
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
120
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
121 CHECK_MALLOC( entry = malloc(sizeof(struct redir_entry)) );
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
122 memset(entry, 0, sizeof(struct redir_entry));
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
123
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
124 entry->eyec = REDIR_ENTRY_EYEC;
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
125
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
126 CHECK_MALLOC( entry->from.s = os0dup(nh, nhlen) );
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
127 entry->from.l = nhlen;
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
128
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
129 fd_list_init(&entry->target_peers_list, entry);
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
130 fd_list_move_end(&entry->target_peers_list, targets);
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
131
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
132 fd_list_init(&entry->exp_list, entry);
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
133
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
134 entry->type = rhu;
1260
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
135 /* list entry for putting into redirects_usage; also doubles as pointer into that list so it can be removed easily */
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
136 fd_list_init(&entry->redir_list, entry);
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
137 /* finally initialize the data */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
138 switch (rhu) {
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
139 case DONT_CACHE:
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
140 entry->data.message.msg = qry;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
141 break;
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
142
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
143 case ALL_SESSION:
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
144 {
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
145 /* There is a good chance that the session is already cached in the message, so retrieve it */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
146 struct session * sess;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
147 CHECK_FCT( fd_msg_sess_get(fd_g_config->cnf_dict, qry, &sess, NULL) );
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
148 if (!sess) {
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
149 TRACE_DEBUG(INFO, "Received a Redirect indication with usage ALL_SESSION but no Session-Id AVP in the message, defaulting to DONT_CACHE");
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
150 entry->type = DONT_CACHE;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
151 entry->data.message.msg = qry;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
152 break;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
153 }
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
154 CHECK_FCT( fd_sess_getsid(sess, &s, &l) );
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
155 CHECK_MALLOC( entry->data.session.s = os0dup(s, l) );
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
156 entry->data.session.l = l;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
157 }
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
158 break;
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
159
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
160 case ALL_REALM:
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
161 {
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
162 /* Search the Destination-Realm of the message */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
163 struct avp * dr;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
164 struct avp_hdr * ahdr;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
165 CHECK_FCT( fd_msg_search_avp(qry, redir_dict_dr, &dr) );
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
166 if (!dr) {
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
167 TRACE_DEBUG(INFO, "Received a Redirect indication with usage ALL_REALM but no Destination-Realm AVP in the message, defaulting to DONT_CACHE");
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
168 entry->type = DONT_CACHE;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
169 entry->data.message.msg = qry;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
170 break;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
171 }
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
172 CHECK_FCT( fd_msg_avp_hdr( dr, &ahdr ) );
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
173 CHECK_MALLOC( entry->data.realm.s = os0dup(ahdr->avp_value->os.data, ahdr->avp_value->os.len) );
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
174 entry->data.realm.l = ahdr->avp_value->os.len;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
175 }
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
176 break;
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
177
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
178 case REALM_AND_APPLICATION:
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
179 {
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
180 /* Search the Destination-Realm of the message */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
181 struct avp * dr;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
182 struct avp_hdr * ahdr;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
183 CHECK_FCT( fd_msg_search_avp(qry, redir_dict_dr, &dr) );
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
184 if (!dr) {
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
185 TRACE_DEBUG(INFO, "Received a Redirect indication with usage REALM_AND_APPLICATION but no Destination-Realm AVP in the message, defaulting to DONT_CACHE");
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
186 entry->type = DONT_CACHE;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
187 entry->data.message.msg = qry;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
188 break;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
189 }
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
190 CHECK_FCT( fd_msg_avp_hdr( dr, &ahdr ) );
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
191 CHECK_MALLOC( entry->data.realm_app.s = os0dup(ahdr->avp_value->os.data, ahdr->avp_value->os.len) );
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
192 entry->data.realm_app.l = ahdr->avp_value->os.len;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
193 }
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
194 /* and then the application */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
195 {
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
196 struct msg_hdr * hdr;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
197 CHECK_FCT( fd_msg_hdr(qry, &hdr) );
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
198 entry->data.realm_app.a = hdr->msg_appl;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
199 }
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
200 break;
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
201
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
202 case ALL_APPLICATION:
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
203 {
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
204 struct msg_hdr * hdr;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
205 CHECK_FCT( fd_msg_hdr(qry, &hdr) );
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
206 entry->data.app.a = hdr->msg_appl;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
207 }
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
208 break;
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
209
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
210 case ALL_HOST:
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
211 CHECK_MALLOC( entry->data.host.s = os0dup(oh, ohlen) );
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
212 entry->data.host.l = ohlen;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
213 break;
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
214
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
215 case ALL_USER:
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
216 {
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
217 /* Search the User-Name of the message */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
218 struct avp * un;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
219 struct avp_hdr * ahdr;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
220 CHECK_FCT( fd_msg_search_avp(qry, redir_dict_un, &un) );
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
221 if (!un) {
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
222 TRACE_DEBUG(INFO, "Received a Redirect indication with usage ALL_USER but no User-Name AVP in the message, defaulting to DONT_CACHE");
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
223 entry->type = DONT_CACHE;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
224 entry->data.message.msg = qry;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
225 break;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
226 }
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
227 CHECK_FCT( fd_msg_avp_hdr( un, &ahdr ) );
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
228 CHECK_MALLOC( entry->data.user.s = os0dup(ahdr->avp_value->os.data, ahdr->avp_value->os.len) );
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
229 entry->data.user.l = ahdr->avp_value->os.len;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
230 }
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
231 break;
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
232
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
233 default:
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
234 ASSERT(0);
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
235 return EINVAL;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
236 }
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
237
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
238 /* We're done */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
239 *e = entry;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
240 return 0;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
241 }
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
242
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
243
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
244 /* Compares two pointers (DONT_CACHE) */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
245 static int compare_entries_ptr(union matchdata * d1, union matchdata * d2) {
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
246 unsigned long v1 = (unsigned long) d1->message.msg;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
247 unsigned long v2 = (unsigned long) d2->message.msg;
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
248 if (v1 > v2)
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
249 return 1;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
250 if (v1 < v2)
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
251 return -1;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
252 return 0;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
253 }
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
254 /* Compare two applications (REALM_AND_APPLICATION and ALL_APPLICATION) */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
255 static int compare_entries_appl(union matchdata * d1, union matchdata * d2) {
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
256 if (d1->app.a > d2->app.a)
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
257 return 1;
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
258 if (d1->app.a < d2->app.a)
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
259 return -1;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
260 return 0;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
261 }
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
262
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
263 /* Compare two strings (ALL_SESSION, ALL_REALM, ALL_HOST, ALL_USER) */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
264 static int compare_entries_ostr(union matchdata * d1, union matchdata * d2) {
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
265 return fd_os_cmp(d1->session.s, d1->session.l, d2->session.s, d2->session.l);
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
266 }
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
267
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
268 /* The array of callbacks */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
269 int (*redir_entry_cmp_key[H_U_MAX +1])(union matchdata * , union matchdata * ) = {
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
270 compare_entries_ptr, /* DONT_CACHE */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
271 compare_entries_ostr, /* ALL_SESSION */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
272 compare_entries_ostr, /* ALL_REALM */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
273 compare_entries_appl, /* REALM_AND_APPLICATION */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
274 compare_entries_appl, /* ALL_APPLICATION */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
275 compare_entries_ostr, /* ALL_HOST */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
276 compare_entries_ostr /* ALL_USER */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
277 };
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
278
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
279 /* Link the newly created entry into the correct redirects_usages list. The mutex must be held */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
280 int redir_entry_insert(struct redir_entry * e)
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
281 {
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
282 struct fd_list * li;
1260
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
283 struct redir_entry * r = NULL;
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
284
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
285 TRACE_ENTRY("%p", e);
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
286 CHECK_PARAMS(e && (e->eyec == REDIR_ENTRY_EYEC));
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
287
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
288 /* Write-Lock the line */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
289 CHECK_POSIX( pthread_rwlock_wrlock( RWLOCK_REDIR(e) ) );
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
290
1260
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
291 switch (e->type) {
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
292 case ALL_SESSION:
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
293 HASH_FIND(hh, redirect_hash_table[e->type], e->data.session.s, e->data.session.l, r);
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
294 if (r) {
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
295 /* previously existing entry, delete it from hash and free it */
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
296 HASH_DELETE(hh, redirect_hash_table[e->type], r);
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
297 CHECK_FCT_DO( redir_entry_destroy(r), );
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
298 }
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
299 HASH_ADD_KEYPTR(hh, redirect_hash_table[e->type], e->data.session.s, e->data.session.l, e);
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
300 break;
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
301 case ALL_USER:
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
302 HASH_FIND(hh, redirect_hash_table[e->type], e->data.user.s, e->data.user.l, r);
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
303 if (r) {
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
304 /* previously existing entry, delete it from hash and free it */
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
305 HASH_DELETE(hh, redirect_hash_table[e->type], r);
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
306 CHECK_FCT_DO( redir_entry_destroy(r), );
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
307 }
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
308 HASH_ADD_KEYPTR(hh, redirect_hash_table[e->type], e->data.user.s, e->data.user.l, e);
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
309 break;
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
310 default:
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
311 for (li = redirects_usages[e->type].sentinel.next; li != &redirects_usages[e->type].sentinel; li = li->next) {
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
312 struct redir_entry * n = li->o;
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
313 int cmp = redir_entry_cmp_key[e->type](&e->data, &n->data);
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
314 if (cmp <= 0)
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
315 break;
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
316 }
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
317
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
318 fd_list_insert_before(li, &e->redir_list);
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
319 break;
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
320 }
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
321
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
322 /* unLock the line */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
323 CHECK_POSIX( pthread_rwlock_unlock( RWLOCK_REDIR(e) ) );
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
324
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
325 return 0;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
326 }
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
327
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
328 /* Destroy -- the exp_peer_lock must be held when this function is called */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
329 int redir_entry_destroy(struct redir_entry * e)
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
330 {
1260
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
331 struct redir_entry *match;
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
332 TRACE_ENTRY("%p", e);
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
333 CHECK_PARAMS(e && (e->eyec == REDIR_ENTRY_EYEC));
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
334
1260
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
335 switch (e->type) {
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
336 case ALL_SESSION:
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
337 /* If the entry is in the hash table, lock the rwlock also */
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
338 HASH_FIND(hh, redirect_hash_table[e->type], e->data.session.s, e->data.session.l, match);
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
339 if (match) {
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
340 /* TODO: check if e == match? */
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
341 CHECK_POSIX( pthread_rwlock_wrlock( RWLOCK_REDIR(e) ) );
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
342 HASH_DELETE(hh, redirect_hash_table[e->type], match);
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
343 CHECK_POSIX( pthread_rwlock_unlock( RWLOCK_REDIR(e) ) );
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
344 }
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
345 break;
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
346 case ALL_USER:
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
347 /* If the entry is in the hash table, lock the rwlock also */
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
348 HASH_FIND(hh, redirect_hash_table[e->type], e->data.user.s, e->data.user.l, match);
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
349 if (match) {
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
350 /* TODO: check if e == match? */
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
351 CHECK_POSIX( pthread_rwlock_wrlock( RWLOCK_REDIR(e) ) );
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
352 HASH_DELETE(hh, redirect_hash_table[e->type], match);
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
353 CHECK_POSIX( pthread_rwlock_unlock( RWLOCK_REDIR(e) ) );
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
354 }
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
355 break;
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
356 default:
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
357 /* If the entry is linked, lock the rwlock also */
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
358 if (!FD_IS_LIST_EMPTY(&e->redir_list)) {
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
359 CHECK_POSIX( pthread_rwlock_wrlock( RWLOCK_REDIR(e) ) );
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
360 fd_list_unlink(&e->redir_list);
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
361 CHECK_POSIX( pthread_rwlock_unlock( RWLOCK_REDIR(e) ) );
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
362 }
4f6f61e67599 Store redirect information for ALL_SESSION and ALL_USER in a hash.
Thomas Klausner <tk@giga.or.at>
parents: 1259
diff changeset
363 break;
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
364 }
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
365
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
366 /* Now unlink from other list */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
367 fd_list_unlink(&e->exp_list);
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
368
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
369 /* Empty the targets list */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
370 while (!FD_IS_LIST_EMPTY(&e->target_peers_list)) {
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
371 struct redir_host * h = (struct redir_host *)e->target_peers_list.next->o;
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
372
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
373 fd_list_unlink(&h->chain);
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
374 free(h->id);
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
375 free(h);
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
376 }
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
377
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
378 /* Now we can destroy the data safely */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
379 switch (e->type) {
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
380 case DONT_CACHE:
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
381 /* nothing special */
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
382 break;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
383 case ALL_SESSION:
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
384 free(e->data.session.s);
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
385 break;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
386 case ALL_REALM:
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
387 free(e->data.realm.s);
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
388 break;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
389 case REALM_AND_APPLICATION:
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
390 free(e->data.realm_app.s);
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
391 break;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
392 case ALL_APPLICATION:
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
393 break;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
394 case ALL_HOST:
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
395 free(e->data.host.s);
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
396 break;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
397 case ALL_USER:
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
398 free(e->data.user.s);
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
399 break;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
400 default:
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
401 TRACE_DEBUG(INFO, "Invalid redirect type was saved");
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
402 ASSERT(0);
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
403 return EINVAL;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
404 }
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
405
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
406 free(e->from.s);
1259
82280e745a89 Remove whitespace at end of line.
Thomas Klausner <tk@giga.or.at>
parents: 740
diff changeset
407
717
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
408 free(e);
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
409 return 0;
571b3abaa5df Support for Diameter Redirects through rt_redirect.fdx extension (EXPERIMENTAL)
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
410 }
"Welcome to our mercurial repository"