source: mainline/uspace/srv/net/inetsrv/addrobj.c@ b4ec1ea

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since b4ec1ea was b4ec1ea, checked in by Jiri Svoboda <jiri@…>, 14 years ago

Rename app/inetcfg to app/inet, srv/inet to srv/inetsrv. Administration tools are run more often from the command line than the services they configure. It makes sense for them to have the shorter name.

  • Property mode set to 100644
File size: 5.7 KB
Line 
1/*
2 * Copyright (c) 2012 Jiri Svoboda
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup inet
30 * @{
31 */
32/**
33 * @file
34 * @brief
35 */
36
37#include <bitops.h>
38#include <errno.h>
39#include <fibril_synch.h>
40#include <io/log.h>
41#include <ipc/loc.h>
42#include <stdlib.h>
43#include <str.h>
44
45#include "addrobj.h"
46#include "inetsrv.h"
47#include "inet_link.h"
48#include "inet_util.h"
49
50static FIBRIL_MUTEX_INITIALIZE(addr_list_lock);
51static LIST_INITIALIZE(addr_list);
52static sysarg_t addr_id = 0;
53
54inet_addrobj_t *inet_addrobj_new(void)
55{
56 inet_addrobj_t *addr = calloc(1, sizeof(inet_addrobj_t));
57
58 if (addr == NULL) {
59 log_msg(LVL_ERROR, "Failed allocating address object. "
60 "Out of memory.");
61 return NULL;
62 }
63
64 link_initialize(&addr->addr_list);
65 fibril_mutex_lock(&addr_list_lock);
66 addr->id = ++addr_id;
67 fibril_mutex_unlock(&addr_list_lock);
68
69 return addr;
70}
71
72void inet_addrobj_delete(inet_addrobj_t *addr)
73{
74 if (addr->name != NULL)
75 free(addr->name);
76 free(addr);
77}
78
79void inet_addrobj_add(inet_addrobj_t *addr)
80{
81 fibril_mutex_lock(&addr_list_lock);
82 list_append(&addr->addr_list, &addr_list);
83 fibril_mutex_unlock(&addr_list_lock);
84}
85
86void inet_addrobj_remove(inet_addrobj_t *addr)
87{
88 fibril_mutex_lock(&addr_list_lock);
89 list_remove(&addr->addr_list);
90 fibril_mutex_unlock(&addr_list_lock);
91}
92
93/** Find address object matching address @a addr.
94 *
95 * @param addr Address
96 * @oaram find iaf_net to find network (using mask),
97 * iaf_addr to find local address (exact match)
98 */
99inet_addrobj_t *inet_addrobj_find(inet_addr_t *addr, inet_addrobj_find_t find)
100{
101 uint32_t mask;
102
103 log_msg(LVL_DEBUG, "inet_addrobj_find(%x)", (unsigned)addr->ipv4);
104
105 fibril_mutex_lock(&addr_list_lock);
106
107 list_foreach(addr_list, link) {
108 inet_addrobj_t *naddr = list_get_instance(link,
109 inet_addrobj_t, addr_list);
110
111 mask = inet_netmask(naddr->naddr.bits);
112 if ((naddr->naddr.ipv4 & mask) == (addr->ipv4 & mask)) {
113 fibril_mutex_unlock(&addr_list_lock);
114 log_msg(LVL_DEBUG, "inet_addrobj_find: found %p",
115 naddr);
116 return naddr;
117 }
118 }
119
120 log_msg(LVL_DEBUG, "inet_addrobj_find: Not found");
121 fibril_mutex_unlock(&addr_list_lock);
122
123 return NULL;
124}
125
126/** Find address object on a link, with a specific name.
127 *
128 * @param name Address object name
129 * @param ilink Inet link
130 * @return Address object
131 */
132inet_addrobj_t *inet_addrobj_find_by_name(const char *name, inet_link_t *ilink)
133{
134 log_msg(LVL_DEBUG, "inet_addrobj_find_by_name('%s', '%s')",
135 name, ilink->svc_name);
136
137 fibril_mutex_lock(&addr_list_lock);
138
139 list_foreach(addr_list, link) {
140 inet_addrobj_t *naddr = list_get_instance(link,
141 inet_addrobj_t, addr_list);
142
143 if (naddr->ilink == ilink && str_cmp(naddr->name, name) == 0) {
144 fibril_mutex_unlock(&addr_list_lock);
145 log_msg(LVL_DEBUG, "inet_addrobj_find_by_name: found %p",
146 naddr);
147 return naddr;
148 }
149 }
150
151 log_msg(LVL_DEBUG, "inet_addrobj_find_by_name: Not found");
152 fibril_mutex_unlock(&addr_list_lock);
153
154 return NULL;
155}
156
157/** Find address object with the given ID.
158 *
159 * @param id Address object ID
160 * @return Address object
161 */
162inet_addrobj_t *inet_addrobj_get_by_id(sysarg_t id)
163{
164 log_msg(LVL_DEBUG, "inet_addrobj_get_by_id(%zu)", (size_t)id);
165
166 fibril_mutex_lock(&addr_list_lock);
167
168 list_foreach(addr_list, link) {
169 inet_addrobj_t *naddr = list_get_instance(link,
170 inet_addrobj_t, addr_list);
171
172 if (naddr->id == id) {
173 fibril_mutex_unlock(&addr_list_lock);
174 return naddr;
175 }
176 }
177
178 fibril_mutex_unlock(&addr_list_lock);
179
180 return NULL;
181}
182
183/** Send datagram from address object */
184int inet_addrobj_send_dgram(inet_addrobj_t *addr, inet_addr_t *ldest,
185 inet_dgram_t *dgram, uint8_t proto, uint8_t ttl, int df)
186{
187 inet_addr_t lsrc_addr;
188 inet_addr_t *ldest_addr;
189
190 lsrc_addr.ipv4 = addr->naddr.ipv4;
191 ldest_addr = &dgram->dest;
192
193 return inet_link_send_dgram(addr->ilink, &lsrc_addr, ldest_addr, dgram,
194 proto, ttl, df);
195}
196
197/** Get IDs of all address objects. */
198int inet_addrobj_get_id_list(sysarg_t **rid_list, size_t *rcount)
199{
200 sysarg_t *id_list;
201 size_t count, i;
202
203 fibril_mutex_lock(&addr_list_lock);
204 count = list_count(&addr_list);
205
206 id_list = calloc(count, sizeof(sysarg_t));
207 if (id_list == NULL) {
208 fibril_mutex_unlock(&addr_list_lock);
209 return ENOMEM;
210 }
211
212 i = 0;
213 list_foreach(addr_list, link) {
214 inet_addrobj_t *addr = list_get_instance(link,
215 inet_addrobj_t, addr_list);
216
217 id_list[i++] = addr->id;
218 }
219
220 fibril_mutex_unlock(&addr_list_lock);
221
222 *rid_list = id_list;
223 *rcount = count;
224
225 return EOK;
226}
227
228/** @}
229 */
Note: See TracBrowser for help on using the repository browser.