[TIPC] License header update
[linux-3.10.git] / net / tipc / zone.c
1 /*
2  * net/tipc/zone.c: TIPC zone management routines
3  * 
4  * Copyright (c) 2003-2005, Ericsson Research Canada
5  * Copyright (c) 2005, Wind River Systems
6  * Copyright (c) 2005-2006, Ericsson AB
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  * 3. Neither the names of the copyright holders nor the names of its
18  *    contributors may be used to endorse or promote products derived from
19  *    this software without specific prior written permission.
20  *
21  * Alternatively, this software may be distributed under the terms of the
22  * GNU General Public License ("GPL") version 2 as published by the Free
23  * Software Foundation.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
26  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
29  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35  * POSSIBILITY OF SUCH DAMAGE.
36  */
37
38 #include "core.h"
39 #include "zone.h"
40 #include "net.h"
41 #include "addr.h"
42 #include "node_subscr.h"
43 #include "cluster.h"
44 #include "node.h"
45
46 struct _zone *zone_create(u32 addr)
47 {
48         struct _zone *z_ptr = 0;
49         u32 z_num;
50
51         if (!addr_domain_valid(addr))
52                 return 0;
53
54         z_ptr = (struct _zone *)kmalloc(sizeof(*z_ptr), GFP_ATOMIC);
55         if (z_ptr != NULL) {
56                 memset(z_ptr, 0, sizeof(*z_ptr));
57                 z_num = tipc_zone(addr);
58                 z_ptr->addr = tipc_addr(z_num, 0, 0);
59                 net.zones[z_num] = z_ptr;
60         }
61         return z_ptr;
62 }
63
64 void zone_delete(struct _zone *z_ptr)
65 {
66         u32 c_num;
67
68         if (!z_ptr)
69                 return;
70         for (c_num = 1; c_num <= tipc_max_clusters; c_num++) {
71                 cluster_delete(z_ptr->clusters[c_num]);
72         }
73         kfree(z_ptr);
74 }
75
76 void zone_attach_cluster(struct _zone *z_ptr, struct cluster *c_ptr)
77 {
78         u32 c_num = tipc_cluster(c_ptr->addr);
79
80         assert(c_ptr->addr);
81         assert(c_num <= tipc_max_clusters);
82         assert(z_ptr->clusters[c_num] == 0);
83         z_ptr->clusters[c_num] = c_ptr;
84 }
85
86 void zone_remove_as_router(struct _zone *z_ptr, u32 router)
87 {
88         u32 c_num;
89
90         for (c_num = 1; c_num <= tipc_max_clusters; c_num++) {
91                 if (z_ptr->clusters[c_num]) {
92                         cluster_remove_as_router(z_ptr->clusters[c_num], 
93                                                  router);
94                 }
95         }
96 }
97
98 void zone_send_external_routes(struct _zone *z_ptr, u32 dest)
99 {
100         u32 c_num;
101
102         for (c_num = 1; c_num <= tipc_max_clusters; c_num++) {
103                 if (z_ptr->clusters[c_num]) {
104                         if (in_own_cluster(z_ptr->addr))
105                                 continue;
106                         cluster_send_ext_routes(z_ptr->clusters[c_num], dest);
107                 }
108         }
109 }
110
111 struct node *zone_select_remote_node(struct _zone *z_ptr, u32 addr, u32 ref)
112 {
113         struct cluster *c_ptr;
114         struct node *n_ptr;
115         u32 c_num;
116
117         if (!z_ptr)
118                 return 0;
119         c_ptr = z_ptr->clusters[tipc_cluster(addr)];
120         if (!c_ptr)
121                 return 0;
122         n_ptr = cluster_select_node(c_ptr, ref);
123         if (n_ptr)
124                 return n_ptr;
125
126         /* Links to any other clusters within this zone ? */
127         for (c_num = 1; c_num <= tipc_max_clusters; c_num++) {
128                 c_ptr = z_ptr->clusters[c_num];
129                 if (!c_ptr)
130                         return 0;
131                 n_ptr = cluster_select_node(c_ptr, ref);
132                 if (n_ptr)
133                         return n_ptr;
134         }
135         return 0;
136 }
137
138 u32 zone_select_router(struct _zone *z_ptr, u32 addr, u32 ref)
139 {
140         struct cluster *c_ptr;
141         u32 c_num;
142         u32 router;
143
144         if (!z_ptr)
145                 return 0;
146         c_ptr = z_ptr->clusters[tipc_cluster(addr)];
147         router = c_ptr ? cluster_select_router(c_ptr, ref) : 0;
148         if (router)
149                 return router;
150
151         /* Links to any other clusters within the zone? */
152         for (c_num = 1; c_num <= tipc_max_clusters; c_num++) {
153                 c_ptr = z_ptr->clusters[c_num];
154                 router = c_ptr ? cluster_select_router(c_ptr, ref) : 0;
155                 if (router)
156                         return router;
157         }
158         return 0;
159 }
160
161
162 u32 zone_next_node(u32 addr)
163 {
164         struct cluster *c_ptr = cluster_find(addr);
165
166         if (c_ptr)
167                 return cluster_next_node(c_ptr, addr);
168         return 0;
169 }
170