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