Changes in uspace/srv/net/inetsrv/inet_link.c [1d24ad3:4a5a18be] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/inetsrv/inet_link.c
r1d24ad3 r4a5a18be 43 43 #include <stdlib.h> 44 44 #include <str.h> 45 #include <net/socket_codes.h> 45 46 46 #include "addrobj.h" 47 47 #include "inetsrv.h" … … 49 49 #include "pdu.h" 50 50 51 static int inet_link_open(service_id_t );52 static int inet_iplink_recv(iplink_t * , iplink_recv_sdu_t *, uint16_t);51 static int inet_link_open(service_id_t sid); 52 static int inet_iplink_recv(iplink_t *ilink, iplink_sdu_t *sdu); 53 53 54 54 static iplink_ev_ops_t inet_iplink_ev_ops = { … … 59 59 static FIBRIL_MUTEX_INITIALIZE(inet_discovery_lock); 60 60 61 static int inet_iplink_recv(iplink_t *iplink, iplink_recv_sdu_t *sdu, uint16_t af) 62 { 61 static int inet_iplink_recv(iplink_t *iplink, iplink_sdu_t *sdu) 62 { 63 inet_packet_t packet; 64 int rc; 65 63 66 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_iplink_recv()"); 64 65 int rc; 66 inet_packet_t packet; 67 68 switch (af) { 69 case AF_INET: 70 rc = inet_pdu_decode(sdu->data, sdu->size, &packet); 71 break; 72 case AF_INET6: 73 rc = inet_pdu_decode6(sdu->data, sdu->size, &packet); 74 break; 75 default: 76 log_msg(LOG_DEFAULT, LVL_DEBUG, "invalid address family"); 77 return EINVAL; 78 } 79 67 rc = inet_pdu_decode(sdu->data, sdu->size, &packet); 80 68 if (rc != EOK) { 81 69 log_msg(LOG_DEFAULT, LVL_DEBUG, "failed decoding PDU"); 82 70 return rc; 83 71 } 84 72 85 73 log_msg(LOG_DEFAULT, LVL_DEBUG, "call inet_recv_packet()"); 86 74 rc = inet_recv_packet(&packet); 87 75 log_msg(LOG_DEFAULT, LVL_DEBUG, "call inet_recv_packet -> %d", rc); 88 76 free(packet.data); 89 77 90 78 return rc; 91 79 } … … 165 153 { 166 154 inet_link_t *ilink; 167 i net_addr_t iaddr;155 iplink_addr_t iaddr; 168 156 int rc; 169 157 … … 206 194 207 195 inet_addrobj_t *addr; 208 inet_addrobj_t *addr6;209 196 210 197 static int first = 1; 211 198 /* XXX For testing: set static IP address 10.0.2.15/24 */ 212 199 addr = inet_addrobj_new(); 213 addr6 = inet_addrobj_new();214 215 200 if (first) { 216 inet_naddr(&addr->naddr, 127, 0, 0, 1, 24); 217 inet_naddr6(&addr6->naddr, 0, 0, 0, 0, 0, 0, 0, 1, 128); 201 addr->naddr.ipv4 = (127 << 24) + (0 << 16) + (0 << 8) + 1; 218 202 first = 0; 219 203 } else { 220 /* 221 * FIXME 222 * Setting static IP addresses for testing purposes 223 * 10.0.2.15/24 224 * fd19:1680::4/120 225 */ 226 inet_naddr(&addr->naddr, 10, 0, 2, 15, 24); 227 inet_naddr6(&addr6->naddr, 0xfd19, 0x1680, 0, 0, 0, 0, 0, 4, 120); 228 } 229 204 addr->naddr.ipv4 = (10 << 24) + (0 << 16) + (2 << 8) + 15; 205 } 206 addr->naddr.bits = 24; 230 207 addr->ilink = ilink; 231 addr6->ilink = ilink;232 208 addr->name = str_dup("v4a"); 233 addr6->name = str_dup("v6a");234 235 209 rc = inet_addrobj_add(addr); 236 210 if (rc != EOK) { 237 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding IPv4 address.");211 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed setting IP address on internet link."); 238 212 inet_addrobj_delete(addr); 239 213 /* XXX Roll back */ 240 214 return rc; 241 215 } 242 243 rc = inet_addrobj_add(addr6); 244 if (rc != EOK) { 245 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding IPv6 address."); 246 inet_addrobj_delete(addr6); 247 /* XXX Roll back */ 248 return rc; 249 } 250 251 inet_naddr_addr(&addr->naddr, &iaddr); 216 217 iaddr.ipv4 = addr->naddr.ipv4; 252 218 rc = iplink_addr_add(ilink->iplink, &iaddr); 253 219 if (rc != EOK) { 254 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed setting IP v4address on internet link.");220 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed setting IP address on internet link."); 255 221 inet_addrobj_remove(addr); 256 222 inet_addrobj_delete(addr); … … 258 224 return rc; 259 225 } 260 261 inet_naddr_addr(&addr6->naddr, &iaddr); 262 rc = iplink_addr_add(ilink->iplink, &iaddr); 263 if (rc != EOK) { 264 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed setting IPv6 address on internet link."); 265 inet_addrobj_remove(addr6); 266 inet_addrobj_delete(addr6); 267 /* XXX Roll back */ 268 return rc; 269 } 270 226 271 227 return EOK; 272 228 273 229 error: 274 230 if (ilink->iplink != NULL) 275 231 iplink_close(ilink->iplink); 276 277 232 inet_link_delete(ilink); 278 233 return rc; … … 302 257 inet_addr_t *ldest, inet_dgram_t *dgram, uint8_t proto, uint8_t ttl, int df) 303 258 { 259 iplink_sdu_t sdu; 260 inet_packet_t packet; 261 int rc; 262 size_t offs, roffs; 263 304 264 /* 305 265 * Fill packet structure. Fragmentation is performed by 306 266 * inet_pdu_encode(). 307 267 */ 308 309 inet_packet_t packet;310 311 268 packet.src = dgram->src; 312 269 packet.dest = dgram->dest; … … 317 274 packet.data = dgram->data; 318 275 packet.size = dgram->size; 319 320 iplink_sdu_t sdu; 321 size_t offs = 0; 322 int rc; 323 324 sdu.src = *lsrc; 325 sdu.dest = *ldest; 326 276 277 sdu.lsrc.ipv4 = lsrc->ipv4; 278 sdu.ldest.ipv4 = ldest->ipv4; 279 280 offs = 0; 327 281 do { 328 282 /* Encode one fragment */ 329 size_t roffs;330 283 rc = inet_pdu_encode(&packet, offs, ilink->def_mtu, &sdu.data, 331 284 &sdu.size, &roffs); 332 285 if (rc != EOK) 333 286 return rc; 334 287 335 288 /* Send the PDU */ 336 289 rc = iplink_send(ilink->iplink, &sdu); 337 290 free(sdu.data); 338 291 339 292 offs = roffs; 340 293 } while (offs < packet.size); 341 294 342 295 return rc; 343 296 }
Note:
See TracChangeset
for help on using the changeset viewer.