Changeset c42f50d in mainline
- Timestamp:
- 2013-10-05T11:53:43Z (11 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- cbfc8b7
- Parents:
- 408424e (diff), 3e896e1 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Files:
-
- 12 added
- 4 deleted
- 69 edited
- 4 moved
Legend:
- Unmodified
- Added
- Removed
-
.bzrignore
r408424e rc42f50d 269 269 uspace/dist/srv/dhcp 270 270 uspace/srv/net/dhcp/dhcp 271 uspace/dist/srv/nconfsrv 272 uspace/srv/net/nconfsrv/nconfsrv 271 273 uspace/app/netspeed/netspeed 272 274 uspace/dist/app/netspeed -
abi/include/abi/ipc/ipc.h
r408424e rc42f50d 59 59 /** Interrupt notification */ 60 60 #define IPC_CALL_NOTIF (1 << 3) 61 62 /** 63 * Maximum buffer size allowed for IPC_M_DATA_WRITE and 64 * IPC_M_DATA_READ requests. 65 */ 66 #define DATA_XFER_LIMIT (64 * 1024) 61 67 62 68 -
boot/Makefile.common
r408424e rc42f50d 118 118 $(USPACE_PATH)/srv/net/inetsrv/inetsrv \ 119 119 $(USPACE_PATH)/srv/net/loopip/loopip \ 120 $(USPACE_PATH)/srv/net/nconfsrv/nconfsrv \ 120 121 $(USPACE_PATH)/srv/net/slip/slip \ 121 122 $(USPACE_PATH)/srv/net/tcp/tcp \ … … 201 202 $(USPACE_PATH)/app/nterm/nterm \ 202 203 $(USPACE_PATH)/app/ping/ping \ 203 $(USPACE_PATH)/app/ping6/ping6 \204 204 $(USPACE_PATH)/app/stats/stats \ 205 205 $(USPACE_PATH)/app/sysinfo/sysinfo \ … … 211 211 $(USPACE_PATH)/app/date/date \ 212 212 $(USPACE_PATH)/app/vdemo/vdemo \ 213 $(USPACE_PATH)/app/viewer/viewer \ 213 214 $(USPACE_PATH)/app/df/df 214 215 -
kernel/generic/include/config.h
r408424e rc42f50d 47 47 #define CONFIG_TASK_NAME_BUFLEN 32 48 48 #define CONFIG_TASK_ARGUMENTS_BUFLEN 64 49 50 /**51 * Maximum buffer size allowed for IPC_M_DATA_WRITE and IPC_M_DATA_READ52 * requests.53 */54 #define DATA_XFER_LIMIT (64 * 1024)55 49 56 50 #ifndef __ASM__ -
tools/toolchain.sh
r408424e rc42f50d 36 36 GCC_GMP_VERSION_NUM(__GNU_MP_VERSION, __GNU_MP_VERSION_MINOR, __GNU_MP_VERSION_PATCHLEVEL) 37 37 38 #if GCC_GMP_VERSION < GCC_GMP_VERSION_NUM(4, 3,2)38 #if GCC_GMP_VERSION < GCC_GMP_VERSION_NUM(4, 3, 2) 39 39 choke me 40 40 #endif … … 56 56 BINUTILS_RELEASE="" 57 57 GCC_VERSION="4.8.1" 58 GDB_VERSION="7.6 "58 GDB_VERSION="7.6.1" 59 59 60 60 BASEDIR="`pwd`" … … 303 303 download_fetch "${BINUTILS_SOURCE}" "${BINUTILS}" "33adb18c3048d057ac58d07a3f1adb38" 304 304 download_fetch "${GCC_SOURCE}" "${GCC}" "3b2386c114cd74185aa3754b58a79304" 305 download_fetch "${GDB_SOURCE}" "${GDB}" "f da57170e4d11cdde74259ca575412a8"305 download_fetch "${GDB_SOURCE}" "${GDB}" "fbc4dab4181e6e9937075b43a4ce2732" 306 306 } 307 307 -
uspace/Makefile
r408424e rc42f50d 76 76 app/nettest3 \ 77 77 app/ping \ 78 app/ping6 \79 78 app/sysinfo \ 80 79 app/mkbd \ 81 80 app/date \ 82 81 app/vdemo \ 82 app/viewer \ 83 83 app/vlaunch \ 84 84 app/vterm \ … … 97 97 srv/net/inetsrv \ 98 98 srv/net/loopip \ 99 srv/net/nconfsrv \ 99 100 srv/net/slip \ 100 101 srv/net/tcp \ -
uspace/app/dnsres/dnsres.c
r408424e rc42f50d 36 36 #include <inet/addr.h> 37 37 #include <inet/dnsr.h> 38 #include <net/socket_codes.h>39 38 #include <stdio.h> 40 39 #include <stdlib.h> … … 54 53 } 55 54 56 uint16_t af;55 uint16_t ver; 57 56 char *hname; 58 57 … … 63 62 } 64 63 65 af = AF_INET;64 ver = ip_v4; 66 65 hname = argv[2]; 67 66 } else if (str_cmp(argv[1], "-6") == 0) { … … 71 70 } 72 71 73 af = AF_INET6;72 ver = ip_v6; 74 73 hname = argv[2]; 75 74 } else { 76 af = 0;75 ver = ip_any; 77 76 hname = argv[1]; 78 77 } 79 78 80 79 dnsr_hostinfo_t *hinfo; 81 int rc = dnsr_name2host(hname, &hinfo, af);80 int rc = dnsr_name2host(hname, &hinfo, ver); 82 81 if (rc != EOK) { 83 82 printf("%s: Error resolving '%s'.\n", NAME, hname); -
uspace/app/getterm/getterm.c
r408424e rc42f50d 112 112 reopen(&stderr, 2, term, O_WRONLY, "w"); 113 113 114 /*115 * FIXME: fdopen() should actually detect that we are opening a console116 * and it should set line-buffering mode automatically.117 */118 setvbuf(stdout, NULL, _IOLBF, BUFSIZ);119 120 114 if (stdin == NULL) 121 115 return -2; … … 126 120 if (stderr == NULL) 127 121 return -4; 122 123 /* 124 * FIXME: fdopen() should actually detect that we are opening a console 125 * and it should set line-buffering mode automatically. 126 */ 127 setvbuf(stdout, NULL, _IOLBF, BUFSIZ); 128 128 129 129 version_print(term); -
uspace/app/init/init.c
r408424e rc42f50d 360 360 srv_start("/srv/udp"); 361 361 srv_start("/srv/dnsrsrv"); 362 srv_start("/srv/dhcp"); 363 srv_start("/srv/nconfsrv"); 362 364 363 365 srv_start("/srv/clipboard"); -
uspace/app/netspeed/netspeed.c
r408424e rc42f50d 36 36 */ 37 37 38 #include <assert.h> 39 #include <inet/dnsr.h> 40 #include <net/in.h> 41 #include <net/inet.h> 42 #include <net/socket.h> 38 43 #include <stdio.h> 39 44 #include <stdlib.h> … … 41 46 #include <str_error.h> 42 47 #include <task.h> 43 44 #include <net/in.h>45 #include <net/inet.h>46 #include <net/socket.h>47 48 48 49 #define NAME "netspeed" … … 114 115 } 115 116 116 static int client(sock_type_t sock_type, const char * address, unsigned port,117 static int client(sock_type_t sock_type, const char *host, unsigned port, 117 118 unsigned long count, char *buf, size_t bufsize) 118 119 { 119 struct sockaddr_in addr; 120 121 addr.sin_family = AF_INET; 122 addr.sin_port = htons(port); 123 124 int rc = inet_pton(AF_INET, address, (void *) &addr.sin_addr.s_addr); 125 if (rc != EOK) { 126 fprintf(stderr, "inet_pton failed: %s\n", str_error(rc)); 127 return rc; 128 } 129 130 int conn_sd = socket(PF_INET, sock_type, 0); 120 inet_addr_t iaddr; 121 struct sockaddr *saddr; 122 socklen_t saddrlen; 123 124 int rc = inet_addr_parse(host, &iaddr); 125 if (rc != EOK) { 126 dnsr_hostinfo_t *hinfo = NULL; 127 rc = dnsr_name2host(host, &hinfo, ip_any); 128 if (rc != EOK) { 129 fprintf(stderr, "Error resolving host '%s'.\n", host); 130 return ENOENT; 131 } 132 133 iaddr = hinfo->addr; 134 } 135 136 rc = inet_addr_sockaddr(&iaddr, port, &saddr, &saddrlen); 137 if (rc != EOK) { 138 assert(rc == ENOMEM); 139 fprintf(stderr, "Out of memory.\n"); 140 return ENOMEM; 141 } 142 143 int conn_sd = socket(saddr->sa_family, sock_type, 0); 131 144 if (conn_sd < 0) { 132 145 fprintf(stderr, "socket failed: %s\n", str_error(rc)); … … 135 148 136 149 if (sock_type == SOCK_STREAM) { 137 rc = connect(conn_sd, (struct sockaddr *) &addr, sizeof(addr));150 rc = connect(conn_sd, saddr, saddrlen); 138 151 if (rc != EOK) { 139 152 fprintf(stderr, "connect failed: %s\n", str_error(rc)); … … 151 164 rc = send(conn_sd, buf, bufsize, 0); 152 165 } else { 153 rc = sendto(conn_sd, buf, bufsize, 0, 154 (struct sockaddr *) &addr, sizeof(addr)); 166 rc = sendto(conn_sd, buf, bufsize, 0, saddr, saddrlen); 155 167 } 156 168 if (rc != EOK) { … … 161 173 162 174 closesocket(conn_sd); 175 free(saddr); 163 176 return rc; 164 177 } … … 167 180 { 168 181 fprintf(stderr, "Usage: netspeed <tcp|udp> server [port] <buffer size>\n"); 169 fprintf(stderr, " netspeed <tcp|udp> client < ip> <port> <count> <buffer size>\n");182 fprintf(stderr, " netspeed <tcp|udp> client <host> <port> <count> <buffer size>\n"); 170 183 } 171 184 -
uspace/app/nettest1/nettest1.c
r408424e rc42f50d 38 38 #include "print_error.h" 39 39 40 #include <assert.h> 40 41 #include <malloc.h> 41 42 #include <stdio.h> … … 59 60 #define NETTEST1_TEXT "Networking test 1 - sockets" 60 61 61 static uint16_t family = AF_ INET;62 static uint16_t family = AF_NONE; 62 63 static sock_type_t type = SOCK_DGRAM; 63 64 static size_t size = 27; … … 326 327 } 327 328 328 char * addr_s= argv[argc - 1];329 char *host = argv[argc - 1]; 329 330 330 331 /* Interpret as address */ 331 inet_addr_t addr_addr;332 rc = inet_addr_parse( addr_s, &addr_addr);332 inet_addr_t iaddr; 333 rc = inet_addr_parse(host, &iaddr); 333 334 334 335 if (rc != EOK) { 335 336 /* Interpret as a host name */ 336 337 dnsr_hostinfo_t *hinfo = NULL; 337 rc = dnsr_name2host( addr_s, &hinfo, family);338 rc = dnsr_name2host(host, &hinfo, ipver_from_af(family)); 338 339 339 340 if (rc != EOK) { 340 printf("Error resolving host '%s'.\n", addr_s);341 printf("Error resolving host '%s'.\n", host); 341 342 return EINVAL; 342 343 } 343 344 344 addr_addr = hinfo->addr; 345 } 346 347 struct sockaddr_in addr; 348 struct sockaddr_in6 addr6; 349 uint16_t af = inet_addr_sockaddr_in(&addr_addr, &addr, &addr6); 350 351 if (af != family) { 345 iaddr = hinfo->addr; 346 } 347 348 rc = inet_addr_sockaddr(&iaddr, port, &address, &addrlen); 349 if (rc != EOK) { 350 assert(rc == ENOMEM); 351 printf("Out of memory.\n"); 352 return ENOMEM; 353 } 354 355 if (family == AF_NONE) 356 family = address->sa_family; 357 358 if (address->sa_family != family) { 352 359 printf("Address family does not match explicitly set family.\n"); 353 360 return EINVAL; 354 }355 356 /* Prepare the address buffer */357 358 switch (af) {359 case AF_INET:360 addr.sin_port = htons(port);361 address = (struct sockaddr *) &addr;362 addrlen = sizeof(addr);363 break;364 case AF_INET6:365 addr6.sin6_port = htons(port);366 address = (struct sockaddr *) &addr6;367 addrlen = sizeof(addr6);368 break;369 default:370 fprintf(stderr, "Address family is not supported\n");371 return EAFNOSUPPORT;372 361 } 373 362 … … 434 423 &time_before)); 435 424 425 free(address); 426 436 427 if (verbose) 437 428 printf("Exiting\n"); -
uspace/app/nettest2/nettest2.c
r408424e rc42f50d 38 38 #include "print_error.h" 39 39 40 #include <assert.h> 40 41 #include <malloc.h> 41 42 #include <stdio.h> … … 60 61 #define NETTEST2_TEXT "Networking test 2 - transfer" 61 62 62 static uint16_t family = PF_INET;63 static uint16_t family = AF_NONE; 63 64 static size_t size = 28; 64 65 static bool verbose = false; … … 271 272 /* Interpret as a host name */ 272 273 dnsr_hostinfo_t *hinfo = NULL; 273 rc = dnsr_name2host(addr_s, &hinfo, family);274 rc = dnsr_name2host(addr_s, &hinfo, ipver_from_af(family)); 274 275 275 276 if (rc != EOK) { … … 281 282 } 282 283 283 struct sockaddr_in addr; 284 struct sockaddr_in6 addr6; 285 uint16_t af = inet_addr_sockaddr_in(&addr_addr, &addr, &addr6); 286 287 if (af != family) { 284 struct sockaddr *address; 285 socklen_t addrlen; 286 rc = inet_addr_sockaddr(&addr_addr, port, &address, &addrlen); 287 if (rc != EOK) { 288 assert(rc == ENOMEM); 289 printf("Out of memory.\n"); 290 return ENOMEM; 291 } 292 293 if (family == AF_NONE) 294 family = address->sa_family; 295 296 if (address->sa_family != family) { 288 297 printf("Address family does not match explicitly set family.\n"); 289 298 return EINVAL; 290 }291 292 /* Prepare the address buffer */293 294 struct sockaddr *address;295 socklen_t addrlen;296 297 switch (af) {298 case AF_INET:299 addr.sin_port = htons(port);300 address = (struct sockaddr *) &addr;301 addrlen = sizeof(addr);302 break;303 case AF_INET6:304 addr6.sin6_port = htons(port);305 address = (struct sockaddr *) &addr6;306 addrlen = sizeof(addr6);307 break;308 default:309 fprintf(stderr, "Address family is not supported\n");310 return EAFNOSUPPORT;311 299 } 312 300 … … 424 412 return rc; 425 413 414 free(address); 415 426 416 if (verbose) 427 417 printf("\nExiting\n"); -
uspace/app/nettest3/nettest3.c
r408424e rc42f50d 37 37 #include <async.h> 38 38 #include <stdio.h> 39 #include <stdlib.h> 39 40 #include <str.h> 40 41 … … 52 53 static char buf[BUF_SIZE]; 53 54 54 static struct sockaddr_in addr; 55 static struct sockaddr *address; 56 static socklen_t addrlen; 55 57 56 58 static uint16_t port; … … 62 64 char *endptr; 63 65 dnsr_hostinfo_t *hinfo; 66 inet_addr_t addr; 67 char *addr_s; 64 68 65 69 port = 7; … … 69 73 70 74 /* Connect to local IP address by default */ 71 addr.sin_family = AF_INET; 72 addr.sin_port = htons(port); 73 addr.sin_addr.s_addr = htonl(0x7f000001); 75 inet_addr(&addr, 127, 0, 0, 1); 74 76 75 77 if (argc >= 2) { 76 78 printf("parsing address '%s'\n", argv[1]); 77 rc = inet_ pton(AF_INET, argv[1], (uint8_t *)&addr.sin_addr.s_addr);79 rc = inet_addr_parse(argv[1], &addr); 78 80 if (rc != EOK) { 79 81 /* Try interpreting as a host name */ 80 rc = dnsr_name2host(argv[1], &hinfo, AF_INET);82 rc = dnsr_name2host(argv[1], &hinfo, ip_v4); 81 83 if (rc != EOK) { 82 84 printf("Error resolving host '%s'.\n", argv[1]); 83 85 return rc; 84 86 } 85 86 uint16_t af = inet_addr_sockaddr_in(&hinfo->addr, &addr, NULL); 87 if (af != AF_INET) { 88 printf("Host '%s' not resolved as IPv4 address.\n", argv[1]); 89 return rc; 90 } 87 88 addr = hinfo->addr; 91 89 } 92 printf("result: rc=%d, family=%d, addr=%x\n", rc, 93 addr.sin_family, addr.sin_addr.s_addr); 90 rc = inet_addr_format(&addr, &addr_s); 91 if (rc != EOK) { 92 assert(rc == ENOMEM); 93 printf("Out of memory.\n"); 94 return rc; 95 } 96 printf("result: rc=%d, ver=%d, addr=%s\n", rc, 97 addr.version, addr_s); 98 free(addr_s); 94 99 } 95 100 96 101 if (argc >= 3) { 97 102 printf("parsing port '%s'\n", argv[2]); 98 addr.sin_port = htons(strtoul(argv[2], &endptr, 10));103 port = htons(strtoul(argv[2], &endptr, 10)); 99 104 if (*endptr != '\0') { 100 105 fprintf(stderr, "Error parsing port\n"); … … 103 108 } 104 109 110 rc = inet_addr_sockaddr(&hinfo->addr, port, &address, &addrlen); 111 if (rc != EOK) { 112 printf("Out of memory.\n"); 113 return rc; 114 } 115 105 116 printf("socket()\n"); 106 fd = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP);117 fd = socket(address->sa_family, SOCK_STREAM, IPPROTO_TCP); 107 118 printf(" -> %d\n", fd); 108 119 if (fd < 0) … … 110 121 111 122 printf("connect()\n"); 112 rc = connect(fd, (struct sockaddr *) &addr, sizeof(addr));123 rc = connect(fd, address, addrlen); 113 124 printf(" -> %d\n", rc); 114 125 if (rc != 0) … … 133 144 printf(" -> %d\n", rc); 134 145 146 free(address); 147 135 148 return 0; 136 149 } -
uspace/app/nterm/conn.c
r408424e rc42f50d 38 38 #include <fibril.h> 39 39 #include <inet/dnsr.h> 40 #include <net/inet.h> 40 41 #include <net/socket.h> 41 42 #include <stdio.h> 43 #include <stdlib.h> 42 44 #include <str_error.h> 43 45 #include <sys/types.h> … … 73 75 } 74 76 75 int conn_open(const char * addr_s, const char *port_s)77 int conn_open(const char *host, const char *port_s) 76 78 { 77 79 int conn_fd = -1; 80 struct sockaddr *saddr = NULL; 81 socklen_t saddrlen; 78 82 79 83 /* Interpret as address */ 80 inet_addr_t addr_addr;81 int rc = inet_addr_parse( addr_s, &addr_addr);84 inet_addr_t iaddr; 85 int rc = inet_addr_parse(host, &iaddr); 82 86 83 87 if (rc != EOK) { 84 88 /* Interpret as a host name */ 85 89 dnsr_hostinfo_t *hinfo = NULL; 86 rc = dnsr_name2host( addr_s, &hinfo, 0);90 rc = dnsr_name2host(host, &hinfo, ip_any); 87 91 88 92 if (rc != EOK) { 89 printf("Error resolving host '%s'.\n", addr_s);93 printf("Error resolving host '%s'.\n", host); 90 94 goto error; 91 95 } 92 96 93 addr_addr = hinfo->addr;97 iaddr = hinfo->addr; 94 98 } 95 96 struct sockaddr_in addr;97 struct sockaddr_in6 addr6;98 uint16_t af = inet_addr_sockaddr_in(&addr_addr, &addr, &addr6);99 99 100 100 char *endptr; … … 105 105 } 106 106 107 printf("Connecting to host %s port %u\n", addr_s, port); 107 rc = inet_addr_sockaddr(&iaddr, port, &saddr, &saddrlen); 108 if (rc != EOK) { 109 assert(rc == ENOMEM); 110 printf("Out of memory.\n"); 111 return ENOMEM; 112 } 108 113 109 conn_fd = socket(PF_INET, SOCK_STREAM, 0); 114 printf("Connecting to host %s port %u\n", host, port); 115 116 conn_fd = socket(saddr->sa_family, SOCK_STREAM, 0); 110 117 if (conn_fd < 0) 111 118 goto error; 112 119 113 switch (af) { 114 case AF_INET: 115 addr.sin_port = htons(port); 116 rc = connect(conn_fd, (struct sockaddr *) &addr, sizeof(addr)); 117 break; 118 case AF_INET6: 119 addr6.sin6_port = htons(port); 120 rc = connect(conn_fd, (struct sockaddr *) &addr6, sizeof(addr6)); 121 break; 122 default: 123 printf("Unknown address family.\n"); 124 goto error; 125 } 126 120 rc = connect(conn_fd, saddr, saddrlen); 127 121 if (rc != EOK) 128 122 goto error; … … 134 128 fibril_add_ready(rcv_fid); 135 129 130 free(saddr); 136 131 return EOK; 137 138 132 error: 139 133 if (conn_fd >= 0) { … … 141 135 conn_fd = -1; 142 136 } 137 free(saddr); 143 138 144 139 return EIO; -
uspace/app/ping/ping.c
r408424e rc42f50d 37 37 #include <errno.h> 38 38 #include <fibril_synch.h> 39 #include <net/socket_codes.h>40 39 #include <inet/dnsr.h> 41 40 #include <inet/addr.h> … … 77 76 }; 78 77 79 static addr32_t src;80 static addr32_t dest;78 static inet_addr_t src_addr; 79 static inet_addr_t dest_addr; 81 80 82 81 static bool repeat_forever = false; 83 82 static size_t repeat_count = 1; 84 83 85 static const char *short_options = " rn:";84 static const char *short_options = "46rn:"; 86 85 87 86 static void print_syntax(void) 88 87 { 89 printf("Syntax: %s [-n <count>|-r] <host>\n", NAME); 88 printf("Syntax: %s [<options>] <host>\n", NAME); 89 printf("\t-n <count> Repeat the specified number of times\n"); 90 printf("\t-r Repeat forever\n"); 91 printf("\t-4|-6 Use IPv4 or IPv6 destination host address\n"); 90 92 } 91 93 … … 108 110 static int ping_ev_recv(inetping_sdu_t *sdu) 109 111 { 110 inet_addr_t src_addr;111 inet_addr_set(sdu->src, &src_addr);112 113 inet_addr_t dest_addr;114 inet_addr_set(sdu->dest, &dest_addr);115 116 112 char *asrc; 117 113 int rc = inet_addr_format(&src_addr, &asrc); … … 140 136 inetping_sdu_t sdu; 141 137 142 sdu.src = src ;143 sdu.dest = dest ;138 sdu.src = src_addr; 139 sdu.dest = dest_addr; 144 140 sdu.seq_no = seq_no; 145 141 sdu.data = (void *) "foo"; … … 222 218 char *adest = NULL; 223 219 char *sdest = NULL; 220 ip_ver_t ip_ver = ip_any; 224 221 225 222 int rc = inetping_init(&ev_ops); … … 244 241 } 245 242 break; 243 case '4': 244 ip_ver = ip_v4; 245 break; 246 case '6': 247 ip_ver = ip_v6; 248 break; 246 249 default: 247 250 printf("Unknown option passed.\n"); … … 258 261 259 262 /* Parse destination address */ 260 inet_addr_t dest_addr;261 263 rc = inet_addr_parse(argv[optind], &dest_addr); 262 264 if (rc != EOK) { 263 265 /* Try interpreting as a host name */ 264 rc = dnsr_name2host(argv[optind], &hinfo, AF_INET);266 rc = dnsr_name2host(argv[optind], &hinfo, ip_ver); 265 267 if (rc != EOK) { 266 268 printf("Error resolving host '%s'.\n", argv[optind]); … … 271 273 } 272 274 273 uint16_t af = inet_addr_get(&dest_addr, &dest, NULL);274 if (af != AF_INET) {275 printf("Destination '%s' is not an IPv4 address.\n",276 argv[optind]);277 goto error;278 }279 280 275 /* Determine source address */ 281 rc = inetping_get_srcaddr( dest, &src);276 rc = inetping_get_srcaddr(&dest_addr, &src_addr); 282 277 if (rc != EOK) { 283 278 printf("Failed determining source address.\n"); 284 279 goto error; 285 280 } 286 287 inet_addr_t src_addr;288 inet_addr_set(src, &src_addr);289 281 290 282 rc = inet_addr_format(&src_addr, &asrc); -
uspace/lib/c/Makefile
r408424e rc42f50d 77 77 generic/device/pci.c \ 78 78 generic/device/ahci.c \ 79 generic/dhcp.c \ 79 80 generic/dnsr.c \ 80 81 generic/dlfcn.c \ … … 99 100 generic/inetcfg.c \ 100 101 generic/inetping.c \ 101 generic/inetping6.c \102 102 generic/io/asprintf.c \ 103 103 generic/io/input.c \ -
uspace/lib/c/generic/dnsr.c
r408424e rc42f50d 67 67 } 68 68 69 int dnsr_name2host(const char *name, dnsr_hostinfo_t **rinfo, uint16_t af)69 int dnsr_name2host(const char *name, dnsr_hostinfo_t **rinfo, ip_ver_t ver) 70 70 { 71 71 dnsr_hostinfo_t *info = calloc(1, sizeof(dnsr_hostinfo_t)); … … 76 76 77 77 ipc_call_t answer; 78 aid_t req = async_send_1(exch, DNSR_NAME2HOST, (sysarg_t) af,78 aid_t req = async_send_1(exch, DNSR_NAME2HOST, (sysarg_t) ver, 79 79 &answer); 80 80 -
uspace/lib/c/generic/inet.c
r408424e rc42f50d 30 30 #include <assert.h> 31 31 #include <errno.h> 32 #include <net/socket_codes.h>33 32 #include <inet/inet.h> 34 33 #include <ipc/inet.h> -
uspace/lib/c/generic/inet/addr.c
r408424e rc42f50d 33 33 */ 34 34 35 #include <assert.h> 35 36 #include <errno.h> 36 37 #include <unistd.h> … … 59 60 60 61 static const inet_addr_t inet_addr_any_addr = { 61 . family = AF_INET,62 .version = ip_v4, 62 63 .addr = 0 63 64 }; 64 65 65 66 static const inet_addr_t inet_addr_any_addr6 = { 66 . family = AF_INET6,67 .version = ip_v6, 67 68 .addr6 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} 68 69 }; … … 78 79 } 79 80 81 /** Compare addr48. 82 * 83 * @return Non-zero if equal, zero if not equal. 84 */ 80 85 int addr48_compare(const addr48_t a, const addr48_t b) 81 86 { 82 return memcmp(a, b, 6); 83 } 84 87 return memcmp(a, b, 6) == 0; 88 } 89 90 /** Compare addr128. 91 * 92 * @return Non-zero if equal, zero if not equal. 93 */ 85 94 int addr128_compare(const addr128_t a, const addr128_t b) 86 95 { 87 return memcmp(a, b, 16) ;96 return memcmp(a, b, 16) == 0; 88 97 } 89 98 … … 102 111 void host2addr128_t_be(const addr128_t host, addr128_t be) 103 112 { 104 #ifdef __BE__105 113 memcpy(be, host, 16); 106 #else107 be[0] = host[15];108 be[1] = host[14];109 be[2] = host[13];110 be[3] = host[12];111 be[4] = host[11];112 be[5] = host[10];113 be[6] = host[9];114 be[7] = host[8];115 be[8] = host[7];116 be[9] = host[6];117 be[10] = host[5];118 be[11] = host[4];119 be[12] = host[3];120 be[13] = host[2];121 be[14] = host[1];122 be[15] = host[0];123 #endif124 114 } 125 115 126 116 void addr128_t_be2host(const addr128_t be, addr128_t host) 127 117 { 128 #ifdef __BE__129 118 memcpy(host, be, 16); 130 #else131 host[0] = be[15];132 host[1] = be[14];133 host[2] = be[13];134 host[3] = be[12];135 host[4] = be[11];136 host[5] = be[10];137 host[6] = be[9];138 host[7] = be[8];139 host[8] = be[7];140 host[9] = be[6];141 host[10] = be[5];142 host[11] = be[4];143 host[12] = be[3];144 host[13] = be[2];145 host[14] = be[1];146 host[15] = be[0];147 #endif148 119 } 149 120 150 121 void inet_addr(inet_addr_t *addr, uint8_t a, uint8_t b, uint8_t c, uint8_t d) 151 122 { 152 addr-> family = AF_INET;123 addr->version = ip_v4; 153 124 addr->addr = ((addr32_t) a << 24) | ((addr32_t) b << 16) | 154 125 ((addr32_t) c << 8) | ((addr32_t) d); … … 158 129 uint8_t prefix) 159 130 { 160 naddr-> family = AF_INET;131 naddr->version = ip_v4; 161 132 naddr->addr = ((addr32_t) a << 24) | ((addr32_t) b << 16) | 162 133 ((addr32_t) c << 8) | ((addr32_t) d); … … 167 138 uint16_t d, uint16_t e, uint16_t f, uint16_t g, uint16_t h) 168 139 { 169 addr-> family = AF_INET6;140 addr->version = ip_v6; 170 141 addr->addr6[0] = (a >> 8) & 0xff; 171 142 addr->addr6[1] = a & 0xff; … … 189 160 uint16_t d, uint16_t e, uint16_t f, uint16_t g, uint16_t h, uint8_t prefix) 190 161 { 191 naddr-> family = AF_INET6;162 naddr->version = ip_v6; 192 163 naddr->addr6[0] = (a >> 8) & 0xff; 193 164 naddr->addr6[1] = a & 0xff; … … 209 180 } 210 181 211 /** Parse network address family.212 * 213 * @param text Network address in common notation.214 * @param af Place to store network address family.182 /** Determine address version. 183 * 184 * @param text Address in common notation. 185 * @param af Place to store address version. 215 186 * 216 187 * @return EOK on success, EINVAL if input is not in valid format. 217 188 * 218 189 */ 219 int inet_addr_family(const char *text, uint16_t *af)190 static int inet_addr_version(const char *text, ip_ver_t *ver) 220 191 { 221 192 char *dot = str_chr(text, '.'); 222 193 if (dot != NULL) { 223 * af = AF_INET;194 *ver = ip_v4; 224 195 return EOK; 225 196 } 226 197 227 198 char *collon = str_chr(text, ':'); 228 199 if (collon != NULL) { 229 * af = AF_INET6;200 *ver = ip_v6; 230 201 return EOK; 231 202 } 232 203 233 204 return EINVAL; 234 205 } 235 206 207 static int ipver_af(ip_ver_t ver) 208 { 209 switch (ver) { 210 case ip_any: 211 return AF_NONE; 212 case ip_v4: 213 return AF_INET; 214 case ip_v6: 215 return AF_INET6; 216 default: 217 assert(false); 218 return EINVAL; 219 } 220 } 221 222 ip_ver_t ipver_from_af(int af) 223 { 224 switch (af) { 225 case AF_NONE: 226 return ip_any; 227 case AF_INET: 228 return ip_v4; 229 case AF_INET6: 230 return ip_v6; 231 default: 232 assert(false); 233 return EINVAL; 234 } 235 } 236 236 237 void inet_naddr_addr(const inet_naddr_t *naddr, inet_addr_t *addr) 237 238 { 238 addr-> family = naddr->family;239 addr->version = naddr->version; 239 240 memcpy(addr->addr6, naddr->addr6, 16); 240 241 } … … 243 244 inet_naddr_t *naddr) 244 245 { 245 naddr-> family = addr->family;246 naddr->version = addr->version; 246 247 memcpy(naddr->addr6, addr->addr6, 16); 247 248 naddr->prefix = prefix; … … 250 251 void inet_addr_any(inet_addr_t *addr) 251 252 { 252 addr-> family = AF_NONE;253 addr->version = ip_any; 253 254 memset(addr->addr6, 0, 16); 254 255 } … … 256 257 void inet_naddr_any(inet_naddr_t *naddr) 257 258 { 258 naddr-> family = AF_NONE;259 naddr->version = ip_any; 259 260 memset(naddr->addr6, 0, 16); 260 261 naddr->prefix = 0; … … 263 264 int inet_addr_compare(const inet_addr_t *a, const inet_addr_t *b) 264 265 { 265 if (a-> family != b->family)266 if (a->version != b->version) 266 267 return 0; 267 268 switch (a-> family) {269 case AF_INET:268 269 switch (a->version) { 270 case ip_v4: 270 271 return (a->addr == b->addr); 271 case AF_INET6:272 case ip_v6: 272 273 return addr128_compare(a->addr6, b->addr6); 273 274 default: … … 278 279 int inet_addr_is_any(const inet_addr_t *addr) 279 280 { 280 return ((addr-> family == 0) ||281 return ((addr->version == ip_any) || 281 282 (inet_addr_compare(addr, &inet_addr_any_addr)) || 282 283 (inet_addr_compare(addr, &inet_addr_any_addr6))); … … 285 286 int inet_naddr_compare(const inet_naddr_t *naddr, const inet_addr_t *addr) 286 287 { 287 if (naddr-> family != addr->family)288 if (naddr->version != addr->version) 288 289 return 0; 289 290 290 switch (naddr-> family) {291 case AF_INET:291 switch (naddr->version) { 292 case ip_v4: 292 293 return (naddr->addr == addr->addr); 293 case AF_INET6:294 case ip_v6: 294 295 return addr128_compare(naddr->addr6, addr->addr6); 295 296 default: … … 300 301 int inet_naddr_compare_mask(const inet_naddr_t *naddr, const inet_addr_t *addr) 301 302 { 302 if (naddr-> family != addr->family)303 if (naddr->version != addr->version) 303 304 return 0; 304 305 switch (naddr-> family) {306 case AF_INET:305 306 switch (naddr->version) { 307 case ip_v4: 307 308 if (naddr->prefix > 32) 308 309 return 0; 309 310 310 311 addr32_t mask = 311 312 BIT_RANGE(addr32_t, 31, 31 - (naddr->prefix - 1)); 312 313 return ((naddr->addr & mask) == (addr->addr & mask)); 313 case AF_INET6:314 case ip_v6: 314 315 if (naddr->prefix > 128) 315 316 return 0; … … 352 353 int inet_addr_parse(const char *text, inet_addr_t *addr) 353 354 { 354 int rc = inet_addr_ family(text, &addr->family);355 int rc = inet_addr_version(text, &addr->version); 355 356 if (rc != EOK) 356 357 return rc; 357 358 358 359 uint8_t buf[16]; 359 rc = inet_pton( addr->family, text, buf);360 rc = inet_pton(ipver_af(addr->version), text, buf); 360 361 if (rc != EOK) 361 362 return rc; 362 363 363 switch (addr-> family) {364 case AF_INET:364 switch (addr->version) { 365 case ip_v4: 365 366 addr->addr = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | 366 367 buf[3]; 367 368 break; 368 case AF_INET6:369 case ip_v6: 369 370 memcpy(addr->addr6, buf, 16); 370 371 break; … … 392 393 *slash = 0; 393 394 394 int rc = inet_addr_ family(text, &naddr->family);395 int rc = inet_addr_version(text, &naddr->version); 395 396 if (rc != EOK) 396 397 return rc; 397 398 398 399 uint8_t buf[16]; 399 rc = inet_pton( naddr->family, text, buf);400 rc = inet_pton(ipver_af(naddr->version), text, buf); 400 401 *slash = '/'; 401 402 … … 406 407 uint8_t prefix; 407 408 408 switch (naddr-> family) {409 case AF_INET:409 switch (naddr->version) { 410 case ip_v4: 410 411 prefix = strtoul(slash, &slash, 10); 411 412 if (prefix > 32) … … 417 418 418 419 break; 419 case AF_INET6:420 case ip_v6: 420 421 prefix = strtoul(slash, &slash, 10); 421 422 if (prefix > 128) … … 447 448 int rc = 0; 448 449 449 switch (addr-> family) {450 case AF_NONE:450 switch (addr->version) { 451 case ip_any: 451 452 rc = asprintf(bufp, "none"); 452 453 break; 453 case AF_INET:454 case ip_v4: 454 455 rc = asprintf(bufp, "%u.%u.%u.%u", (addr->addr >> 24) & 0xff, 455 456 (addr->addr >> 16) & 0xff, (addr->addr >> 8) & 0xff, 456 457 addr->addr & 0xff); 457 458 break; 458 case AF_INET6:459 case ip_v6: 459 460 *bufp = (char *) malloc(INET6_ADDRSTRLEN); 460 461 if (*bufp == NULL) … … 487 488 char prefix[INET_PREFIXSTRSIZE]; 488 489 489 switch (naddr-> family) {490 case AF_NONE:490 switch (naddr->version) { 491 case ip_any: 491 492 rc = asprintf(bufp, "none"); 492 493 break; 493 case AF_INET:494 case ip_v4: 494 495 rc = asprintf(bufp, "%" PRIu8 ".%" PRIu8 ".%" PRIu8 ".%" PRIu8 495 496 "/%" PRIu8, (naddr->addr >> 24) & 0xff, … … 497 498 naddr->addr & 0xff, naddr->prefix); 498 499 break; 499 case AF_INET6:500 case ip_v6: 500 501 *bufp = (char *) malloc(INET6_ADDRSTRLEN + INET_PREFIXSTRSIZE); 501 502 if (*bufp == NULL) … … 529 530 } 530 531 531 uint16_t inet_addr_get(const inet_addr_t *addr, addr32_t *v4, addr128_t *v6)532 { 533 switch (addr-> family) {534 case AF_INET:532 ip_ver_t inet_addr_get(const inet_addr_t *addr, addr32_t *v4, addr128_t *v6) 533 { 534 switch (addr->version) { 535 case ip_v4: 535 536 if (v4 != NULL) 536 537 *v4 = addr->addr; 537 538 break; 539 case AF_INET6: 538 break; 539 case ip_v6: 540 540 if (v6 != NULL) 541 541 memcpy(*v6, addr->addr6, 16); 542 543 break; 544 } 545 546 return addr->family; 547 } 548 549 uint16_t inet_naddr_get(const inet_naddr_t *naddr, addr32_t *v4, addr128_t *v6, 542 break; 543 default: 544 assert(false); 545 break; 546 } 547 548 return addr->version; 549 } 550 551 ip_ver_t inet_naddr_get(const inet_naddr_t *naddr, addr32_t *v4, addr128_t *v6, 550 552 uint8_t *prefix) 551 553 { 552 switch (naddr-> family) {553 case AF_INET:554 switch (naddr->version) { 555 case ip_v4: 554 556 if (v4 != NULL) 555 557 *v4 = naddr->addr; 556 557 558 if (prefix != NULL) 558 559 *prefix = naddr->prefix; 559 560 break; 561 case AF_INET6: 560 break; 561 case ip_v6: 562 562 if (v6 != NULL) 563 563 memcpy(*v6, naddr->addr6, 16); 564 565 564 if (prefix != NULL) 566 565 *prefix = naddr->prefix; 567 568 break; 569 } 570 571 return naddr->family; 566 break; 567 default: 568 assert(false); 569 break; 570 } 571 572 return naddr->version; 572 573 } 573 574 574 575 void inet_addr_set(addr32_t v4, inet_addr_t *addr) 575 576 { 576 addr-> family = AF_INET;577 addr->version = ip_v4; 577 578 addr->addr = v4; 578 579 } … … 580 581 void inet_naddr_set(addr32_t v4, uint8_t prefix, inet_naddr_t *naddr) 581 582 { 582 naddr-> family = AF_INET;583 naddr->version = ip_v4; 583 584 naddr->addr = v4; 584 585 naddr->prefix = prefix; … … 587 588 void inet_sockaddr_in_addr(const sockaddr_in_t *sockaddr_in, inet_addr_t *addr) 588 589 { 589 addr-> family = AF_INET;590 addr->version = ip_v4; 590 591 addr->addr = uint32_t_be2host(sockaddr_in->sin_addr.s_addr); 591 592 } … … 593 594 void inet_addr_set6(addr128_t v6, inet_addr_t *addr) 594 595 { 595 addr-> family = AF_INET6;596 addr->version = ip_v6; 596 597 memcpy(addr->addr6, v6, 16); 597 598 } … … 599 600 void inet_naddr_set6(addr128_t v6, uint8_t prefix, inet_naddr_t *naddr) 600 601 { 601 naddr-> family = AF_INET6;602 naddr->version = ip_v6; 602 603 memcpy(naddr->addr6, v6, 16); 603 604 naddr->prefix = prefix; … … 607 608 inet_addr_t *addr) 608 609 { 609 addr-> family = AF_INET6;610 addr->version = ip_v6; 610 611 addr128_t_be2host(sockaddr_in6->sin6_addr.s6_addr, addr->addr6); 611 612 } … … 614 615 sockaddr_in_t *sockaddr_in, sockaddr_in6_t *sockaddr_in6) 615 616 { 616 switch (addr-> family) {617 case AF_INET:617 switch (addr->version) { 618 case ip_v4: 618 619 if (sockaddr_in != NULL) { 619 620 sockaddr_in->sin_family = AF_INET; 620 621 sockaddr_in->sin_addr.s_addr = host2uint32_t_be(addr->addr); 621 622 } 622 623 break; 624 case AF_INET6: 623 break; 624 case ip_v6: 625 625 if (sockaddr_in6 != NULL) { 626 626 sockaddr_in6->sin6_family = AF_INET6; 627 627 host2addr128_t_be(addr->addr6, sockaddr_in6->sin6_addr.s6_addr); 628 628 } 629 630 break; 631 } 632 633 return addr->family; 629 break; 630 default: 631 assert(false); 632 break; 633 } 634 635 return ipver_af(addr->version); 636 } 637 638 int inet_addr_sockaddr(const inet_addr_t *addr, uint16_t port, 639 sockaddr_t **nsockaddr, socklen_t *naddrlen) 640 { 641 sockaddr_in_t *sa4; 642 sockaddr_in6_t *sa6; 643 644 switch (addr->version) { 645 case ip_v4: 646 sa4 = calloc(1, sizeof(sockaddr_in_t)); 647 if (sa4 == NULL) 648 return ENOMEM; 649 650 sa4->sin_family = AF_INET; 651 sa4->sin_port = host2uint16_t_be(port); 652 sa4->sin_addr.s_addr = host2uint32_t_be(addr->addr); 653 if (nsockaddr != NULL) 654 *nsockaddr = (sockaddr_t *)sa4; 655 if (naddrlen != NULL) 656 *naddrlen = sizeof(*sa4); 657 break; 658 case ip_v6: 659 sa6 = calloc(1, sizeof(sockaddr_in6_t)); 660 if (sa6 == NULL) 661 return ENOMEM; 662 663 sa6->sin6_family = AF_INET6; 664 sa6->sin6_port = host2uint16_t_be(port); 665 host2addr128_t_be(addr->addr6, sa6->sin6_addr.s6_addr); 666 if (nsockaddr != NULL) 667 *nsockaddr = (sockaddr_t *)sa6; 668 if (naddrlen != NULL) 669 *naddrlen = sizeof(*sa6); 670 break; 671 default: 672 assert(false); 673 break; 674 } 675 676 return EOK; 634 677 } 635 678 -
uspace/lib/c/generic/inetcfg.c
r408424e rc42f50d 267 267 } 268 268 269 int inetcfg_link_add(sysarg_t link_id) 270 { 271 async_exch_t *exch = async_exchange_begin(inetcfg_sess); 272 273 int rc = async_req_1_0(exch, INETCFG_LINK_ADD, link_id); 274 async_exchange_end(exch); 275 276 return rc; 277 } 278 269 279 int inetcfg_link_get(sysarg_t link_id, inet_link_info_t *linfo) 270 280 { … … 305 315 } 306 316 317 int inetcfg_link_remove(sysarg_t link_id) 318 { 319 async_exch_t *exch = async_exchange_begin(inetcfg_sess); 320 321 int rc = async_req_1_0(exch, INETCFG_LINK_REMOVE, link_id); 322 async_exchange_end(exch); 323 324 return rc; 325 } 326 307 327 int inetcfg_sroute_create(const char *name, inet_naddr_t *dest, 308 328 inet_addr_t *router, sysarg_t *sroute_id) -
uspace/lib/c/generic/inetping.c
r408424e rc42f50d 1 1 /* 2 * Copyright (c) 2012 Jiri Svoboda 2 * Copyright (c) 2013 Jiri Svoboda 3 * Copyright (c) 2013 Martin Decky 3 4 * All rights reserved. 4 5 * … … 49 50 50 51 assert(inetping_sess == NULL); 51 52 52 53 inetping_ev_ops = ev_ops; 53 54 54 55 rc = loc_service_get_id(SERVICE_NAME_INETPING, &inetping_svc, 55 56 IPC_FLAG_BLOCKING); 56 57 if (rc != EOK) 57 58 return ENOENT; 58 59 59 60 inetping_sess = loc_service_connect(EXCHANGE_SERIALIZE, inetping_svc, 60 61 IPC_FLAG_BLOCKING); 61 62 if (inetping_sess == NULL) 62 63 return ENOENT; 63 64 64 65 async_exch_t *exch = async_exchange_begin(inetping_sess); 65 66 66 67 rc = async_connect_to_me(exch, 0, 0, 0, inetping_cb_conn, NULL); 67 68 async_exchange_end(exch); 68 69 69 70 if (rc != EOK) { 70 71 async_hangup(inetping_sess); … … 72 73 return rc; 73 74 } 74 75 75 76 return EOK; 76 77 } … … 79 80 { 80 81 async_exch_t *exch = async_exchange_begin(inetping_sess); 81 82 82 83 ipc_call_t answer; 83 aid_t req = async_send_3(exch, INETPING_SEND, (sysarg_t) sdu->src, 84 (sysarg_t) sdu->dest, sdu->seq_no, &answer); 85 sysarg_t retval = async_data_write_start(exch, sdu->data, sdu->size); 86 84 aid_t req = async_send_1(exch, INETPING_SEND, sdu->seq_no, &answer); 85 86 int rc = async_data_write_start(exch, &sdu->src, sizeof(sdu->src)); 87 if (rc != EOK) { 88 async_exchange_end(exch); 89 async_forget(req); 90 return rc; 91 } 92 93 rc = async_data_write_start(exch, &sdu->dest, sizeof(sdu->dest)); 94 if (rc != EOK) { 95 async_exchange_end(exch); 96 async_forget(req); 97 return rc; 98 } 99 100 rc = async_data_write_start(exch, sdu->data, sdu->size); 101 87 102 async_exchange_end(exch); 88 89 if (retval != EOK) { 90 async_forget(req); 91 return retval; 92 } 93 103 104 if (rc != EOK) { 105 async_forget(req); 106 return rc; 107 } 108 109 sysarg_t retval; 94 110 async_wait_for(req, &retval); 95 return retval; 96 } 97 98 int inetping_get_srcaddr(uint32_t remote, uint32_t *local) 111 112 return (int) retval; 113 } 114 115 int inetping_get_srcaddr(const inet_addr_t *remote, inet_addr_t *local) 99 116 { 100 117 async_exch_t *exch = async_exchange_begin(inetping_sess); 101 102 sysarg_t local_addr; 103 int rc = async_req_1_1(exch, INETPING_GET_SRCADDR, (sysarg_t) remote, 104 &local_addr); 105 118 119 ipc_call_t answer; 120 aid_t req = async_send_0(exch, INETPING_GET_SRCADDR, &answer); 121 122 int rc = async_data_write_start(exch, remote, sizeof(*remote)); 123 if (rc != EOK) { 124 async_exchange_end(exch); 125 async_forget(req); 126 return rc; 127 } 128 129 ipc_call_t answer_local; 130 aid_t req_local = async_data_read(exch, local, sizeof(*local), 131 &answer_local); 132 106 133 async_exchange_end(exch); 107 108 if (rc != EOK) 109 return rc; 110 111 *local = (uint32_t) local_addr; 112 return EOK; 113 } 114 115 static void inetping_ev_recv(ipc_callid_t callid, ipc_call_t *call) 134 135 sysarg_t retval_local; 136 async_wait_for(req_local, &retval_local); 137 138 if (retval_local != EOK) { 139 async_forget(req); 140 return (int) retval_local; 141 } 142 143 sysarg_t retval; 144 async_wait_for(req, &retval); 145 146 return (int) retval; 147 } 148 149 static void inetping_ev_recv(ipc_callid_t iid, ipc_call_t *icall) 116 150 { 117 151 inetping_sdu_t sdu; 118 119 sdu.src = IPC_GET_ARG1(*call); 120 sdu.dest = IPC_GET_ARG2(*call); 121 sdu.seq_no = IPC_GET_ARG3(*call); 122 123 int rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, &sdu.size); 152 153 sdu.seq_no = IPC_GET_ARG1(*icall); 154 155 ipc_callid_t callid; 156 size_t size; 157 if (!async_data_write_receive(&callid, &size)) { 158 async_answer_0(callid, EREFUSED); 159 async_answer_0(iid, EREFUSED); 160 return; 161 } 162 163 if (size != sizeof(sdu.src)) { 164 async_answer_0(callid, EINVAL); 165 async_answer_0(iid, EINVAL); 166 return; 167 } 168 169 int rc = async_data_write_finalize(callid, &sdu.src, size); 124 170 if (rc != EOK) { 125 171 async_answer_0(callid, rc); 126 return; 127 } 128 172 async_answer_0(iid, rc); 173 return; 174 } 175 176 if (!async_data_write_receive(&callid, &size)) { 177 async_answer_0(callid, EREFUSED); 178 async_answer_0(iid, EREFUSED); 179 return; 180 } 181 182 if (size != sizeof(sdu.dest)) { 183 async_answer_0(callid, EINVAL); 184 async_answer_0(iid, EINVAL); 185 return; 186 } 187 188 rc = async_data_write_finalize(callid, &sdu.dest, size); 189 if (rc != EOK) { 190 async_answer_0(callid, rc); 191 async_answer_0(iid, rc); 192 return; 193 } 194 195 rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, &sdu.size); 196 if (rc != EOK) { 197 async_answer_0(iid, rc); 198 return; 199 } 200 129 201 rc = inetping_ev_ops->recv(&sdu); 130 202 free(sdu.data); 131 async_answer_0( callid, rc);203 async_answer_0(iid, rc); 132 204 } 133 205 -
uspace/lib/c/generic/iplink.c
r408424e rc42f50d 218 218 iplink_recv_sdu_t sdu; 219 219 220 uint16_t af= IPC_GET_ARG1(*icall);220 ip_ver_t ver = IPC_GET_ARG1(*icall); 221 221 222 222 int rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, … … 227 227 } 228 228 229 rc = iplink->ev_ops->recv(iplink, &sdu, af);229 rc = iplink->ev_ops->recv(iplink, &sdu, ver); 230 230 free(sdu.data); 231 231 async_answer_0(iid, rc); -
uspace/lib/c/generic/iplink_srv.c
r408424e rc42f50d 272 272 } 273 273 274 int iplink_ev_recv(iplink_srv_t *srv, iplink_recv_sdu_t *sdu, uint16_t af) 274 /* XXX Version should be part of @a sdu */ 275 int iplink_ev_recv(iplink_srv_t *srv, iplink_recv_sdu_t *sdu, ip_ver_t ver) 275 276 { 276 277 if (srv->client_sess == NULL) … … 280 281 281 282 ipc_call_t answer; 282 aid_t req = async_send_1(exch, IPLINK_EV_RECV, (sysarg_t) af,283 aid_t req = async_send_1(exch, IPLINK_EV_RECV, (sysarg_t)ver, 283 284 &answer); 284 285 -
uspace/lib/c/generic/vfs/vfs.c
r408424e rc42f50d 342 342 } 343 343 344 ssize_t read(int fildes, void *buf, size_t nbyte) 344 ssize_t read(int fildes, void *buf, size_t nbyte) 345 345 { 346 346 sysarg_t rc; … … 348 348 aid_t req; 349 349 350 if (nbyte > DATA_XFER_LIMIT) 351 nbyte = DATA_XFER_LIMIT; 352 350 353 async_exch_t *exch = vfs_exchange_begin(); 351 354 352 355 req = async_send_1(exch, VFS_IN_READ, fildes, &answer); 353 rc = async_data_read_start(exch, (void *) buf, nbyte);356 rc = async_data_read_start(exch, (void *) buf, nbyte); 354 357 if (rc != EOK) { 355 358 vfs_exchange_end(exch); … … 377 380 aid_t req; 378 381 382 if (nbyte > DATA_XFER_LIMIT) 383 nbyte = DATA_XFER_LIMIT; 384 379 385 async_exch_t *exch = vfs_exchange_begin(); 380 386 381 387 req = async_send_1(exch, VFS_IN_WRITE, fildes, &answer); 382 rc = async_data_write_start(exch, (void *) buf, nbyte);388 rc = async_data_write_start(exch, (void *) buf, nbyte); 383 389 if (rc != EOK) { 384 390 vfs_exchange_end(exch); -
uspace/lib/c/include/inet/addr.h
r408424e rc42f50d 39 39 #include <net/in.h> 40 40 #include <net/in6.h> 41 #include <net/socket.h> 41 42 42 43 typedef uint32_t addr32_t; … … 44 45 typedef uint8_t addr128_t[16]; 45 46 47 typedef enum { 48 /** Any IP protocol version */ 49 ip_any, 50 /** IPv4 */ 51 ip_v4, 52 /** IPv6 */ 53 ip_v6 54 } ip_ver_t; 55 46 56 /** Node address */ 47 57 typedef struct { 48 uint16_t family; 58 /** IP version */ 59 ip_ver_t version; 49 60 union { 50 61 addr32_t addr; … … 55 66 /** Network address */ 56 67 typedef struct { 57 /** Address family*/58 uint16_t family;68 /** IP version */ 69 ip_ver_t version; 59 70 60 71 /** Address */ … … 91 102 uint16_t, uint16_t, uint16_t, uint16_t, uint8_t); 92 103 93 extern int inet_addr_family(const char *, uint16_t *);94 104 extern void inet_naddr_addr(const inet_naddr_t *, inet_addr_t *); 95 105 extern void inet_addr_naddr(const inet_addr_t *, uint8_t, inet_naddr_t *); … … 110 120 extern int inet_naddr_format(const inet_naddr_t *, char **); 111 121 112 extern uint16_t inet_addr_get(const inet_addr_t *, addr32_t *, addr128_t *);113 extern uint16_t inet_naddr_get(const inet_naddr_t *, addr32_t *, addr128_t *,122 extern ip_ver_t inet_addr_get(const inet_addr_t *, addr32_t *, addr128_t *); 123 extern ip_ver_t inet_naddr_get(const inet_naddr_t *, addr32_t *, addr128_t *, 114 124 uint8_t *); 115 125 … … 125 135 sockaddr_in6_t *); 126 136 137 extern ip_ver_t ipver_from_af(int af); 138 extern int inet_addr_sockaddr(const inet_addr_t *, uint16_t, sockaddr_t **, 139 socklen_t *); 140 127 141 #endif 128 142 -
uspace/lib/c/include/inet/dhcp.h
r408424e rc42f50d 1 1 /* 2 * Copyright (c) 20 09 Lukas Mejdrech2 * Copyright (c) 2013 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 30 30 * @{ 31 31 */ 32 33 32 /** @file 34 * Network device.35 33 */ 36 34 37 #ifndef LIBC_ NET_DEVICE_H_38 #define LIBC_ NET_DEVICE_H_35 #ifndef LIBC_INET_DHCP_H_ 36 #define LIBC_INET_DHCP_H_ 39 37 40 #include <adt/int_map.h> 41 #include <nic/nic.h> 38 #include <sys/types.h> 42 39 43 /** Device identifier to generic type map declaration. */ 44 #define DEVICE_MAP_DECLARE INT_MAP_DECLARE 45 46 /** Device identifier to generic type map implementation. */ 47 #define DEVICE_MAP_IMPLEMENT INT_MAP_IMPLEMENT 48 49 /** Device identifier type. */ 50 typedef int nic_device_id_t; 51 52 /** Invalid device identifier. */ 53 #define NIC_DEVICE_INVALID_ID (-1) 40 extern int dhcp_init(void); 41 extern int dhcp_link_add(sysarg_t); 42 extern int dhcp_link_remove(sysarg_t); 54 43 55 44 #endif -
uspace/lib/c/include/inet/dnsr.h
r408424e rc42f50d 51 51 52 52 extern int dnsr_init(void); 53 extern int dnsr_name2host(const char *, dnsr_hostinfo_t **, uint16_t);53 extern int dnsr_name2host(const char *, dnsr_hostinfo_t **, ip_ver_t); 54 54 extern void dnsr_hostinfo_destroy(dnsr_hostinfo_t *); 55 55 extern int dnsr_get_srvaddr(inet_addr_t *); -
uspace/lib/c/include/inet/inetcfg.h
r408424e rc42f50d 48 48 extern int inetcfg_get_link_list(sysarg_t **, size_t *); 49 49 extern int inetcfg_get_sroute_list(sysarg_t **, size_t *); 50 extern int inetcfg_link_add(sysarg_t); 50 51 extern int inetcfg_link_get(sysarg_t, inet_link_info_t *); 52 extern int inetcfg_link_remove(sysarg_t); 51 53 extern int inetcfg_sroute_get(sysarg_t, inet_sroute_info_t *); 52 54 extern int inetcfg_sroute_get_id(const char *, sysarg_t *); -
uspace/lib/c/include/inet/inetping.h
r408424e rc42f50d 1 1 /* 2 * Copyright (c) 201 2Jiri Svoboda2 * Copyright (c) 2013 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 38 38 #include <inet/inet.h> 39 39 #include <sys/types.h> 40 41 typedef struct { 42 uint32_t src; 43 uint32_t dest; 44 uint16_t seq_no; 45 void *data; 46 size_t size; 47 } inetping_sdu_t; 40 #include <types/inetping.h> 48 41 49 42 typedef struct inetping_ev_ops { … … 53 46 extern int inetping_init(inetping_ev_ops_t *); 54 47 extern int inetping_send(inetping_sdu_t *); 55 extern int inetping_get_srcaddr( uint32_t, uint32_t *);48 extern int inetping_get_srcaddr(const inet_addr_t *, inet_addr_t *); 56 49 57 50 #endif -
uspace/lib/c/include/inet/iplink.h
r408424e rc42f50d 37 37 38 38 #include <async.h> 39 #include <sys/types.h>40 39 #include <inet/addr.h> 41 40 … … 78 77 79 78 typedef struct iplink_ev_ops { 80 int (*recv)(iplink_t *, iplink_recv_sdu_t *, uint16_t);79 int (*recv)(iplink_t *, iplink_recv_sdu_t *, ip_ver_t); 81 80 } iplink_ev_ops_t; 82 81 -
uspace/lib/c/include/inet/iplink_srv.h
r408424e rc42f50d 39 39 #include <fibril_synch.h> 40 40 #include <stdbool.h> 41 #include <sys/types.h>42 41 #include <inet/addr.h> 43 42 #include <inet/iplink.h> … … 67 66 68 67 extern int iplink_conn(ipc_callid_t, ipc_call_t *, void *); 69 extern int iplink_ev_recv(iplink_srv_t *, iplink_recv_sdu_t *, uint16_t);68 extern int iplink_ev_recv(iplink_srv_t *, iplink_recv_sdu_t *, ip_ver_t); 70 69 71 70 #endif -
uspace/lib/c/include/ipc/inet.h
r408424e rc42f50d 72 72 INETCFG_GET_LINK_LIST, 73 73 INETCFG_GET_SROUTE_LIST, 74 INETCFG_LINK_ADD, 74 75 INETCFG_LINK_GET, 76 INETCFG_LINK_REMOVE, 75 77 INETCFG_SROUTE_CREATE, 76 78 INETCFG_SROUTE_DELETE, … … 90 92 } inetping_request_t; 91 93 92 /** Events on Inet ping6 port */93 typedef enum {94 INETPING6_EV_RECV = IPC_FIRST_USER_METHOD95 } inetping6_event_t;96 97 /** Requests on Inet ping6 port */98 typedef enum {99 INETPING6_SEND = IPC_FIRST_USER_METHOD,100 INETPING6_GET_SRCADDR101 } inetping6_request_t;102 103 94 #endif 104 95 -
uspace/lib/c/include/ipc/services.h
r408424e rc42f50d 54 54 55 55 #define SERVICE_NAME_CORECFG "corecfg" 56 #define SERVICE_NAME_DHCP "net/dhcp" 56 57 #define SERVICE_NAME_DNSR "net/dnsr" 57 58 #define SERVICE_NAME_INET "net/inet" … … 59 60 #define SERVICE_NAME_INETPING "net/inetping" 60 61 #define SERVICE_NAME_INETPING6 "net/inetping6" 62 #define SERVICE_NAME_NETCONF "net/netconf" 61 63 62 64 #endif -
uspace/lib/c/include/types/inetping.h
r408424e rc42f50d 1 1 /* 2 * Copyright (c) 2013 Martin Decky2 * Copyright (c) 2013 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 30 30 * @{ 31 31 */ 32 /** @file 32 /** 33 * @file 34 * @brief 33 35 */ 34 36 35 #ifndef LIBC_ INET_INETPING6_H_36 #define LIBC_ INET_INETPING6_H_37 #ifndef LIBC_TYPES_INETPING_H_ 38 #define LIBC_TYPES_INETPING_H_ 37 39 38 #include <inet/ inet.h>40 #include <inet/addr.h> 39 41 #include <sys/types.h> 40 42 41 43 typedef struct { 42 addr128_t src;43 addr128_t dest;44 inet_addr_t src; 45 inet_addr_t dest; 44 46 uint16_t seq_no; 45 47 void *data; 46 48 size_t size; 47 } inetping6_sdu_t; 48 49 typedef struct inetping6_ev_ops { 50 int (*recv)(inetping6_sdu_t *); 51 } inetping6_ev_ops_t; 52 53 extern int inetping6_init(inetping6_ev_ops_t *); 54 extern int inetping6_send(inetping6_sdu_t *); 55 extern int inetping6_get_srcaddr(addr128_t, addr128_t); 49 } inetping_sdu_t; 56 50 57 51 #endif -
uspace/lib/gui/canvas.c
r408424e rc42f50d 105 105 static void canvas_handle_keyboard_event(widget_t *widget, kbd_event_t event) 106 106 { 107 /* No-op */ 107 canvas_t *canvas = (canvas_t *) widget; 108 109 sig_send(&canvas->keyboard_event, &event); 108 110 } 109 111 … … 142 144 } 143 145 146 bool update_canvas(canvas_t *canvas, surface_t *surface) 147 { 148 if (surface != NULL) 149 canvas->surface = surface; 150 151 canvas_repaint(&canvas->widget); 152 return true; 153 } 154 144 155 canvas_t *create_canvas(widget_t *parent, sysarg_t width, sysarg_t height, 145 156 surface_t *surface) -
uspace/lib/gui/canvas.h
r408424e rc42f50d 42 42 #include <surface.h> 43 43 #include "widget.h" 44 #include "connection.h" 44 45 45 46 typedef struct { … … 48 49 sysarg_t height; 49 50 surface_t *surface; 51 signal_t keyboard_event; 50 52 } canvas_t; 51 53 … … 53 55 surface_t *); 54 56 extern canvas_t *create_canvas(widget_t *, sysarg_t, sysarg_t, surface_t *); 57 extern bool update_canvas(canvas_t *, surface_t *); 55 58 extern void deinit_canvas(canvas_t *); 56 59 -
uspace/lib/http/src/http.c
r408424e rc42f50d 86 86 /* Interpret as a host name */ 87 87 dnsr_hostinfo_t *hinfo = NULL; 88 rc = dnsr_name2host(http->host, &hinfo, AF_NONE);88 rc = dnsr_name2host(http->host, &hinfo, ip_any); 89 89 90 90 if (rc != EOK) … … 95 95 } 96 96 97 struct sockaddr_in addr; 98 struct sockaddr_in6 addr6; 99 uint16_t af = inet_addr_sockaddr_in(&http->addr, &addr, &addr6); 97 struct sockaddr *saddr; 98 socklen_t saddrlen; 100 99 101 http->conn_sd = socket(PF_INET, SOCK_STREAM, 0); 100 rc = inet_addr_sockaddr(&http->addr, http->port, &saddr, &saddrlen); 101 if (rc != EOK) { 102 assert(rc == ENOMEM); 103 return ENOMEM; 104 } 105 106 http->conn_sd = socket(saddr->sa_family, SOCK_STREAM, 0); 102 107 if (http->conn_sd < 0) 103 108 return http->conn_sd; 104 109 105 switch (af) { 106 case AF_INET: 107 addr.sin_port = htons(http->port); 108 rc = connect(http->conn_sd, (struct sockaddr *) &addr, sizeof(addr)); 109 break; 110 case AF_INET6: 111 addr6.sin6_port = htons(http->port); 112 rc = connect(http->conn_sd, (struct sockaddr *) &addr6, sizeof(addr6)); 113 break; 114 default: 115 return ENOTSUP; 116 } 110 rc = connect(http->conn_sd, saddr, saddrlen); 111 free(saddr); 117 112 118 113 return rc; -
uspace/lib/net/include/socket_core.h
r408424e rc42f50d 43 43 #include <adt/int_map.h> 44 44 #include <net/in.h> 45 #include <net/device.h>46 45 #include <async.h> 47 46 -
uspace/srv/net/dhcp/Makefile
r408424e rc42f50d 31 31 32 32 SOURCES = \ 33 dhcp.c 33 dhcp.c \ 34 main.c \ 35 transport.c 34 36 35 37 include $(USPACE_PREFIX)/Makefile.common -
uspace/srv/net/dhcp/dhcp.c
r408424e rc42f50d 35 35 */ 36 36 37 #include <adt/list.h> 37 38 #include <bitops.h> 39 #include <errno.h> 40 #include <fibril_synch.h> 38 41 #include <inet/addr.h> 39 42 #include <inet/dnsr.h> 40 43 #include <inet/inetcfg.h> 44 #include <io/log.h> 41 45 #include <loc.h> 42 #include <net/in.h>43 #include <net/inet.h>44 #include <net/socket.h>45 46 #include <stdio.h> 46 47 #include <stdlib.h> 47 48 49 #include "dhcp.h" 48 50 #include "dhcp_std.h" 49 50 #define NAME "dhcp" 51 #include "transport.h" 52 53 enum { 54 /** In microseconds */ 55 dhcp_discover_timeout_val = 5 * 1000 * 1000, 56 /** In microseconds */ 57 dhcp_request_timeout_val = 1 * 1000 * 1000, 58 dhcp_discover_retries = 5, 59 dhcp_request_retries = 3 60 }; 51 61 52 62 #define MAX_MSG_SIZE 1024 53 54 static int transport_fd = -1;55 static inet_link_info_t link_info;56 63 static uint8_t msgbuf[MAX_MSG_SIZE]; 64 65 /** List of registered links (of dhcp_link_t) */ 66 static list_t dhcp_links; 67 68 static void dhcpsrv_discover_timeout(void *); 69 static void dhcpsrv_request_timeout(void *); 70 71 typedef enum { 72 ds_bound, 73 ds_fail, 74 ds_init, 75 ds_init_reboot, 76 ds_rebinding, 77 ds_renewing, 78 ds_requesting, 79 ds_selecting 80 } dhcp_state_t; 57 81 58 82 typedef struct { … … 69 93 } dhcp_offer_t; 70 94 95 typedef struct { 96 /** Link to dhcp_links list */ 97 link_t links; 98 /** Link service ID */ 99 service_id_t link_id; 100 /** Link info */ 101 inet_link_info_t link_info; 102 /** Transport */ 103 dhcp_transport_t dt; 104 /** Transport timeout */ 105 fibril_timer_t *timeout; 106 /** Number of retries */ 107 int retries_left; 108 /** Link state */ 109 dhcp_state_t state; 110 /** Last received offer */ 111 dhcp_offer_t offer; 112 } dhcp_link_t; 113 114 static void dhcpsrv_recv(void *, void *, size_t); 115 71 116 /** Decode subnet mask into subnet prefix length. */ 72 117 static int subnet_mask_decode(uint32_t mask, int *bits) … … 101 146 } 102 147 103 static int dhcp_send(void *msg, size_t size) 104 { 105 struct sockaddr_in addr; 106 int rc; 107 108 addr.sin_family = AF_INET; 109 addr.sin_port = htons(dhcp_server_port); 110 addr.sin_addr.s_addr = htonl(addr32_broadcast_all_hosts); 111 112 rc = sendto(transport_fd, msg, size, 0, 113 (struct sockaddr *)&addr, sizeof(addr)); 114 if (rc != EOK) { 115 printf("Sending failed\n"); 116 return rc; 117 } 118 119 return EOK; 120 } 121 122 static int dhcp_send_discover(void) 148 static int dhcp_send_discover(dhcp_link_t *dlink) 123 149 { 124 150 dhcp_hdr_t *hdr = (dhcp_hdr_t *)msgbuf; … … 132 158 hdr->flags = flag_broadcast; 133 159 134 addr48( link_info.mac_addr, hdr->chaddr);160 addr48(dlink->link_info.mac_addr, hdr->chaddr); 135 161 hdr->opt_magic = host2uint32_t_be(dhcp_opt_magic); 136 162 … … 140 166 opt[3] = opt_end; 141 167 142 return dhcp_send(msgbuf, sizeof(dhcp_hdr_t) + 4); 143 } 144 145 static int dhcp_recv_msg(void **rmsg, size_t *rsize) 146 { 147 struct sockaddr_in src_addr; 148 socklen_t src_addr_size; 149 size_t recv_size; 150 int rc; 151 152 src_addr_size = sizeof(src_addr); 153 rc = recvfrom(transport_fd, msgbuf, MAX_MSG_SIZE, 0, 154 (struct sockaddr *)&src_addr, &src_addr_size); 155 if (rc < 0) { 156 printf("recvfrom failed (%d)\n", rc); 157 return rc; 158 } 159 160 recv_size = (size_t)rc; 161 *rmsg = msgbuf; 162 *rsize = recv_size; 163 164 return EOK; 165 } 166 167 static int dhcp_send_request(dhcp_offer_t *offer) 168 return dhcp_send(&dlink->dt, msgbuf, sizeof(dhcp_hdr_t) + 4); 169 } 170 171 static int dhcp_send_request(dhcp_link_t *dlink, dhcp_offer_t *offer) 168 172 { 169 173 dhcp_hdr_t *hdr = (dhcp_hdr_t *)msgbuf; … … 178 182 hdr->flags = flag_broadcast; 179 183 hdr->ciaddr = host2uint32_t_be(offer->oaddr.addr); 180 addr48( link_info.mac_addr, hdr->chaddr);184 addr48(dlink->link_info.mac_addr, hdr->chaddr); 181 185 hdr->opt_magic = host2uint32_t_be(dhcp_opt_magic); 182 186 … … 203 207 opt[i++] = opt_end; 204 208 205 return dhcp_send( msgbuf, sizeof(dhcp_hdr_t) + i);206 } 207 208 static int dhcp_ recv_reply(void *msg, size_t size, dhcp_offer_t *offer)209 return dhcp_send(&dlink->dt, msgbuf, sizeof(dhcp_hdr_t) + i); 210 } 211 212 static int dhcp_parse_reply(void *msg, size_t size, dhcp_offer_t *offer) 209 213 { 210 214 dhcp_hdr_t *hdr = (dhcp_hdr_t *)msg; … … 222 226 size_t i; 223 227 224 printf("Receive reply\n");228 log_msg(LOG_DEFAULT, LVL_DEBUG, "Receive reply"); 225 229 memset(offer, 0, sizeof(*offer)); 226 230 227 yiaddr.family = AF_INET; 228 yiaddr.addr = uint32_t_be2host(hdr->yiaddr); 231 inet_addr_set(uint32_t_be2host(hdr->yiaddr), &yiaddr); 229 232 rc = inet_addr_format(&yiaddr, &saddr); 230 233 if (rc != EOK) 231 234 return rc; 232 235 233 printf("Your IP address: %s\n", saddr);236 log_msg(LOG_DEFAULT, LVL_DEBUG, "Your IP address: %s", saddr); 234 237 free(saddr); 235 238 236 siaddr.family = AF_INET; 237 siaddr.addr = uint32_t_be2host(hdr->siaddr); 239 inet_addr_set(uint32_t_be2host(hdr->siaddr), &siaddr); 238 240 rc = inet_addr_format(&siaddr, &saddr); 239 241 if (rc != EOK) 240 242 return rc; 241 243 242 printf("Next server IP address: %s\n", saddr);244 log_msg(LOG_DEFAULT, LVL_DEBUG, "Next server IP address: %s", saddr); 243 245 free(saddr); 244 246 245 giaddr.family = AF_INET; 246 giaddr.addr = uint32_t_be2host(hdr->giaddr); 247 inet_addr_set(uint32_t_be2host(hdr->giaddr), &giaddr); 247 248 rc = inet_addr_format(&giaddr, &saddr); 248 249 if (rc != EOK) 249 250 return rc; 250 251 251 printf("Relay agent IP address: %s\n", saddr);252 log_msg(LOG_DEFAULT, LVL_DEBUG, "Relay agent IP address: %s", saddr); 252 253 free(saddr); 253 254 254 offer->oaddr.family = AF_INET; 255 offer->oaddr.addr = yiaddr.addr; 255 inet_naddr_set(yiaddr.addr, 0, &offer->oaddr); 256 256 257 257 msgb = (uint8_t *)msg; … … 293 293 if (opt_len != 4) 294 294 return EINVAL; 295 offer->srv_addr.family = AF_INET;296 offer->srv_addr.addr = dhcp_uint32_decode(&msgb[i]);295 inet_addr_set(dhcp_uint32_decode(&msgb[i]), 296 &offer->srv_addr); 297 297 have_server_id = true; 298 298 break; … … 300 300 if (opt_len != 4) 301 301 return EINVAL; 302 offer->router.family = AF_INET;303 offer->router.addr = dhcp_uint32_decode(&msgb[i]);302 inet_addr_set(dhcp_uint32_decode(&msgb[i]), 303 &offer->router); 304 304 break; 305 305 case opt_dns_server: 306 306 if (opt_len != 4) 307 307 return EINVAL; 308 offer->dns_server.family = AF_INET;309 offer->dns_server.addr = dhcp_uint32_decode(&msgb[i]);308 inet_addr_set(dhcp_uint32_decode(&msgb[i]), 309 &offer->dns_server); 310 310 break; 311 311 case opt_end: … … 320 320 321 321 if (!have_server_id) { 322 printf("Missing server ID option.\n");322 log_msg(LOG_DEFAULT, LVL_ERROR, "Missing server ID option."); 323 323 return rc; 324 324 } 325 325 326 326 if (!have_subnet_mask) { 327 printf("Missing subnet mask option.\n");327 log_msg(LOG_DEFAULT, LVL_ERROR, "Missing subnet mask option."); 328 328 return rc; 329 329 } … … 333 333 return rc; 334 334 335 printf("Offered network address: %s\n", saddr);335 log_msg(LOG_DEFAULT, LVL_DEBUG, "Offered network address: %s", saddr); 336 336 free(saddr); 337 337 … … 341 341 return rc; 342 342 343 printf("Router address: %s\n", saddr);343 log_msg(LOG_DEFAULT, LVL_DEBUG, "Router address: %s", saddr); 344 344 free(saddr); 345 345 } … … 350 350 return rc; 351 351 352 printf("DNS server: %s\n", saddr);352 log_msg(LOG_DEFAULT, LVL_DEBUG, "DNS server: %s", saddr); 353 353 free(saddr); 354 354 } … … 367 367 &addr_id); 368 368 if (rc != EOK) { 369 printf("Error creating IP address %s (%d)\n", "dhcp4a", rc); 369 log_msg(LOG_DEFAULT, LVL_ERROR, 370 "Error creating IP address %s (%d)", "dhcp4a", rc); 370 371 return rc; 371 372 } 372 373 373 374 if (offer->router.addr != 0) { 374 defr.family = AF_INET; 375 defr.addr = 0; 376 defr.prefix = 0; 375 inet_naddr_set(0, 0, &defr); 377 376 378 377 rc = inetcfg_sroute_create("dhcpdef", &defr, &offer->router, &sroute_id); 379 378 if (rc != EOK) { 380 printf("Error creating default route %s (%d).\n", "dhcpdef",381 rc);379 log_msg(LOG_DEFAULT, LVL_ERROR, "Error creating " 380 "default route %s (%d).", "dhcpdef", rc); 382 381 return rc; 383 382 } … … 387 386 rc = dnsr_set_srvaddr(&offer->dns_server); 388 387 if (rc != EOK) { 389 printf("%s: Error setting nameserver address (%d))\n",390 NAME, rc);388 log_msg(LOG_DEFAULT, LVL_ERROR, "Error setting " 389 "nameserver address (%d))", rc); 391 390 return rc; 392 391 } … … 396 395 } 397 396 398 int main(int argc, char *argv[]) 399 { 400 int fd; 401 struct sockaddr_in laddr; 402 void *msg; 403 service_id_t iplink; 404 size_t msg_size; 397 void dhcpsrv_links_init(void) 398 { 399 list_initialize(&dhcp_links); 400 } 401 402 static dhcp_link_t *dhcpsrv_link_find(service_id_t link_id) 403 { 404 list_foreach(dhcp_links, links, dhcp_link_t, dlink) { 405 if (dlink->link_id == link_id) 406 return dlink; 407 } 408 409 return NULL; 410 } 411 412 static void dhcp_link_set_failed(dhcp_link_t *dlink) 413 { 414 log_msg(LOG_DEFAULT, LVL_NOTE, "Giving up on link %s", 415 dlink->link_info.name); 416 dlink->state = ds_fail; 417 } 418 419 int dhcpsrv_link_add(service_id_t link_id) 420 { 421 dhcp_link_t *dlink; 422 int rc; 423 424 log_msg(LOG_DEFAULT, LVL_DEBUG, "dhcpsrv_link_add(%zu)", link_id); 425 426 if (dhcpsrv_link_find(link_id) != NULL) { 427 log_msg(LOG_DEFAULT, LVL_NOTE, "Link %zu already added", 428 link_id); 429 return EEXIST; 430 } 431 432 dlink = calloc(1, sizeof(dhcp_link_t)); 433 if (dlink == NULL) 434 return ENOMEM; 435 436 dlink->link_id = link_id; 437 dlink->timeout = fibril_timer_create(); 438 if (dlink->timeout == NULL) { 439 rc = ENOMEM; 440 goto error; 441 } 442 443 /* Get link hardware address */ 444 rc = inetcfg_link_get(link_id, &dlink->link_info); 445 if (rc != EOK) { 446 log_msg(LOG_DEFAULT, LVL_ERROR, "Error getting properties " 447 "for link %zu.", link_id); 448 rc = EIO; 449 goto error; 450 } 451 452 rc = dhcp_transport_init(&dlink->dt, link_id, dhcpsrv_recv, dlink); 453 if (rc != EOK) { 454 log_msg(LOG_DEFAULT, LVL_ERROR, "Error initializing DHCP " 455 "transport for link %s.", dlink->link_info.name); 456 rc = EIO; 457 goto error; 458 } 459 460 dlink->state = ds_selecting; 461 462 log_msg(LOG_DEFAULT, LVL_DEBUG, "Send DHCPDISCOVER"); 463 rc = dhcp_send_discover(dlink); 464 if (rc != EOK) { 465 log_msg(LOG_DEFAULT, LVL_ERROR, "Error sending DHCPDISCOVER."); 466 dhcp_link_set_failed(dlink); 467 rc = EIO; 468 goto error; 469 } 470 471 dlink->retries_left = dhcp_discover_retries; 472 fibril_timer_set(dlink->timeout, dhcp_discover_timeout_val, 473 dhcpsrv_discover_timeout, dlink); 474 475 list_append(&dlink->links, &dhcp_links); 476 477 return EOK; 478 error: 479 if (dlink != NULL && dlink->timeout != NULL) 480 fibril_timer_destroy(dlink->timeout); 481 free(dlink); 482 return rc; 483 } 484 485 int dhcpsrv_link_remove(service_id_t link_id) 486 { 487 return ENOTSUP; 488 } 489 490 static void dhcpsrv_recv_offer(dhcp_link_t *dlink, dhcp_offer_t *offer) 491 { 492 int rc; 493 494 if (dlink->state != ds_selecting) { 495 log_msg(LOG_DEFAULT, LVL_DEBUG, "Received offer in state " 496 " %d, ignoring.", (int)dlink->state); 497 return; 498 } 499 500 fibril_timer_clear(dlink->timeout); 501 dlink->offer = *offer; 502 dlink->state = ds_requesting; 503 504 log_msg(LOG_DEFAULT, LVL_DEBUG, "Send DHCPREQUEST"); 505 rc = dhcp_send_request(dlink, offer); 506 if (rc != EOK) { 507 log_msg(LOG_DEFAULT, LVL_DEBUG, "Error sending request."); 508 return; 509 } 510 511 dlink->retries_left = dhcp_request_retries; 512 fibril_timer_set(dlink->timeout, dhcp_request_timeout_val, 513 dhcpsrv_request_timeout, dlink); 514 } 515 516 static void dhcpsrv_recv_ack(dhcp_link_t *dlink, dhcp_offer_t *offer) 517 { 518 int rc; 519 520 if (dlink->state != ds_requesting) { 521 log_msg(LOG_DEFAULT, LVL_DEBUG, "Received ack in state " 522 " %d, ignoring.", (int)dlink->state); 523 return; 524 } 525 526 fibril_timer_clear(dlink->timeout); 527 dlink->offer = *offer; 528 dlink->state = ds_bound; 529 530 rc = dhcp_cfg_create(dlink->link_id, offer); 531 if (rc != EOK) { 532 log_msg(LOG_DEFAULT, LVL_DEBUG, "Error creating configuration."); 533 return; 534 } 535 536 log_msg(LOG_DEFAULT, LVL_NOTE, "%s: Successfully configured.", 537 dlink->link_info.name); 538 } 539 540 static void dhcpsrv_recv(void *arg, void *msg, size_t size) 541 { 542 dhcp_link_t *dlink = (dhcp_link_t *)arg; 405 543 dhcp_offer_t offer; 406 544 int rc; 407 545 408 if (argc < 2) { 409 printf("syntax: %s <ip-link>\n", NAME); 410 return 1; 411 } 412 413 rc = inetcfg_init(); 414 if (rc != EOK) { 415 printf("Error contacting inet configuration service.\n"); 416 return 1; 417 } 418 419 rc = loc_service_get_id(argv[1], &iplink, 0); 420 if (rc != EOK) { 421 printf("Error resolving service '%s'.\n", argv[1]); 422 return 1; 423 } 424 425 /* Get link hardware address */ 426 rc = inetcfg_link_get(iplink, &link_info); 427 if (rc != EOK) { 428 printf("Error getting properties for link '%s'.\n", argv[1]); 429 return 1; 430 } 431 432 laddr.sin_family = AF_INET; 433 laddr.sin_port = htons(dhcp_client_port); 434 laddr.sin_addr.s_addr = INADDR_ANY; 435 436 fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 437 if (fd < 0) 438 return 1; 439 440 printf("Bind socket.\n"); 441 rc = bind(fd, (struct sockaddr *)&laddr, sizeof(laddr)); 442 if (rc != EOK) 443 return 1; 444 445 printf("Set socket options\n"); 446 rc = setsockopt(fd, SOL_SOCKET, SO_IPLINK, &iplink, sizeof(iplink)); 447 if (rc != EOK) 448 return 1; 449 450 transport_fd = fd; 451 452 printf("Send DHCPDISCOVER\n"); 453 rc = dhcp_send_discover(); 454 if (rc != EOK) 455 return 1; 456 457 rc = dhcp_recv_msg(&msg, &msg_size); 458 if (rc != EOK) 459 return 1; 460 461 printf("Received %zu bytes\n", msg_size); 462 463 rc = dhcp_recv_reply(msg, msg_size, &offer); 464 if (rc != EOK) 465 return 1; 466 467 rc = dhcp_send_request(&offer); 468 if (rc != EOK) 469 return 1; 470 471 rc = dhcp_recv_msg(&msg, &msg_size); 472 if (rc != EOK) 473 return 1; 474 475 printf("Received %zu bytes\n", msg_size); 476 477 rc = dhcp_recv_reply(msg, msg_size, &offer); 478 if (rc != EOK) 479 return 1; 480 481 rc = dhcp_cfg_create(iplink, &offer); 482 if (rc != EOK) 483 return 1; 484 485 closesocket(fd); 486 return 0; 546 log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: dhcpsrv_recv() %zu bytes", 547 dlink->link_info.name, size); 548 549 rc = dhcp_parse_reply(msg, size, &offer); 550 if (rc != EOK) { 551 log_msg(LOG_DEFAULT, LVL_DEBUG, "Error parsing reply"); 552 return; 553 } 554 555 switch (offer.msg_type) { 556 case msg_dhcpoffer: 557 dhcpsrv_recv_offer(dlink, &offer); 558 break; 559 case msg_dhcpack: 560 dhcpsrv_recv_ack(dlink, &offer); 561 break; 562 default: 563 log_msg(LOG_DEFAULT, LVL_DEBUG, "Received unexpected " 564 "message type. %d", (int)offer.msg_type); 565 break; 566 } 567 } 568 569 static void dhcpsrv_discover_timeout(void *arg) 570 { 571 dhcp_link_t *dlink = (dhcp_link_t *)arg; 572 int rc; 573 574 assert(dlink->state == ds_selecting); 575 log_msg(LOG_DEFAULT, LVL_NOTE, "%s: dcpsrv_discover_timeout", 576 dlink->link_info.name); 577 578 if (dlink->retries_left == 0) { 579 log_msg(LOG_DEFAULT, LVL_NOTE, "Retries exhausted"); 580 dhcp_link_set_failed(dlink); 581 return; 582 } 583 --dlink->retries_left; 584 585 log_msg(LOG_DEFAULT, LVL_DEBUG, "Send DHCPDISCOVER"); 586 rc = dhcp_send_discover(dlink); 587 if (rc != EOK) { 588 log_msg(LOG_DEFAULT, LVL_ERROR, "Error sending DHCPDISCOVER"); 589 dhcp_link_set_failed(dlink); 590 return; 591 } 592 593 fibril_timer_set(dlink->timeout, dhcp_discover_timeout_val, 594 dhcpsrv_discover_timeout, dlink); 595 } 596 597 static void dhcpsrv_request_timeout(void *arg) 598 { 599 dhcp_link_t *dlink = (dhcp_link_t *)arg; 600 int rc; 601 602 assert(dlink->state == ds_requesting); 603 log_msg(LOG_DEFAULT, LVL_NOTE, "%s: dcpsrv_request_timeout", 604 dlink->link_info.name); 605 606 if (dlink->retries_left == 0) { 607 log_msg(LOG_DEFAULT, LVL_NOTE, "Retries exhausted"); 608 dhcp_link_set_failed(dlink); 609 return; 610 } 611 --dlink->retries_left; 612 613 log_msg(LOG_DEFAULT, LVL_DEBUG, "Send DHCPREQUEST"); 614 rc = dhcp_send_request(dlink, &dlink->offer); 615 if (rc != EOK) { 616 log_msg(LOG_DEFAULT, LVL_DEBUG, "Error sending request."); 617 dhcp_link_set_failed(dlink); 618 return; 619 } 620 621 fibril_timer_set(dlink->timeout, dhcp_request_timeout_val, 622 dhcpsrv_request_timeout, dlink); 487 623 } 488 624 -
uspace/srv/net/dhcp/dhcp.h
r408424e rc42f50d 1 1 /* 2 * Copyright (c) 2013 Martin Decky2 * Copyright (c) 2013 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 /** @addtogroup inet29 /** @addtogroup dhcp 30 30 * @{ 31 31 */ … … 35 35 */ 36 36 37 #ifndef INETPING6_H_38 #define INETPING6_H_37 #ifndef DHCP_H 38 #define DHCP_H 39 39 40 #include "inetsrv.h"40 #include <ipc/loc.h> 41 41 42 extern void inetping6_conn(ipc_callid_t, ipc_call_t *, void *); 43 extern int inetping6_recv(uint16_t, inetping6_sdu_t *); 42 extern void dhcpsrv_links_init(void); 43 extern int dhcpsrv_link_add(service_id_t); 44 extern int dhcpsrv_link_remove(service_id_t); 44 45 45 46 #endif -
uspace/srv/net/dnsrsrv/dnsrsrv.c
r408424e rc42f50d 89 89 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_get_srvaddr_srv()"); 90 90 91 uint16_t af= IPC_GET_ARG1(*icall);91 ip_ver_t ver = IPC_GET_ARG1(*icall); 92 92 93 93 char *name; … … 100 100 101 101 dns_host_info_t *hinfo; 102 rc = dns_name2host(name, &hinfo, af);102 rc = dns_name2host(name, &hinfo, ver); 103 103 if (rc != EOK) { 104 104 async_answer_0(iid, rc); -
uspace/srv/net/dnsrsrv/query.c
r408424e rc42f50d 39 39 #include <stdlib.h> 40 40 #include <str.h> 41 #include <net/socket_codes.h>42 41 #include "dns_msg.h" 43 42 #include "dns_std.h" … … 190 189 } 191 190 192 int dns_name2host(const char *name, dns_host_info_t **rinfo, uint16_t af)191 int dns_name2host(const char *name, dns_host_info_t **rinfo, ip_ver_t ver) 193 192 { 194 193 dns_host_info_t *info = calloc(1, sizeof(dns_host_info_t)); … … 198 197 int rc; 199 198 200 switch ( af) {201 case AF_NONE:199 switch (ver) { 200 case ip_any: 202 201 rc = dns_name_query(name, DTYPE_AAAA, info); 203 202 … … 206 205 207 206 break; 208 case AF_INET:207 case ip_v4: 209 208 rc = dns_name_query(name, DTYPE_A, info); 210 209 break; 211 case AF_INET6:210 case ip_v6: 212 211 rc = dns_name_query(name, DTYPE_AAAA, info); 213 212 break; -
uspace/srv/net/dnsrsrv/query.h
r408424e rc42f50d 37 37 #define QUERY_H 38 38 39 #include <inet/addr.h> 39 40 #include "dns_type.h" 40 41 41 extern int dns_name2host(const char *, dns_host_info_t **, uint16_t);42 extern int dns_name2host(const char *, dns_host_info_t **, ip_ver_t); 42 43 extern void dns_hostinfo_destroy(dns_host_info_t *); 43 44 -
uspace/srv/net/dnsrsrv/transport.c
r408424e rc42f50d 182 182 { 183 183 trans_req_t *treq = NULL; 184 struct sockaddr *saddr = NULL; 185 socklen_t saddrlen; 184 186 185 187 void *req_data; … … 189 191 goto error; 190 192 191 struct sockaddr_in addr; 192 struct sockaddr_in6 addr6; 193 uint16_t af = 194 inet_addr_sockaddr_in(&dns_server_addr, &addr, &addr6); 195 196 struct sockaddr *address; 197 socklen_t addrlen; 198 199 switch (af) { 200 case AF_INET: 201 addr.sin_port = htons(DNS_SERVER_PORT); 202 address = (struct sockaddr *) &addr; 203 addrlen = sizeof(addr); 204 break; 205 case AF_INET6: 206 addr6.sin6_port = htons(DNS_SERVER_PORT); 207 address = (struct sockaddr *) &addr6; 208 addrlen = sizeof(addr6); 209 break; 210 default: 211 rc = EAFNOSUPPORT; 193 rc = inet_addr_sockaddr(&dns_server_addr, DNS_SERVER_PORT, 194 &saddr, &saddrlen); 195 if (rc != EOK) { 196 assert(rc == ENOMEM); 212 197 goto error; 213 198 } … … 217 202 while (ntry < REQ_RETRY_MAX) { 218 203 rc = sendto(transport_fd, req_data, req_size, 0, 219 (struct sockaddr *) address,addrlen);204 saddr, saddrlen); 220 205 if (rc != EOK) 221 206 goto error; … … 256 241 treq_destroy(treq); 257 242 free(req_data); 243 free(saddr); 258 244 return EOK; 259 245 … … 263 249 264 250 free(req_data); 251 free(saddr); 265 252 return rc; 266 253 } -
uspace/srv/net/ethip/arp.c
r408424e rc42f50d 40 40 #include <inet/addr.h> 41 41 #include <stdlib.h> 42 #include <net/socket_codes.h>43 42 #include "arp.h" 44 43 #include "atrans.h" … … 73 72 74 73 addr32_t laddr_v4; 75 uint16_t laddr_af= inet_addr_get(&laddr->addr, &laddr_v4, NULL);76 if (laddr_ af != AF_INET)74 ip_ver_t laddr_ver = inet_addr_get(&laddr->addr, &laddr_v4, NULL); 75 if (laddr_ver != ip_v4) 77 76 return; 78 77 -
uspace/srv/net/ethip/ethip.c
r408424e rc42f50d 44 44 #include <stdio.h> 45 45 #include <stdlib.h> 46 #include <net/socket_codes.h>47 46 #include "arp.h" 48 47 #include "ethip.h" … … 249 248 sdu.size = frame.size; 250 249 log_msg(LOG_DEFAULT, LVL_DEBUG, " - call iplink_ev_recv"); 251 rc = iplink_ev_recv(&nic->iplink, &sdu, AF_INET);250 rc = iplink_ev_recv(&nic->iplink, &sdu, ip_v4); 252 251 break; 253 252 case ETYPE_IPV6: … … 256 255 sdu.size = frame.size; 257 256 log_msg(LOG_DEFAULT, LVL_DEBUG, " - call iplink_ev_recv"); 258 rc = iplink_ev_recv(&nic->iplink, &sdu, AF_INET6);257 rc = iplink_ev_recv(&nic->iplink, &sdu, ip_v6); 259 258 break; 260 259 default: -
uspace/srv/net/ethip/ethip_nic.c
r408424e rc42f50d 45 45 #include <device/nic.h> 46 46 #include <stdlib.h> 47 #include <net/socket_codes.h>48 47 #include <mem.h> 49 48 #include "ethip.h" … … 354 353 355 354 list_foreach(nic->addr_list, link, ethip_link_addr_t, laddr) { 356 uint16_t af= inet_addr_get(&laddr->addr, NULL, NULL);357 if ( af == AF_INET6)355 ip_ver_t ver = inet_addr_get(&laddr->addr, NULL, NULL); 356 if (ver == ip_v6) 358 357 count++; 359 358 } … … 373 372 list_foreach(nic->addr_list, link, ethip_link_addr_t, laddr) { 374 373 addr128_t v6; 375 uint16_t af= inet_addr_get(&laddr->addr, NULL, &v6);376 if ( af != AF_INET6)374 ip_ver_t ver = inet_addr_get(&laddr->addr, NULL, &v6); 375 if (ver != ip_v6) 377 376 continue; 378 377 -
uspace/srv/net/inetsrv/Makefile
r408424e rc42f50d 38 38 inetcfg.c \ 39 39 inetping.c \ 40 inetping6.c \41 40 ndp.c \ 42 41 ntrans.c \ -
uspace/srv/net/inetsrv/addrobj.c
r408424e rc42f50d 42 42 #include <stdlib.h> 43 43 #include <str.h> 44 #include <net/socket_codes.h>45 44 #include "addrobj.h" 46 45 #include "inetsrv.h" … … 218 217 inet_addr_t lsrc_addr; 219 218 inet_naddr_addr(&addr->naddr, &lsrc_addr); 220 219 221 220 addr32_t lsrc_v4; 222 221 addr128_t lsrc_v6; 223 uint16_t lsrc_af= inet_addr_get(&lsrc_addr, &lsrc_v4, &lsrc_v6);224 222 ip_ver_t lsrc_ver = inet_addr_get(&lsrc_addr, &lsrc_v4, &lsrc_v6); 223 225 224 addr32_t ldest_v4; 226 225 addr128_t ldest_v6; 227 uint16_t ldest_af= inet_addr_get(ldest, &ldest_v4, &ldest_v6);228 229 if (lsrc_ af != ldest_af)226 ip_ver_t ldest_ver = inet_addr_get(ldest, &ldest_v4, &ldest_v6); 227 228 if (lsrc_ver != ldest_ver) 230 229 return EINVAL; 231 230 232 231 int rc; 233 232 addr48_t ldest_mac; 234 235 switch (ldest_ af) {236 case AF_INET:233 234 switch (ldest_ver) { 235 case ip_v4: 237 236 return inet_link_send_dgram(addr->ilink, lsrc_v4, ldest_v4, 238 237 dgram, proto, ttl, df); 239 case AF_INET6:238 case ip_v6: 240 239 /* 241 240 * Translate local destination IPv6 address. … … 244 243 if (rc != EOK) 245 244 return rc; 246 245 247 246 return inet_link_send_dgram6(addr->ilink, ldest_mac, dgram, 248 247 proto, ttl, df); 249 } 250 248 default: 249 assert(false); 250 break; 251 } 252 251 253 return ENOTSUP; 252 254 } -
uspace/srv/net/inetsrv/icmp.c
r408424e rc42f50d 40 40 #include <mem.h> 41 41 #include <stdlib.h> 42 #include < net/socket_codes.h>42 #include <types/inetping.h> 43 43 #include "icmp.h" 44 44 #include "icmp_std.h" … … 122 122 { 123 123 log_msg(LOG_DEFAULT, LVL_DEBUG, "icmp_recv_echo_reply()"); 124 124 125 125 if (dgram->size < sizeof(icmp_echo_t)) 126 126 return EINVAL; 127 127 128 128 icmp_echo_t *reply = (icmp_echo_t *) dgram->data; 129 129 130 130 inetping_sdu_t sdu; 131 132 uint16_t family = inet_addr_get(&dgram->src, &sdu.src, NULL); 133 if (family != AF_INET) 134 return EINVAL; 135 136 family = inet_addr_get(&dgram->dest, &sdu.dest, NULL); 137 if (family != AF_INET) 138 return EINVAL; 139 131 132 sdu.src = dgram->src; 133 sdu.dest = dgram->dest; 140 134 sdu.seq_no = uint16_t_be2host(reply->seq_no); 141 135 sdu.data = reply + sizeof(icmp_echo_t); 142 136 sdu.size = dgram->size - sizeof(icmp_echo_t); 143 137 144 138 uint16_t ident = uint16_t_be2host(reply->ident); 145 139 … … 153 147 if (rdata == NULL) 154 148 return ENOMEM; 155 149 156 150 icmp_echo_t *request = (icmp_echo_t *) rdata; 157 151 158 152 request->type = ICMP_ECHO_REQUEST; 159 153 request->code = 0; … … 161 155 request->ident = host2uint16_t_be(ident); 162 156 request->seq_no = host2uint16_t_be(sdu->seq_no); 163 157 164 158 memcpy(rdata + sizeof(icmp_echo_t), sdu->data, sdu->size); 165 159 166 160 uint16_t checksum = inet_checksum_calc(INET_CHECKSUM_INIT, rdata, rsize); 167 161 request->checksum = host2uint16_t_be(checksum); 168 162 169 163 inet_dgram_t dgram; 170 171 inet_addr_set(sdu->src, &dgram.src); 172 inet_addr_set(sdu->dest, &dgram.dest); 173 164 165 dgram.src = sdu->src; 166 dgram.dest = sdu->dest; 174 167 dgram.iplink = 0; 175 168 dgram.tos = ICMP_TOS; 176 169 dgram.data = rdata; 177 170 dgram.size = rsize; 178 171 179 172 int rc = inet_route_packet(&dgram, IP_PROTO_ICMP, INET_TTL_MAX, 0); 180 173 181 174 free(rdata); 182 175 return rc; -
uspace/srv/net/inetsrv/icmp.h
r408424e rc42f50d 38 38 #define ICMP_H_ 39 39 40 #include <types/inetping.h> 40 41 #include "inetsrv.h" 41 42 -
uspace/srv/net/inetsrv/icmpv6.c
r408424e rc42f50d 40 40 #include <mem.h> 41 41 #include <stdlib.h> 42 #include < net/socket_codes.h>42 #include <types/inetping.h> 43 43 #include "icmpv6.h" 44 44 #include "icmpv6_std.h" 45 45 #include "inetsrv.h" 46 #include "inetping 6.h"46 #include "inetping.h" 47 47 #include "pdu.h" 48 48 … … 58 58 59 59 addr128_t src_v6; 60 uint16_t src_af= inet_addr_get(&dgram->src, NULL, &src_v6);60 ip_ver_t src_ver = inet_addr_get(&dgram->src, NULL, &src_v6); 61 61 62 62 addr128_t dest_v6; 63 uint16_t dest_af= inet_addr_get(&dgram->dest, NULL, &dest_v6);64 65 if ((src_ af != dest_af) || (src_af != AF_INET6))63 ip_ver_t dest_ver = inet_addr_get(&dgram->dest, NULL, &dest_v6); 64 65 if ((src_ver != dest_ver) || (src_ver != ip_v6)) 66 66 return EINVAL; 67 67 … … 80 80 inet_get_srcaddr(&dgram->src, 0, &rdgram.src); 81 81 rdgram.dest = dgram->src; 82 rdgram.iplink = 0; 82 83 rdgram.tos = 0; 83 84 rdgram.data = reply; … … 115 116 return EINVAL; 116 117 117 inetping6_sdu_t sdu; 118 119 uint16_t src_af = inet_addr_get(&dgram->src, NULL, &sdu.src); 120 uint16_t dest_af = inet_addr_get(&dgram->dest, NULL, &sdu.dest); 121 122 if ((src_af != dest_af) || (src_af != AF_INET6)) 123 return EINVAL; 118 inetping_sdu_t sdu; 119 120 sdu.src = dgram->src; 121 sdu.dest = dgram->dest; 124 122 125 123 icmpv6_message_t *reply = (icmpv6_message_t *) dgram->data; … … 131 129 uint16_t ident = uint16_t_be2host(reply->un.echo.ident); 132 130 133 return inetping 6_recv(ident, &sdu);131 return inetping_recv(ident, &sdu); 134 132 } 135 133 … … 159 157 } 160 158 161 int icmpv6_ping_send(uint16_t ident, inetping 6_sdu_t *sdu)159 int icmpv6_ping_send(uint16_t ident, inetping_sdu_t *sdu) 162 160 { 163 161 size_t rsize = sizeof(icmpv6_message_t) + sdu->size; … … 178 176 inet_dgram_t dgram; 179 177 180 inet_addr_set6(sdu->src, &dgram.src); 181 inet_addr_set6(sdu->dest, &dgram.dest); 178 dgram.src = sdu->src; 179 dgram.dest = sdu->dest; 180 dgram.iplink = 0; 182 181 dgram.tos = 0; 183 182 dgram.data = rdata; … … 186 185 icmpv6_phdr_t phdr; 187 186 188 host2addr128_t_be(sdu->src, phdr.src_addr); 189 host2addr128_t_be(sdu->dest, phdr.dest_addr); 187 assert(sdu->src.version == ip_v6); 188 assert(sdu->dest.version == ip_v6); 189 190 host2addr128_t_be(sdu->src.addr6, phdr.src_addr); 191 host2addr128_t_be(sdu->dest.addr6, phdr.dest_addr); 190 192 phdr.length = host2uint32_t_be(dgram.size); 191 193 memset(phdr.zeroes, 0, 3); -
uspace/srv/net/inetsrv/icmpv6.h
r408424e rc42f50d 38 38 #define ICMPV6_H_ 39 39 40 #include <types/inetping.h> 40 41 #include "inetsrv.h" 41 42 42 43 extern int icmpv6_recv(inet_dgram_t *); 43 extern int icmpv6_ping_send(uint16_t, inetping 6_sdu_t *);44 extern int icmpv6_ping_send(uint16_t, inetping_sdu_t *); 44 45 45 46 #endif -
uspace/srv/net/inetsrv/inet_link.c
r408424e rc42f50d 43 43 #include <stdlib.h> 44 44 #include <str.h> 45 #include <net/socket_codes.h>46 45 #include "addrobj.h" 47 46 #include "inetsrv.h" … … 55 54 static uint16_t ip_ident = 0; 56 55 57 static int inet_ link_open(service_id_t);58 static in t inet_iplink_recv(iplink_t *, iplink_recv_sdu_t *, uint16_t);56 static int inet_iplink_recv(iplink_t *, iplink_recv_sdu_t *, ip_ver_t); 57 static inet_link_t *inet_link_get_by_id_locked(sysarg_t); 59 58 60 59 static iplink_ev_ops_t inet_iplink_ev_ops = { … … 62 61 }; 63 62 64 static LIST_INITIALIZE(inet_link _list);65 static FIBRIL_MUTEX_INITIALIZE(inet_ discovery_lock);63 static LIST_INITIALIZE(inet_links); 64 static FIBRIL_MUTEX_INITIALIZE(inet_links_lock); 66 65 67 66 static addr128_t link_local_node_ip = … … 81 80 } 82 81 83 static int inet_iplink_recv(iplink_t *iplink, iplink_recv_sdu_t *sdu, uint16_t af)82 static int inet_iplink_recv(iplink_t *iplink, iplink_recv_sdu_t *sdu, ip_ver_t ver) 84 83 { 85 84 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_iplink_recv()"); … … 88 87 inet_packet_t packet; 89 88 90 switch ( af) {91 case AF_INET:89 switch (ver) { 90 case ip_v4: 92 91 rc = inet_pdu_decode(sdu->data, sdu->size, &packet); 93 92 break; 94 case AF_INET6:93 case ip_v6: 95 94 rc = inet_pdu_decode6(sdu->data, sdu->size, &packet); 96 95 break; 97 96 default: 98 log_msg(LOG_DEFAULT, LVL_DEBUG, "invalid address family");97 log_msg(LOG_DEFAULT, LVL_DEBUG, "invalid IP version"); 99 98 return EINVAL; 100 99 } … … 113 112 } 114 113 115 static int inet_link_check_new(void)116 {117 bool already_known;118 category_id_t iplink_cat;119 service_id_t *svcs;120 size_t count, i;121 int rc;122 123 fibril_mutex_lock(&inet_discovery_lock);124 125 rc = loc_category_get_id("iplink", &iplink_cat, IPC_FLAG_BLOCKING);126 if (rc != EOK) {127 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed resolving category 'iplink'.");128 fibril_mutex_unlock(&inet_discovery_lock);129 return ENOENT;130 }131 132 rc = loc_category_get_svcs(iplink_cat, &svcs, &count);133 if (rc != EOK) {134 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed getting list of IP links.");135 fibril_mutex_unlock(&inet_discovery_lock);136 return EIO;137 }138 139 for (i = 0; i < count; i++) {140 already_known = false;141 142 list_foreach(inet_link_list, link_list, inet_link_t, ilink) {143 if (ilink->svc_id == svcs[i]) {144 already_known = true;145 break;146 }147 }148 149 if (!already_known) {150 log_msg(LOG_DEFAULT, LVL_DEBUG, "Found IP link '%lu'",151 (unsigned long) svcs[i]);152 rc = inet_link_open(svcs[i]);153 if (rc != EOK)154 log_msg(LOG_DEFAULT, LVL_ERROR, "Could not open IP link.");155 }156 }157 158 fibril_mutex_unlock(&inet_discovery_lock);159 return EOK;160 }161 162 114 static inet_link_t *inet_link_new(void) 163 115 { … … 183 135 } 184 136 185 staticint inet_link_open(service_id_t sid)137 int inet_link_open(service_id_t sid) 186 138 { 187 139 inet_link_t *ilink; … … 231 183 232 184 log_msg(LOG_DEFAULT, LVL_DEBUG, "Opened IP link '%s'", ilink->svc_name); 233 list_append(&ilink->link_list, &inet_link_list); 185 186 fibril_mutex_lock(&inet_links_lock); 187 188 if (inet_link_get_by_id_locked(sid) != NULL) { 189 fibril_mutex_unlock(&inet_links_lock); 190 log_msg(LOG_DEFAULT, LVL_DEBUG, "Link %zu already open", 191 sid); 192 rc = EEXIST; 193 goto error; 194 } 195 196 list_append(&ilink->link_list, &inet_links); 197 fibril_mutex_unlock(&inet_links_lock); 234 198 235 199 inet_addrobj_t *addr = NULL; … … 299 263 } 300 264 265 log_msg(LOG_DEFAULT, LVL_DEBUG, "Configured link '%s'.", ilink->svc_name); 301 266 return EOK; 302 267 … … 307 272 inet_link_delete(ilink); 308 273 return rc; 309 }310 311 static void inet_link_cat_change_cb(void)312 {313 (void) inet_link_check_new();314 }315 316 int inet_link_discovery_start(void)317 {318 int rc;319 320 rc = loc_register_cat_change_cb(inet_link_cat_change_cb);321 if (rc != EOK) {322 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering callback for IP link "323 "discovery (%d).", rc);324 return rc;325 }326 327 return inet_link_check_new();328 274 } 329 275 … … 347 293 { 348 294 addr32_t src_v4; 349 uint16_t src_af= inet_addr_get(&dgram->src, &src_v4, NULL);350 if (src_ af != AF_INET)295 ip_ver_t src_ver = inet_addr_get(&dgram->src, &src_v4, NULL); 296 if (src_ver != ip_v4) 351 297 return EINVAL; 352 298 353 299 addr32_t dest_v4; 354 uint16_t dest_af= inet_addr_get(&dgram->dest, &dest_v4, NULL);355 if (dest_ af != AF_INET)300 ip_ver_t dest_ver = inet_addr_get(&dgram->dest, &dest_v4, NULL); 301 if (dest_ver != ip_v4) 356 302 return EINVAL; 357 303 … … 422 368 { 423 369 addr128_t src_v6; 424 uint16_t src_af= inet_addr_get(&dgram->src, NULL, &src_v6);425 if (src_ af != AF_INET6)370 ip_ver_t src_ver = inet_addr_get(&dgram->src, NULL, &src_v6); 371 if (src_ver != ip_v6) 426 372 return EINVAL; 427 373 428 374 addr128_t dest_v6; 429 uint16_t dest_af= inet_addr_get(&dgram->dest, NULL, &dest_v6);430 if (dest_ af != AF_INET6)375 ip_ver_t dest_ver = inet_addr_get(&dgram->dest, NULL, &dest_v6); 376 if (dest_ver != ip_v6) 431 377 return EINVAL; 432 378 … … 478 424 } 479 425 426 static inet_link_t *inet_link_get_by_id_locked(sysarg_t link_id) 427 { 428 assert(fibril_mutex_is_locked(&inet_links_lock)); 429 430 list_foreach(inet_links, link_list, inet_link_t, ilink) { 431 if (ilink->svc_id == link_id) 432 return ilink; 433 } 434 435 return NULL; 436 } 437 480 438 inet_link_t *inet_link_get_by_id(sysarg_t link_id) 481 439 { 482 fibril_mutex_lock(&inet_discovery_lock); 483 484 list_foreach(inet_link_list, link_list, inet_link_t, ilink) { 485 if (ilink->svc_id == link_id) { 486 fibril_mutex_unlock(&inet_discovery_lock); 487 return ilink; 488 } 489 } 490 491 fibril_mutex_unlock(&inet_discovery_lock); 492 return NULL; 440 inet_link_t *ilink; 441 442 fibril_mutex_lock(&inet_links_lock); 443 ilink = inet_link_get_by_id_locked(link_id); 444 fibril_mutex_unlock(&inet_links_lock); 445 446 return ilink; 493 447 } 494 448 … … 499 453 size_t count, i; 500 454 501 fibril_mutex_lock(&inet_ discovery_lock);502 count = list_count(&inet_link _list);455 fibril_mutex_lock(&inet_links_lock); 456 count = list_count(&inet_links); 503 457 504 458 id_list = calloc(count, sizeof(sysarg_t)); 505 459 if (id_list == NULL) { 506 fibril_mutex_unlock(&inet_ discovery_lock);460 fibril_mutex_unlock(&inet_links_lock); 507 461 return ENOMEM; 508 462 } 509 463 510 464 i = 0; 511 list_foreach(inet_link _list, link_list, inet_link_t, ilink) {465 list_foreach(inet_links, link_list, inet_link_t, ilink) { 512 466 id_list[i++] = ilink->svc_id; 513 467 log_msg(LOG_DEFAULT, LVL_NOTE, "add link to list"); 514 468 } 515 469 516 fibril_mutex_unlock(&inet_ discovery_lock);470 fibril_mutex_unlock(&inet_links_lock); 517 471 518 472 log_msg(LOG_DEFAULT, LVL_NOTE, "return %zu links", count); -
uspace/srv/net/inetsrv/inet_link.h
r408424e rc42f50d 41 41 #include "inetsrv.h" 42 42 43 extern int inet_link_ discovery_start(void);43 extern int inet_link_open(service_id_t); 44 44 extern int inet_link_send_dgram(inet_link_t *, addr32_t, 45 45 addr32_t, inet_dgram_t *, uint8_t, uint8_t, int); -
uspace/srv/net/inetsrv/inetcfg.c
r408424e rc42f50d 1 1 /* 2 * Copyright (c) 201 2Jiri Svoboda2 * Copyright (c) 2013 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 160 160 } 161 161 162 static int inetcfg_link_add(sysarg_t link_id) 163 { 164 return inet_link_open(link_id); 165 } 166 162 167 static int inetcfg_link_get(sysarg_t link_id, inet_link_info_t *linfo) 163 168 { … … 180 185 } 181 186 187 static int inetcfg_link_remove(sysarg_t link_id) 188 { 189 return ENOTSUP; 190 } 191 182 192 static int inetcfg_sroute_create(char *name, inet_naddr_t *dest, 183 193 inet_addr_t *router, sysarg_t *sroute_id) … … 483 493 } 484 494 495 static void inetcfg_link_add_srv(ipc_callid_t callid, ipc_call_t *call) 496 { 497 sysarg_t link_id; 498 int rc; 499 500 log_msg(LOG_DEFAULT, LVL_DEBUG, "inetcfg_link_add_srv()"); 501 502 link_id = IPC_GET_ARG1(*call); 503 504 rc = inetcfg_link_add(link_id); 505 async_answer_0(callid, rc); 506 } 507 485 508 static void inetcfg_link_get_srv(ipc_callid_t callid, ipc_call_t *call) 486 509 { … … 536 559 } 537 560 561 static void inetcfg_link_remove_srv(ipc_callid_t callid, ipc_call_t *call) 562 { 563 sysarg_t link_id; 564 int rc; 565 566 log_msg(LOG_DEFAULT, LVL_DEBUG, "inetcfg_link_remove_srv()"); 567 568 link_id = IPC_GET_ARG1(*call); 569 570 rc = inetcfg_link_remove(link_id); 571 async_answer_0(callid, rc); 572 } 573 538 574 static void inetcfg_sroute_create_srv(ipc_callid_t iid, 539 575 ipc_call_t *icall) … … 714 750 sysarg_t method = IPC_GET_IMETHOD(call); 715 751 752 log_msg(LOG_DEFAULT, LVL_DEBUG, "method %d", (int)method); 716 753 if (!method) { 717 754 /* The other side has hung up */ … … 742 779 inetcfg_get_sroute_list_srv(callid, &call); 743 780 break; 781 case INETCFG_LINK_ADD: 782 inetcfg_link_add_srv(callid, &call); 783 break; 744 784 case INETCFG_LINK_GET: 745 785 inetcfg_link_get_srv(callid, &call); 786 break; 787 case INETCFG_LINK_REMOVE: 788 inetcfg_link_remove_srv(callid, &call); 746 789 break; 747 790 case INETCFG_SROUTE_CREATE: -
uspace/srv/net/inetsrv/inetping.c
r408424e rc42f50d 1 1 /* 2 * Copyright (c) 2012 Jiri Svoboda 2 * Copyright (c) 2013 Jiri Svoboda 3 * Copyright (c) 2013 Martin Decky 3 4 * All rights reserved. 4 5 * … … 43 44 #include <stdlib.h> 44 45 #include <sys/types.h> 45 #include < net/socket_codes.h>46 #include <types/inetping.h> 46 47 #include "icmp.h" 48 #include "icmpv6.h" 47 49 #include "icmp_std.h" 48 50 #include "inetsrv.h" … … 57 59 static int inetping_send(inetping_client_t *client, inetping_sdu_t *sdu) 58 60 { 59 return icmp_ping_send(client->ident, sdu); 60 } 61 62 static int inetping_get_srcaddr(inetping_client_t *client, addr32_t remote, 63 addr32_t *local) 64 { 65 inet_addr_t remote_addr; 66 inet_addr_set(remote, &remote_addr); 67 68 inet_addr_t local_addr; 69 int rc = inet_get_srcaddr(&remote_addr, ICMP_TOS, &local_addr); 70 if (rc != EOK) 71 return rc; 72 73 uint16_t family = inet_addr_get(&local_addr, local, NULL); 74 if (family != AF_INET) 61 if (sdu->src.version != sdu->dest.version) 75 62 return EINVAL; 76 77 return EOK; 63 64 switch (sdu->src.version) { 65 case ip_v4: 66 return icmp_ping_send(client->ident, sdu); 67 case ip_v6: 68 return icmpv6_ping_send(client->ident, sdu); 69 default: 70 return EINVAL; 71 } 72 } 73 74 static int inetping_get_srcaddr(inetping_client_t *client, 75 inet_addr_t *remote, inet_addr_t *local) 76 { 77 return inet_get_srcaddr(remote, ICMP_TOS, local); 78 78 } 79 79 … … 81 81 { 82 82 fibril_mutex_lock(&client_list_lock); 83 83 84 84 list_foreach(client_list, client_list, inetping_client_t, client) { 85 85 if (client->ident == ident) { … … 88 88 } 89 89 } 90 90 91 91 fibril_mutex_unlock(&client_list_lock); 92 92 return NULL; … … 100 100 return ENOENT; 101 101 } 102 102 103 103 async_exch_t *exch = async_exchange_begin(client->sess); 104 104 105 105 ipc_call_t answer; 106 aid_t req = async_send_3(exch, INETPING_EV_RECV, (sysarg_t) sdu->src, 107 (sysarg_t) sdu->dest, sdu->seq_no, &answer); 108 int rc = async_data_write_start(exch, sdu->data, sdu->size); 109 110 async_exchange_end(exch); 111 112 if (rc != EOK) { 106 aid_t req = async_send_1(exch, INETPING_EV_RECV, sdu->seq_no, &answer); 107 108 int rc = async_data_write_start(exch, &sdu->src, sizeof(sdu->src)); 109 if (rc != EOK) { 110 async_exchange_end(exch); 113 111 async_forget(req); 114 112 return rc; 115 113 } 116 114 115 rc = async_data_write_start(exch, &sdu->dest, sizeof(sdu->dest)); 116 if (rc != EOK) { 117 async_exchange_end(exch); 118 async_forget(req); 119 return rc; 120 } 121 122 rc = async_data_write_start(exch, sdu->data, sdu->size); 123 124 async_exchange_end(exch); 125 126 if (rc != EOK) { 127 async_forget(req); 128 return rc; 129 } 130 117 131 sysarg_t retval; 118 132 async_wait_for(req, &retval); 119 133 120 134 return (int) retval; 121 135 } 122 136 123 static void inetping_send_srv(inetping_client_t *client, ipc_callid_t callid, 124 ipc_call_t *call) 125 { 137 static void inetping_send_srv(inetping_client_t *client, ipc_callid_t iid, 138 ipc_call_t *icall) 139 { 140 log_msg(LOG_DEFAULT, LVL_DEBUG, "inetping_send_srv()"); 141 126 142 inetping_sdu_t sdu; 127 143 int rc; 128 144 129 log_msg(LOG_DEFAULT, LVL_DEBUG, "inetping_send_srv()"); 145 sdu.seq_no = IPC_GET_ARG1(*icall); 146 147 ipc_callid_t callid; 148 size_t size; 149 if (!async_data_write_receive(&callid, &size)) { 150 async_answer_0(callid, EREFUSED); 151 async_answer_0(iid, EREFUSED); 152 return; 153 } 154 155 if (size != sizeof(sdu.src)) { 156 async_answer_0(callid, EINVAL); 157 async_answer_0(iid, EINVAL); 158 return; 159 } 160 161 rc = async_data_write_finalize(callid, &sdu.src, size); 162 if (rc != EOK) { 163 async_answer_0(callid, rc); 164 async_answer_0(iid, rc); 165 return; 166 } 167 168 if (!async_data_write_receive(&callid, &size)) { 169 async_answer_0(callid, EREFUSED); 170 async_answer_0(iid, EREFUSED); 171 return; 172 } 173 174 if (size != sizeof(sdu.dest)) { 175 async_answer_0(callid, EINVAL); 176 async_answer_0(iid, EINVAL); 177 return; 178 } 179 180 rc = async_data_write_finalize(callid, &sdu.dest, size); 181 if (rc != EOK) { 182 async_answer_0(callid, rc); 183 async_answer_0(iid, rc); 184 return; 185 } 130 186 131 187 rc = async_data_write_accept((void **) &sdu.data, false, 0, 0, 0, 132 188 &sdu.size); 133 189 if (rc != EOK) { 134 async_answer_0(callid, rc); 135 return; 136 } 137 138 sdu.src = IPC_GET_ARG1(*call); 139 sdu.dest = IPC_GET_ARG2(*call); 140 sdu.seq_no = IPC_GET_ARG3(*call); 190 async_answer_0(iid, rc); 191 return; 192 } 141 193 142 194 rc = inetping_send(client, &sdu); 143 195 free(sdu.data); 144 196 145 async_answer_0( callid, rc);197 async_answer_0(iid, rc); 146 198 } 147 199 148 200 static void inetping_get_srcaddr_srv(inetping_client_t *client, 149 ipc_callid_t callid, ipc_call_t *call)201 ipc_callid_t iid, ipc_call_t *icall) 150 202 { 151 203 log_msg(LOG_DEFAULT, LVL_DEBUG, "inetping_get_srcaddr_srv()"); 152 153 uint32_t remote = IPC_GET_ARG1(*call); 154 uint32_t local = 0; 155 156 int rc = inetping_get_srcaddr(client, remote, &local); 157 async_answer_1(callid, rc, (sysarg_t) local); 204 205 ipc_callid_t callid; 206 size_t size; 207 208 inet_addr_t local; 209 inet_addr_t remote; 210 211 if (!async_data_write_receive(&callid, &size)) { 212 async_answer_0(callid, EREFUSED); 213 async_answer_0(iid, EREFUSED); 214 return; 215 } 216 217 if (size != sizeof(remote)) { 218 async_answer_0(callid, EINVAL); 219 async_answer_0(iid, EINVAL); 220 return; 221 } 222 223 int rc = async_data_write_finalize(callid, &remote, size); 224 if (rc != EOK) { 225 async_answer_0(callid, rc); 226 async_answer_0(iid, rc); 227 return; 228 } 229 230 rc = inetping_get_srcaddr(client, &remote, &local); 231 if (rc != EOK) { 232 async_answer_0(iid, rc); 233 return; 234 } 235 236 if (!async_data_read_receive(&callid, &size)) { 237 async_answer_0(callid, EREFUSED); 238 async_answer_0(iid, EREFUSED); 239 return; 240 } 241 242 if (size != sizeof(local)) { 243 async_answer_0(callid, EINVAL); 244 async_answer_0(iid, EINVAL); 245 return; 246 } 247 248 rc = async_data_read_finalize(callid, &local, size); 249 if (rc != EOK) 250 async_answer_0(callid, rc); 251 252 async_answer_0(iid, rc); 158 253 } 159 254 … … 163 258 if (sess == NULL) 164 259 return ENOMEM; 165 260 166 261 client->sess = sess; 167 262 link_initialize(&client->client_list); 168 263 169 264 fibril_mutex_lock(&client_list_lock); 170 265 client->ident = ++inetping_ident; 171 266 list_append(&client->client_list, &client_list); 172 267 fibril_mutex_unlock(&client_list_lock); 173 268 174 269 return EOK; 175 270 } … … 179 274 async_hangup(client->sess); 180 275 client->sess = NULL; 181 276 182 277 fibril_mutex_lock(&client_list_lock); 183 278 list_remove(&client->client_list); … … 188 283 { 189 284 log_msg(LOG_DEFAULT, LVL_DEBUG, "inetping_conn()"); 190 285 191 286 /* Accept the connection */ 192 287 async_answer_0(iid, EOK); 193 288 194 289 inetping_client_t client; 195 290 int rc = inetping_client_init(&client); 196 291 if (rc != EOK) 197 292 return; 198 293 199 294 while (true) { 200 295 ipc_call_t call; 201 296 ipc_callid_t callid = async_get_call(&call); 202 297 sysarg_t method = IPC_GET_IMETHOD(call); 203 298 204 299 if (!method) { 205 300 /* The other side has hung up */ … … 207 302 break; 208 303 } 209 304 210 305 switch (method) { 211 306 case INETPING_SEND: … … 219 314 } 220 315 } 221 316 222 317 inetping_client_fini(&client); 223 318 } -
uspace/srv/net/inetsrv/inetping.h
r408424e rc42f50d 38 38 #define INETPING_H_ 39 39 40 #include <types/inetping.h> 40 41 #include "inetsrv.h" 41 42 -
uspace/srv/net/inetsrv/inetsrv.c
r408424e rc42f50d 46 46 #include <stdlib.h> 47 47 #include <sys/types.h> 48 #include <net/socket_codes.h>49 48 #include "addrobj.h" 50 49 #include "icmp.h" … … 55 54 #include "inetcfg.h" 56 55 #include "inetping.h" 57 #include "inetping6.h"58 56 #include "inet_link.h" 59 57 #include "reass.h" … … 63 61 64 62 static inet_naddr_t solicited_node_mask = { 65 . family = AF_INET6,63 .version = ip_v6, 66 64 .addr6 = {0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, 0xff, 0, 0, 0}, 67 65 .prefix = 104 … … 69 67 70 68 static inet_addr_t broadcast4_all_hosts = { 71 . family = AF_INET,69 .version = ip_v4, 72 70 .addr = 0xffffffff 73 71 }; 74 72 75 73 static inet_addr_t multicast_all_nodes = { 76 . family = AF_INET6,74 .version = ip_v6, 77 75 .addr6 = {0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01} 78 76 }; … … 116 114 return EEXIST; 117 115 } 118 119 rc = loc_service_register_with_iface(SERVICE_NAME_INETPING6, &sid,120 INET_PORT_PING6);121 if (rc != EOK) {122 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service (%d).", rc);123 return EEXIST;124 }125 126 rc = inet_link_discovery_start();127 if (rc != EOK)128 return EEXIST;129 116 130 117 return EOK; … … 184 171 185 172 if (dgram->iplink != 0) { 173 /* XXX TODO - IPv6 */ 186 174 log_msg(LOG_DEFAULT, LVL_DEBUG, "dgram directly to iplink %zu", 187 175 dgram->iplink); … … 191 179 return ENOENT; 192 180 193 if (dgram->src. family != AF_INET||194 dgram->dest. family != AF_INET)181 if (dgram->src.version != ip_v4 || 182 dgram->dest.version != ip_v4) 195 183 return EINVAL; 196 184 … … 229 217 230 218 /* Take source address from the address object */ 231 if (remote->family == AF_INET && remote->addr == 0xffffffff) { 232 local->family = AF_INET; 219 if (remote->version == ip_v4 && remote->addr == 0xffffffff) { 220 /* XXX TODO - IPv6 */ 221 local->version = ip_v4; 233 222 local->addr = 0; 234 223 return EOK; 235 224 } 225 236 226 inet_naddr_addr(&dir.aobj->naddr, local); 237 227 return EOK; … … 454 444 inetping_conn(iid, icall, arg); 455 445 break; 456 case INET_PORT_PING6:457 inetping6_conn(iid, icall, arg);458 break;459 446 default: 460 447 async_answer_0(iid, ENOTSUP); -
uspace/srv/net/inetsrv/inetsrv.h
r408424e rc42f50d 148 148 } inet_dir_t; 149 149 150 typedef struct {151 uint32_t src;152 uint32_t dest;153 uint16_t seq_no;154 void *data;155 size_t size;156 } inetping_sdu_t;157 158 typedef struct {159 addr128_t src;160 addr128_t dest;161 uint16_t seq_no;162 void *data;163 size_t size;164 } inetping6_sdu_t;165 166 150 extern int inet_ev_recv(inet_client_t *, inet_dgram_t *); 167 151 extern int inet_recv_packet(inet_packet_t *); -
uspace/srv/net/inetsrv/ndp.c
r408424e rc42f50d 39 39 #include <malloc.h> 40 40 #include <io/log.h> 41 #include <net/socket_codes.h>42 41 #include "ntrans.h" 43 42 #include "addrobj.h" -
uspace/srv/net/inetsrv/pdu.c
r408424e rc42f50d 44 44 #include <mem.h> 45 45 #include <stdlib.h> 46 #include <net/socket_codes.h>47 46 #include "inetsrv.h" 48 47 #include "inet_std.h" … … 533 532 int ndp_pdu_decode(inet_dgram_t *dgram, ndp_packet_t *ndp) 534 533 { 535 uint16_t src_af= inet_addr_get(&dgram->src, NULL,534 ip_ver_t src_ver = inet_addr_get(&dgram->src, NULL, 536 535 &ndp->sender_proto_addr); 537 if (src_ af != AF_INET6)536 if (src_ver != ip_v6) 538 537 return EINVAL; 539 538 -
uspace/srv/net/inetsrv/sroute.c
r408424e rc42f50d 95 95 inet_sroute_t *inet_sroute_find(inet_addr_t *addr) 96 96 { 97 uint16_t addr_af= inet_addr_get(addr, NULL, NULL);97 ip_ver_t addr_ver = inet_addr_get(addr, NULL, NULL); 98 98 99 99 inet_sroute_t *best = NULL; … … 104 104 list_foreach(sroute_list, sroute_list, inet_sroute_t, sroute) { 105 105 uint8_t dest_bits; 106 uint16_t dest_af= inet_naddr_get(&sroute->dest, NULL, NULL,106 ip_ver_t dest_ver = inet_naddr_get(&sroute->dest, NULL, NULL, 107 107 &dest_bits); 108 108 109 109 /* Skip comparison with different address family */ 110 if (addr_ af != dest_af)110 if (addr_ver != dest_ver) 111 111 continue; 112 112 -
uspace/srv/net/loopip/loopip.c
r408424e rc42f50d 40 40 #include <inet/iplink_srv.h> 41 41 #include <inet/addr.h> 42 #include <net/socket_codes.h>43 42 #include <io/log.h> 44 43 #include <loc.h> … … 76 75 link_t link; 77 76 78 uint16_t af; 77 /* XXX Version should be part of SDU */ 78 ip_ver_t ver; 79 79 iplink_recv_sdu_t sdu; 80 80 } rqueue_entry_t; … … 88 88 list_get_instance(link, rqueue_entry_t, link); 89 89 90 (void) iplink_ev_recv(&loopip_iplink, &rqe->sdu, rqe-> af);90 (void) iplink_ev_recv(&loopip_iplink, &rqe->sdu, rqe->ver); 91 91 92 92 free(rqe->sdu.data); … … 174 174 * Clone SDU 175 175 */ 176 rqe-> af = AF_INET;176 rqe->ver = ip_v4; 177 177 rqe->sdu.data = malloc(sdu->size); 178 178 if (rqe->sdu.data == NULL) { … … 203 203 * Clone SDU 204 204 */ 205 rqe-> af = AF_INET6;205 rqe->ver = ip_v6; 206 206 rqe->sdu.data = malloc(sdu->size); 207 207 if (rqe->sdu.data == NULL) { -
uspace/srv/net/nconfsrv/Makefile
r408424e rc42f50d 1 1 # 2 # Copyright (c) 2013 Antonin Steinhauser2 # Copyright (c) 2013 Jiri Svoboda 3 3 # All rights reserved. 4 4 # … … 27 27 # 28 28 29 USPACE_PREFIX = ../.. 30 BINARY = ping629 USPACE_PREFIX = ../../.. 30 BINARY = nconfsrv 31 31 32 32 SOURCES = \ 33 ping6.c 33 iplink.c \ 34 nconfsrv.c 34 35 35 36 include $(USPACE_PREFIX)/Makefile.common -
uspace/srv/net/slip/slip.c
r408424e rc42f50d 38 38 #include <stdint.h> 39 39 #include <loc.h> 40 #include <net/socket_codes.h>41 40 #include <inet/addr.h> 42 41 #include <inet/iplink_srv.h> … … 277 276 278 277 pass: 279 rc = iplink_ev_recv(&slip_iplink, &sdu, AF_INET);278 rc = iplink_ev_recv(&slip_iplink, &sdu, ip_v4); 280 279 if (rc != EOK) { 281 280 log_msg(LOG_DEFAULT, LVL_ERROR, -
uspace/srv/net/tcp/conn.c
r408424e rc42f50d 381 381 * @param conn Connection 382 382 */ 383 staticvoid tcp_conn_reset(tcp_conn_t *conn)383 void tcp_conn_reset(tcp_conn_t *conn) 384 384 { 385 385 log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: tcp_conn_reset()", conn->name); -
uspace/srv/net/tcp/conn.h
r408424e rc42f50d 43 43 extern void tcp_conn_add(tcp_conn_t *); 44 44 extern void tcp_conn_remove(tcp_conn_t *); 45 extern void tcp_conn_reset(tcp_conn_t *conn); 45 46 extern void tcp_conn_sync(tcp_conn_t *); 46 47 extern void tcp_conn_fin_sent(tcp_conn_t *); -
uspace/srv/net/tcp/pdu.c
r408424e rc42f50d 40 40 #include <mem.h> 41 41 #include <stdlib.h> 42 #include <net/socket_codes.h>43 42 #include "pdu.h" 44 43 #include "segment.h" … … 145 144 } 146 145 147 static uint16_t tcp_phdr_setup(tcp_pdu_t *pdu, tcp_phdr_t *phdr,146 static ip_ver_t tcp_phdr_setup(tcp_pdu_t *pdu, tcp_phdr_t *phdr, 148 147 tcp_phdr6_t *phdr6) 149 148 { 150 149 addr32_t src_v4; 151 150 addr128_t src_v6; 152 uint16_t src_ af= inet_addr_get(&pdu->src, &src_v4, &src_v6);153 151 uint16_t src_ver = inet_addr_get(&pdu->src, &src_v4, &src_v6); 152 154 153 addr32_t dest_v4; 155 154 addr128_t dest_v6; 156 uint16_t dest_ af= inet_addr_get(&pdu->dest, &dest_v4, &dest_v6);157 158 assert(src_ af == dest_af);159 160 switch (src_ af) {161 case AF_INET:155 uint16_t dest_ver = inet_addr_get(&pdu->dest, &dest_v4, &dest_v6); 156 157 assert(src_ver == dest_ver); 158 159 switch (src_ver) { 160 case ip_v4: 162 161 phdr->src = host2uint32_t_be(src_v4); 163 162 phdr->dest = host2uint32_t_be(dest_v4); … … 167 166 host2uint16_t_be(pdu->header_size + pdu->text_size); 168 167 break; 169 case AF_INET6:168 case ip_v6: 170 169 host2addr128_t_be(src_v6, phdr6->src); 171 170 host2addr128_t_be(dest_v6, phdr6->dest); … … 178 177 assert(false); 179 178 } 180 181 return src_ af;179 180 return src_ver; 182 181 } 183 182 … … 266 265 tcp_phdr_t phdr; 267 266 tcp_phdr6_t phdr6; 268 269 uint16_t af= tcp_phdr_setup(pdu, &phdr, &phdr6);270 switch ( af) {271 case AF_INET:267 268 ip_ver_t ver = tcp_phdr_setup(pdu, &phdr, &phdr6); 269 switch (ver) { 270 case ip_v4: 272 271 cs_phdr = tcp_checksum_calc(TCP_CHECKSUM_INIT, (void *) &phdr, 273 272 sizeof(tcp_phdr_t)); 274 273 break; 275 case AF_INET6:274 case ip_v6: 276 275 cs_phdr = tcp_checksum_calc(TCP_CHECKSUM_INIT, (void *) &phdr6, 277 276 sizeof(tcp_phdr6_t)); … … 280 279 assert(false); 281 280 } 282 281 283 282 cs_headers = tcp_checksum_calc(cs_phdr, pdu->header, pdu->header_size); 284 283 return tcp_checksum_calc(cs_headers, pdu->text, pdu->text_size); -
uspace/srv/net/tcp/sock.c
r408424e rc42f50d 882 882 tcp_sockdata_t *socket; 883 883 tcp_error_t trc; 884 int i; 884 885 int rc; 885 886 … … 897 898 898 899 if (socket->conn != NULL) { 900 /* Close connection */ 899 901 trc = tcp_uc_close(socket->conn); 900 902 if (trc != TCP_EOK && trc != TCP_ENOTEXIST) { … … 905 907 } 906 908 909 if (socket->lconn != NULL) { 910 /* Close listening connections */ 911 for (i = 0; i < socket->backlog; i++) { 912 tcp_uc_set_cstate_cb(socket->lconn[i]->conn, NULL, NULL); 913 trc = tcp_uc_close(socket->lconn[i]->conn); 914 if (trc != TCP_EOK && trc != TCP_ENOTEXIST) { 915 fibril_mutex_unlock(&socket->lock); 916 async_answer_0(callid, EBADF); 917 return; 918 } 919 920 free(socket->lconn[i]); 921 socket->lconn[i] = NULL; 922 } 923 } 924 907 925 /* Grab recv_buffer_lock because of CV wait in tcp_sock_recv_fibril() */ 908 926 fibril_mutex_lock(&socket->recv_buffer_lock); -
uspace/srv/net/tcp/ucall.c
r408424e rc42f50d 83 83 84 84 if (oflags == tcp_open_nonblock) { 85 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_open -> %p", nconn); 85 86 *conn = nconn; 86 87 return TCP_EOK; … … 234 235 tcp_error_t tcp_uc_close(tcp_conn_t *conn) 235 236 { 236 log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: tcp_uc_close()", conn->name); 237 log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: tcp_uc_close(%p)", conn->name, 238 conn); 237 239 238 240 fibril_mutex_lock(&conn->lock); 239 241 240 242 if (conn->cstate == st_closed) { 243 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_close - ENOTEXIST"); 241 244 fibril_mutex_unlock(&conn->lock); 242 245 return TCP_ENOTEXIST; 243 246 } 244 247 248 if (conn->cstate == st_listen || conn->cstate == st_syn_sent) { 249 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_close - listen/syn_sent"); 250 tcp_conn_reset(conn); 251 tcp_conn_remove(conn); 252 return TCP_EOK; 253 } 254 245 255 if (conn->snd_buf_fin) { 256 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_close - ECLOSING"); 246 257 fibril_mutex_unlock(&conn->lock); 247 258 return TCP_ECLOSING; 248 259 } 249 260 261 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_close - set snd_buf_fin"); 250 262 conn->snd_buf_fin = true; 251 263 tcp_tqueue_new_data(conn); -
uspace/srv/net/udp/pdu.c
r408424e rc42f50d 85 85 } 86 86 87 static uint16_t udp_phdr_setup(udp_pdu_t *pdu, udp_phdr_t *phdr,87 static ip_ver_t udp_phdr_setup(udp_pdu_t *pdu, udp_phdr_t *phdr, 88 88 udp_phdr6_t *phdr6) 89 89 { 90 90 addr32_t src_v4; 91 91 addr128_t src_v6; 92 uint16_t src_af= inet_addr_get(&pdu->src, &src_v4, &src_v6);93 92 ip_ver_t src_ver = inet_addr_get(&pdu->src, &src_v4, &src_v6); 93 94 94 addr32_t dest_v4; 95 95 addr128_t dest_v6; 96 uint16_t dest_af= inet_addr_get(&pdu->dest, &dest_v4, &dest_v6);97 98 assert(src_ af == dest_af);99 100 switch (src_ af) {101 case AF_INET:96 ip_ver_t dest_ver = inet_addr_get(&pdu->dest, &dest_v4, &dest_v6); 97 98 assert(src_ver == dest_ver); 99 100 switch (src_ver) { 101 case ip_v4: 102 102 phdr->src_addr = host2uint32_t_be(src_v4); 103 103 phdr->dest_addr = host2uint32_t_be(dest_v4); … … 106 106 phdr->udp_length = host2uint16_t_be(pdu->data_size); 107 107 break; 108 case AF_INET6:108 case ip_v6: 109 109 host2addr128_t_be(src_v6, phdr6->src_addr); 110 110 host2addr128_t_be(dest_v6, phdr6->dest_addr); … … 116 116 assert(false); 117 117 } 118 119 return src_ af;118 119 return src_ver; 120 120 } 121 121 … … 136 136 udp_phdr_t phdr; 137 137 udp_phdr6_t phdr6; 138 139 uint16_t af= udp_phdr_setup(pdu, &phdr, &phdr6);140 switch ( af) {141 case AF_INET:138 139 ip_ver_t ver = udp_phdr_setup(pdu, &phdr, &phdr6); 140 switch (ver) { 141 case ip_v4: 142 142 cs_phdr = udp_checksum_calc(UDP_CHECKSUM_INIT, (void *) &phdr, 143 143 sizeof(udp_phdr_t)); 144 144 break; 145 case AF_INET6:145 case ip_v6: 146 146 cs_phdr = udp_checksum_calc(UDP_CHECKSUM_INIT, (void *) &phdr6, 147 147 sizeof(udp_phdr6_t)); … … 150 150 assert(false); 151 151 } 152 152 153 153 return udp_checksum_calc(cs_phdr, pdu->data, pdu->data_size); 154 154 }
Note:
See TracChangeset
for help on using the changeset viewer.