Changes in uspace/srv/net/inetsrv/addrobj.c [5a324d99:a1a101d] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/inetsrv/addrobj.c
r5a324d99 ra1a101d 42 42 #include <stdlib.h> 43 43 #include <str.h> 44 44 45 #include "addrobj.h" 45 46 #include "inetsrv.h" 46 47 #include "inet_link.h" 47 #include " ndp.h"48 #include "inet_util.h" 48 49 49 50 static inet_addrobj_t *inet_addrobj_find_by_name_locked(const char *, inet_link_t *); … … 105 106 /** Find address object matching address @a addr. 106 107 * 107 * @param addr Address 108 * @oaram find iaf_net to find network (using mask), 109 * iaf_addr to find local address (exact match) 110 * 108 * @param addr Address 109 * @oaram find iaf_net to find network (using mask), 110 * iaf_addr to find local address (exact match) 111 111 */ 112 112 inet_addrobj_t *inet_addrobj_find(inet_addr_t *addr, inet_addrobj_find_t find) 113 113 { 114 fibril_mutex_lock(&addr_list_lock); 115 116 list_foreach(addr_list, addr_list, inet_addrobj_t, naddr) { 117 switch (find) { 118 case iaf_net: 119 if (inet_naddr_compare_mask(&naddr->naddr, addr)) { 120 fibril_mutex_unlock(&addr_list_lock); 121 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find: found %p", 122 naddr); 123 return naddr; 124 } 125 break; 126 case iaf_addr: 127 if (inet_naddr_compare(&naddr->naddr, addr)) { 128 fibril_mutex_unlock(&addr_list_lock); 129 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find: found %p", 130 naddr); 131 return naddr; 132 } 133 break; 114 uint32_t mask; 115 116 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find(%x)", (unsigned)addr->ipv4); 117 118 fibril_mutex_lock(&addr_list_lock); 119 120 list_foreach(addr_list, link) { 121 inet_addrobj_t *naddr = list_get_instance(link, 122 inet_addrobj_t, addr_list); 123 124 mask = inet_netmask(naddr->naddr.bits); 125 if ((naddr->naddr.ipv4 & mask) == (addr->ipv4 & mask)) { 126 fibril_mutex_unlock(&addr_list_lock); 127 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find: found %p", 128 naddr); 129 return naddr; 134 130 } 135 131 } 136 132 137 133 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find: Not found"); 138 134 fibril_mutex_unlock(&addr_list_lock); 139 135 140 136 return NULL; 141 137 } … … 154 150 name, ilink->svc_name); 155 151 156 list_foreach(addr_list, addr_list, inet_addrobj_t, naddr) { 152 list_foreach(addr_list, link) { 153 inet_addrobj_t *naddr = list_get_instance(link, 154 inet_addrobj_t, addr_list); 155 157 156 if (naddr->ilink == ilink && str_cmp(naddr->name, name) == 0) { 158 157 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find_by_name_locked: found %p", … … 199 198 fibril_mutex_lock(&addr_list_lock); 200 199 201 list_foreach(addr_list, addr_list, inet_addrobj_t, naddr) { 200 list_foreach(addr_list, link) { 201 inet_addrobj_t *naddr = list_get_instance(link, 202 inet_addrobj_t, addr_list); 203 202 204 if (naddr->id == id) { 203 205 fibril_mutex_unlock(&addr_list_lock); … … 216 218 { 217 219 inet_addr_t lsrc_addr; 218 inet_naddr_addr(&addr->naddr, &lsrc_addr); 219 220 addr32_t lsrc_v4; 221 addr128_t lsrc_v6; 222 ip_ver_t lsrc_ver = inet_addr_get(&lsrc_addr, &lsrc_v4, &lsrc_v6); 223 224 addr32_t ldest_v4; 225 addr128_t ldest_v6; 226 ip_ver_t ldest_ver = inet_addr_get(ldest, &ldest_v4, &ldest_v6); 227 228 if (lsrc_ver != ldest_ver) 229 return EINVAL; 230 231 int rc; 232 addr48_t ldest_mac; 233 234 switch (ldest_ver) { 235 case ip_v4: 236 return inet_link_send_dgram(addr->ilink, lsrc_v4, ldest_v4, 237 dgram, proto, ttl, df); 238 case ip_v6: 239 /* 240 * Translate local destination IPv6 address. 241 */ 242 rc = ndp_translate(lsrc_v6, ldest_v6, ldest_mac, addr->ilink); 243 if (rc != EOK) 244 return rc; 245 246 return inet_link_send_dgram6(addr->ilink, ldest_mac, dgram, 247 proto, ttl, df); 248 default: 249 assert(false); 250 break; 251 } 252 253 return ENOTSUP; 220 inet_addr_t *ldest_addr; 221 222 lsrc_addr.ipv4 = addr->naddr.ipv4; 223 ldest_addr = &dgram->dest; 224 225 return inet_link_send_dgram(addr->ilink, &lsrc_addr, ldest_addr, dgram, 226 proto, ttl, df); 254 227 } 255 228 … … 270 243 271 244 i = 0; 272 list_foreach(addr_list, addr_list, inet_addrobj_t, addr) { 245 list_foreach(addr_list, link) { 246 inet_addrobj_t *addr = list_get_instance(link, 247 inet_addrobj_t, addr_list); 248 273 249 id_list[i++] = addr->id; 274 250 }
Note:
See TracChangeset
for help on using the changeset viewer.