Changeset 03c971f in mainline for uspace/lib/c
- Timestamp:
- 2013-08-15T14:20:16Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- bb2a5b2
- Parents:
- f2c19b0 (diff), 2921602 (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. - Location:
- uspace/lib/c
- Files:
-
- 3 added
- 47 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/Makefile
rf2c19b0 r03c971f 61 61 generic/bd.c \ 62 62 generic/bd_srv.c \ 63 generic/bitops.c \ 63 64 generic/cap.c \ 64 65 generic/cfg.c \ … … 96 97 generic/inetcfg.c \ 97 98 generic/inetping.c \ 99 generic/inetping6.c \ 98 100 generic/io/asprintf.c \ 99 101 generic/io/input.c \ … … 163 165 164 166 $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld: $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld.in 165 $( GCC) $(DEFS) $(CFLAGS) -DLIBC_PATH=$(CURDIR) -E -x c $< | grep -v "^\#" > $@167 $(CC) $(DEFS) $(CFLAGS) -DLIBC_PATH=$(CURDIR) -E -x c $< | grep -v "^\#" > $@ 166 168 167 169 $(LIBC_PREFIX)/arch/$(UARCH)/_link-loader.ld: $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld.in 168 $( GCC) $(DEFS) $(CFLAGS) -DLIBC_PATH=$(CURDIR) -DLOADER -E -x c $< | grep -v "^\#" > $@170 $(CC) $(DEFS) $(CFLAGS) -DLIBC_PATH=$(CURDIR) -DLOADER -E -x c $< | grep -v "^\#" > $@ 169 171 170 172 $(LIBC_PREFIX)/arch/$(UARCH)/_link-shlib.ld: $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld.in 171 $( GCC) $(DEFS) $(CFLAGS) -DLIBC_PATH=$(CURDIR) -DSHLIB -E -x c $< | grep -v "^\#" > $@173 $(CC) $(DEFS) $(CFLAGS) -DLIBC_PATH=$(CURDIR) -DSHLIB -E -x c $< | grep -v "^\#" > $@ 172 174 173 175 $(LIBC_PREFIX)/arch/$(UARCH)/_link-dlexe.ld: $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld.in 174 $( GCC) $(DEFS) $(CFLAGS) -DLIBC_PATH=$(CURDIR) -DDLEXE -E -x c $< | grep -v "^\#" > $@176 $(CC) $(DEFS) $(CFLAGS) -DLIBC_PATH=$(CURDIR) -DDLEXE -E -x c $< | grep -v "^\#" > $@ 175 177 176 178 $(COMMON_HEADER_ARCH): $(COMMON_HEADER) -
uspace/lib/c/arch/abs32le/Makefile.common
rf2c19b0 r03c971f 27 27 # 28 28 29 ifeq ($(COMPILER),clang)30 CLANG_ARCH = i38631 endif32 33 29 ENDIANESS = LE -
uspace/lib/c/arch/amd64/Makefile.common
rf2c19b0 r03c971f 27 27 # 28 28 29 CLANG_ARCH = x86_6430 29 GCC_CFLAGS += -fno-omit-frame-pointer 30 CLANG_CFLAGS += -fno-omit-frame-pointer 31 31 32 32 ENDIANESS = LE -
uspace/lib/c/arch/amd64/src/entry.s
rf2c19b0 r03c971f 42 42 # 43 43 pushq $0 44 pushq $0 44 45 movq %rsp, %rbp 45 46 -
uspace/lib/c/arch/amd64/src/entryjmp.s
rf2c19b0 r03c971f 36 36 # Jump to program entry point 37 37 entry_point_jmp: 38 # use standard amd32 prologue not to confuse anybody 39 push %rbp 40 movq %rsp, %rbp 41 38 42 # pcb must be passed in %rdi, use %rdx as a scratch register 39 43 mov %rdi, %rdx 40 44 mov %rsi, %rdi 41 45 42 46 # jump to entry point 43 47 jmp %rdx -
uspace/lib/c/arch/amd64/src/fibril.S
rf2c19b0 r03c971f 42 42 movq (%rsp), %rdx # the caller's return %eip 43 43 44 # In %edi is passed 1st argument44 # in %edi is passed 1st argument 45 45 CONTEXT_SAVE_ARCH_CORE %rdi %rdx 46 46 47 # Save TLS47 # save TLS 48 48 movq %fs:0, %rax 49 49 movq %rax, OFFSET_TLS(%rdi) 50 51 xorl %eax, %eax 50 51 xorl %eax, %eax # context_save returns 1 52 52 incl %eax 53 53 ret 54 55 54 56 55 ## Restore current CPU context … … 64 63 65 64 movq %rdx,(%rsp) 66 65 67 66 # Set thread local storage 68 movq OFFSET_TLS(%rdi), %rdi 69 movl $1, %eax 67 movq OFFSET_TLS(%rdi), %rdi # Set arg1 to TLS addr 68 movl $1, %eax # SYS_TLS_SET 70 69 syscall 71 72 xorl %eax, %eax 70 71 xorl %eax, %eax # context_restore returns 0 73 72 ret -
uspace/lib/c/arch/amd64/src/thread_entry.s
rf2c19b0 r03c971f 39 39 # 40 40 pushq $0 41 pushq $0 41 42 movq %rsp, %rbp 42 43 43 44 # 44 45 # RAX contains address of uarg -
uspace/lib/c/arch/ia32/Makefile.common
rf2c19b0 r03c971f 27 27 # 28 28 29 CLANG_ARCH = i38630 31 29 ifeq ($(PROCESSOR),i486) 32 30 GCC_CFLAGS += -march=i486 -fno-omit-frame-pointer … … 34 32 GCC_CFLAGS += -march=pentium -fno-omit-frame-pointer 35 33 endif 34 CLANG_CFLAGS += -fno-omit-frame-pointer 36 35 37 36 ENDIANESS = LE -
uspace/lib/c/arch/ia32/include/libarch/fibril.h
rf2c19b0 r03c971f 43 43 * panic sooner or later 44 44 */ 45 #define SP_DELTA 1245 #define SP_DELTA 8 46 46 47 47 #define context_set(c, _pc, stack, size, ptls) \ -
uspace/lib/c/arch/ia32/src/entry.S
rf2c19b0 r03c971f 47 47 # Do not set %gs, it contains descriptor that can see TLS 48 48 49 #ifndef PROCESSOR_i486 49 #ifndef PROCESSOR_i486 50 50 # Detect the mechanism used for making syscalls 51 51 movl $(INTEL_CPUID_STANDARD), %eax … … 62 62 # 63 63 pushl $0 64 pushl $0 64 65 movl %esp, %ebp 65 66 -
uspace/lib/c/arch/ia32/src/entryjmp.s
rf2c19b0 r03c971f 36 36 push %ebp 37 37 movl %esp, %ebp 38 38 39 39 # %eax := entry_point 40 40 movl 0x8(%ebp), %eax 41 41 42 42 # %edi := pcb 43 43 # pcb is passed to the entry point in %edi 44 44 mov 0xc(%ebp), %edi 45 45 46 46 # Save a tiny bit of stack space 47 47 pop %ebp 48 48 49 49 jmp *%eax -
uspace/lib/c/arch/ia32/src/fibril.S
rf2c19b0 r03c971f 34 34 .global context_restore 35 35 36 37 36 ## Save current CPU context 38 37 # … … 41 40 # 42 41 context_save: 43 movl 0(%esp), %eax# the caller's return %eip44 movl 4(%esp), %edx# address of the context variable to save context to45 46 42 movl 0(%esp), %eax # the caller's return %eip 43 movl 4(%esp), %edx # address of the context variable to save context to 44 45 # save registers to the context structure 47 46 CONTEXT_SAVE_ARCH_CORE %edx %eax 48 49 # Save TLS47 48 # save TLS 50 49 movl %gs:0, %eax 51 50 movl %eax, OFFSET_TLS(%edx) # tls -> ctx->tls 52 51 53 xorl %eax, %eax# context_save returns 152 xorl %eax, %eax # context_save returns 1 54 53 incl %eax 55 54 ret 56 57 55 58 56 ## Restore saved CPU context … … 62 60 # 63 61 context_restore: 64 movl 4(%esp), %eax# address of the context variable to restore context from65 66 62 movl 4(%esp), %eax # address of the context variable to restore context from 63 64 # restore registers from the context structure 67 65 CONTEXT_RESTORE_ARCH_CORE %eax %edx 68 69 movl %edx, 0(%esp)# ctx->pc -> saver's return %eip70 71 # Set thread local storage66 67 movl %edx, 0(%esp) # ctx->pc -> saver's return %eip 68 69 # set thread local storage 72 70 pushl %edx 73 movl OFFSET_TLS(%eax), %edx 74 movl $1, %eax # Syscall SYS_TLS_SET71 movl OFFSET_TLS(%eax), %edx # Set arg1 to TLS addr 72 movl $1, %eax # Syscall SYS_TLS_SET 75 73 int $0x30 76 74 popl %edx 77 75 78 xorl %eax, %eax# context_restore returns 076 xorl %eax, %eax # context_restore returns 0 79 77 ret -
uspace/lib/c/arch/ia32/src/setjmp.S
rf2c19b0 r03c971f 35 35 .type setjmp,@function 36 36 setjmp: 37 movl 0(%esp), %eax # save pc value into eax38 movl 4(%esp), %edx # address of the jmp_buf structure to save context to37 movl 0(%esp), %eax # save pc value into eax 38 movl 4(%esp), %edx # address of the jmp_buf structure to save context to 39 39 40 40 # save registers to the jmp_buf structure 41 41 CONTEXT_SAVE_ARCH_CORE %edx %eax 42 42 43 xorl %eax, %eax# set_jmp returns 043 xorl %eax, %eax # set_jmp returns 0 44 44 ret 45 45 … … 52 52 CONTEXT_RESTORE_ARCH_CORE %ecx %edx 53 53 54 movl %edx, 0(%esp) # put saved pc on stack54 movl %edx, 0(%esp) # put saved pc on stack 55 55 ret -
uspace/lib/c/arch/ia32/src/thread_entry.s
rf2c19b0 r03c971f 40 40 mov %dx, %fs 41 41 # Do not set %gs, it contains descriptor that can see TLS 42 42 43 43 # 44 44 # Create the first stack frame. 45 45 # 46 46 pushl $0 47 pushl $0 47 48 mov %esp, %ebp 48 49 49 50 # 50 51 # EAX contains address of uarg. -
uspace/lib/c/generic/bitops.c
rf2c19b0 r03c971f 1 1 /* 2 * Copyright (c) 201 2 Jiri Svoboda2 * Copyright (c) 2013 Vojtech Horky 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 /** @addtogroup inet29 /** @addtogroup libc 30 30 * @{ 31 31 */ 32 /**33 * @file34 * @brief35 */36 32 37 #ifndef INET_UTIL_H_ 38 #define INET_UTIL_H_ 33 #include <bitops.h> 39 34 40 #include <sys/types.h> 35 extern int __popcountsi2(int a) 36 { 37 return __builtin_popcount(a); 38 } 41 39 42 uint32_t inet_netmask(int bits);43 44 #endif45 40 46 41 /** @} -
uspace/lib/c/generic/devman.c
rf2c19b0 r03c971f 413 413 sysarg_t dretval; 414 414 415 exch = devman_exchange_begin_blocking( LOC_PORT_CONSUMER);415 exch = devman_exchange_begin_blocking(DEVMAN_CLIENT); 416 416 417 417 ipc_call_t answer; -
uspace/lib/c/generic/dnsr.c
rf2c19b0 r03c971f 44 44 static async_exch_t *dnsr_exchange_begin(void) 45 45 { 46 async_sess_t *sess;47 service_id_t dnsr_svc;48 49 46 fibril_mutex_lock(&dnsr_sess_mutex); 50 47 51 48 if (dnsr_sess == NULL) { 49 service_id_t dnsr_svc; 50 52 51 (void) loc_service_get_id(SERVICE_NAME_DNSR, &dnsr_svc, 53 52 IPC_FLAG_BLOCKING); 54 53 55 54 dnsr_sess = loc_service_connect(EXCHANGE_SERIALIZE, dnsr_svc, 56 55 IPC_FLAG_BLOCKING); 57 56 } 58 59 sess = dnsr_sess;57 58 async_sess_t *sess = dnsr_sess; 60 59 fibril_mutex_unlock(&dnsr_sess_mutex); 61 60 62 61 return async_exchange_begin(sess); 63 62 } … … 68 67 } 69 68 70 int dnsr_name2host(const char *name, dnsr_hostinfo_t **rinfo )69 int dnsr_name2host(const char *name, dnsr_hostinfo_t **rinfo, uint16_t af) 71 70 { 72 async_exch_t *exch = dnsr_exchange_begin(); 73 char cname_buf[DNSR_NAME_MAX_SIZE + 1]; 74 ipc_call_t cnreply; 75 size_t act_size; 76 dnsr_hostinfo_t *info; 77 78 ipc_call_t answer; 79 aid_t req = async_send_0(exch, DNSR_NAME2HOST, &answer); 80 sysarg_t retval = async_data_write_start(exch, name, str_size(name)); 81 aid_t cnreq = async_data_read(exch, cname_buf, DNSR_NAME_MAX_SIZE, 82 &cnreply); 83 84 dnsr_exchange_end(exch); 85 86 if (retval != EOK) { 87 async_forget(req); 88 async_forget(cnreq); 89 return retval; 90 } 91 92 async_wait_for(req, &retval); 93 if (retval != EOK) { 94 async_forget(cnreq); 95 return EIO; 96 } 97 98 async_wait_for(cnreq, &retval); 99 if (retval != EOK) 100 return EIO; 101 102 info = calloc(1, sizeof(dnsr_hostinfo_t)); 71 dnsr_hostinfo_t *info = calloc(1, sizeof(dnsr_hostinfo_t)); 103 72 if (info == NULL) 104 73 return ENOMEM; 105 106 act_size = IPC_GET_ARG2(cnreply); 74 75 async_exch_t *exch = dnsr_exchange_begin(); 76 77 ipc_call_t answer; 78 aid_t req = async_send_1(exch, DNSR_NAME2HOST, (sysarg_t) af, 79 &answer); 80 81 int rc = async_data_write_start(exch, name, str_size(name)); 82 if (rc != EOK) { 83 async_exchange_end(exch); 84 async_forget(req); 85 return rc; 86 } 87 88 ipc_call_t answer_addr; 89 aid_t req_addr = async_data_read(exch, &info->addr, 90 sizeof(inet_addr_t), &answer_addr); 91 92 sysarg_t retval_addr; 93 async_wait_for(req_addr, &retval_addr); 94 95 if (retval_addr != EOK) { 96 async_exchange_end(exch); 97 async_forget(req); 98 return (int) retval_addr; 99 } 100 101 ipc_call_t answer_cname; 102 char cname_buf[DNSR_NAME_MAX_SIZE + 1]; 103 aid_t req_cname = async_data_read(exch, cname_buf, DNSR_NAME_MAX_SIZE, 104 &answer_cname); 105 106 dnsr_exchange_end(exch); 107 108 sysarg_t retval_cname; 109 async_wait_for(req_cname, &retval_cname); 110 111 if (retval_cname != EOK) { 112 async_forget(req); 113 return (int) retval_cname; 114 } 115 116 sysarg_t retval; 117 async_wait_for(req, &retval); 118 119 if (retval != EOK) 120 return (int) retval; 121 122 size_t act_size = IPC_GET_ARG2(answer_cname); 107 123 assert(act_size <= DNSR_NAME_MAX_SIZE); 124 108 125 cname_buf[act_size] = '\0'; 109 126 110 127 info->cname = str_dup(cname_buf); 111 info->addr.ipv4 = IPC_GET_ARG1(answer); 112 128 113 129 *rinfo = info; 114 130 return EOK; … … 119 135 if (info == NULL) 120 136 return; 121 137 122 138 free(info->cname); 123 139 free(info); … … 126 142 int dnsr_get_srvaddr(inet_addr_t *srvaddr) 127 143 { 128 sysarg_t addr;129 144 async_exch_t *exch = dnsr_exchange_begin(); 130 131 int rc = async_req_0_1(exch, DNSR_GET_SRVADDR, &addr); 132 dnsr_exchange_end(exch); 133 134 if (rc != EOK) 145 146 ipc_call_t answer; 147 aid_t req = async_send_0(exch, DNSR_GET_SRVADDR, &answer); 148 int rc = async_data_read_start(exch, srvaddr, sizeof(inet_addr_t)); 149 150 loc_exchange_end(exch); 151 152 if (rc != EOK) { 153 async_forget(req); 135 154 return rc; 136 137 srvaddr->ipv4 = addr; 138 return EOK; 155 } 156 157 sysarg_t retval; 158 async_wait_for(req, &retval); 159 160 return (int) retval; 139 161 } 140 162 … … 142 164 { 143 165 async_exch_t *exch = dnsr_exchange_begin(); 144 145 int rc = async_req_1_0(exch, DNSR_SET_SRVADDR, srvaddr->ipv4); 146 dnsr_exchange_end(exch); 147 148 if (rc != EOK) 166 167 ipc_call_t answer; 168 aid_t req = async_send_0(exch, DNSR_SET_SRVADDR, &answer); 169 int rc = async_data_write_start(exch, srvaddr, sizeof(inet_addr_t)); 170 171 loc_exchange_end(exch); 172 173 if (rc != EOK) { 174 async_forget(req); 149 175 return rc; 150 151 return EOK; 176 } 177 178 sysarg_t retval; 179 async_wait_for(req, &retval); 180 181 return (int) retval; 152 182 } 153 183 -
uspace/lib/c/generic/inet.c
rf2c19b0 r03c971f 30 30 #include <assert.h> 31 31 #include <errno.h> 32 #include <net/socket_codes.h> 32 33 #include <inet/inet.h> 33 34 #include <ipc/inet.h> … … 108 109 { 109 110 async_exch_t *exch = async_exchange_begin(inet_sess); 110 111 111 112 ipc_call_t answer; 112 aid_t req = async_send_5(exch, INET_SEND, dgram->src.ipv4, 113 dgram->dest.ipv4, dgram->tos, ttl, df, &answer); 114 int rc = async_data_write_start(exch, dgram->data, dgram->size); 115 async_exchange_end(exch); 116 117 if (rc != EOK) { 118 async_forget(req); 119 return rc; 120 } 121 113 aid_t req = async_send_3(exch, INET_SEND, dgram->tos, ttl, df, 114 &answer); 115 116 int rc = async_data_write_start(exch, &dgram->src, sizeof(inet_addr_t)); 117 if (rc != EOK) { 118 async_exchange_end(exch); 119 async_forget(req); 120 return rc; 121 } 122 123 rc = async_data_write_start(exch, &dgram->dest, sizeof(inet_addr_t)); 124 if (rc != EOK) { 125 async_exchange_end(exch); 126 async_forget(req); 127 return rc; 128 } 129 130 rc = async_data_write_start(exch, dgram->data, dgram->size); 131 132 async_exchange_end(exch); 133 134 if (rc != EOK) { 135 async_forget(req); 136 return rc; 137 } 138 122 139 sysarg_t retval; 123 140 async_wait_for(req, &retval); 124 if (retval != EOK) 125 return retval; 126 127 return EOK; 141 142 return (int) retval; 128 143 } 129 144 130 145 int inet_get_srcaddr(inet_addr_t *remote, uint8_t tos, inet_addr_t *local) 131 146 { 132 sysarg_t local_addr; 133 async_exch_t *exch = async_exchange_begin(inet_sess); 134 135 int rc = async_req_2_1(exch, INET_GET_SRCADDR, remote->ipv4, 136 tos, &local_addr); 137 async_exchange_end(exch); 138 139 if (rc != EOK) 140 return rc; 141 142 local->ipv4 = local_addr; 143 return EOK; 144 } 145 146 static void inet_ev_recv(ipc_callid_t callid, ipc_call_t *call) 147 { 148 int rc; 147 async_exch_t *exch = async_exchange_begin(inet_sess); 148 149 ipc_call_t answer; 150 aid_t req = async_send_1(exch, INET_GET_SRCADDR, tos, &answer); 151 152 int rc = async_data_write_start(exch, remote, sizeof(inet_addr_t)); 153 if (rc != EOK) { 154 async_exchange_end(exch); 155 async_forget(req); 156 return rc; 157 } 158 159 rc = async_data_read_start(exch, local, sizeof(inet_addr_t)); 160 161 async_exchange_end(exch); 162 163 if (rc != EOK) { 164 async_forget(req); 165 return rc; 166 } 167 168 sysarg_t retval; 169 async_wait_for(req, &retval); 170 171 return (int) retval; 172 } 173 174 static void inet_ev_recv(ipc_callid_t iid, ipc_call_t *icall) 175 { 149 176 inet_dgram_t dgram; 150 151 dgram.src.ipv4 = IPC_GET_ARG1(*call); 152 dgram.dest.ipv4 = IPC_GET_ARG2(*call); 153 dgram.tos = IPC_GET_ARG3(*call); 154 177 178 dgram.tos = IPC_GET_ARG1(*icall); 179 180 ipc_callid_t callid; 181 size_t size; 182 if (!async_data_write_receive(&callid, &size)) { 183 async_answer_0(callid, EINVAL); 184 async_answer_0(iid, EINVAL); 185 return; 186 } 187 188 if (size != sizeof(inet_addr_t)) { 189 async_answer_0(callid, EINVAL); 190 async_answer_0(iid, EINVAL); 191 return; 192 } 193 194 int rc = async_data_write_finalize(callid, &dgram.src, size); 195 if (rc != EOK) { 196 async_answer_0(callid, rc); 197 async_answer_0(iid, rc); 198 return; 199 } 200 201 if (!async_data_write_receive(&callid, &size)) { 202 async_answer_0(callid, EINVAL); 203 async_answer_0(iid, EINVAL); 204 return; 205 } 206 207 if (size != sizeof(inet_addr_t)) { 208 async_answer_0(callid, EINVAL); 209 async_answer_0(iid, EINVAL); 210 return; 211 } 212 213 rc = async_data_write_finalize(callid, &dgram.dest, size); 214 if (rc != EOK) { 215 async_answer_0(callid, rc); 216 async_answer_0(iid, rc); 217 return; 218 } 219 155 220 rc = async_data_write_accept(&dgram.data, false, 0, 0, 0, &dgram.size); 156 221 if (rc != EOK) { 157 async_answer_0( callid, rc);158 return; 159 } 160 222 async_answer_0(iid, rc); 223 return; 224 } 225 161 226 rc = inet_ev_ops->recv(&dgram); 162 async_answer_0( callid, rc);227 async_answer_0(iid, rc); 163 228 } 164 229 … … 168 233 ipc_call_t call; 169 234 ipc_callid_t callid = async_get_call(&call); 170 235 171 236 if (!IPC_GET_IMETHOD(call)) { 172 237 /* TODO: Handle hangup */ 173 238 return; 174 239 } 175 240 176 241 switch (IPC_GET_IMETHOD(call)) { 177 242 case INET_EV_RECV: -
uspace/lib/c/generic/inet/addr.c
rf2c19b0 r03c971f 34 34 35 35 #include <errno.h> 36 #include <unistd.h> 37 #include <net/socket_codes.h> 36 38 #include <inet/addr.h> 39 #include <net/inet.h> 37 40 #include <stdio.h> 41 #include <malloc.h> 42 #include <bitops.h> 43 44 #define INET_PREFIXSTRSIZE 5 45 46 #if !(defined(__BE__) ^ defined(__LE__)) 47 #error The architecture must be either big-endian or little-endian. 48 #endif 49 50 const addr48_t addr48_broadcast = { 51 0xff, 0xff, 0xff, 0xff, 0xff, 0xff 52 }; 53 54 static const addr48_t inet_addr48_solicited_node = { 55 0x33, 0x33, 0xff, 0, 0, 0 56 }; 57 58 static const inet_addr_t inet_addr_any_addr = { 59 .family = AF_INET, 60 .addr = 0 61 }; 62 63 static const inet_addr_t inet_addr_any_addr6 = { 64 .family = AF_INET6, 65 .addr6 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} 66 }; 67 68 void addr48(const addr48_t src, addr48_t dst) 69 { 70 memcpy(dst, src, 6); 71 } 72 73 void addr128(const addr128_t src, addr128_t dst) 74 { 75 memcpy(dst, src, 16); 76 } 77 78 int addr48_compare(const addr48_t a, const addr48_t b) 79 { 80 return memcmp(a, b, 6); 81 } 82 83 int addr128_compare(const addr128_t a, const addr128_t b) 84 { 85 return memcmp(a, b, 16); 86 } 87 88 /** Compute solicited node MAC multicast address from target IPv6 address 89 * 90 * @param ip Target IPv6 address 91 * @param mac Solicited MAC address to be assigned 92 * 93 */ 94 void addr48_solicited_node(const addr128_t ip, addr48_t mac) 95 { 96 memcpy(mac, inet_addr48_solicited_node, 3); 97 memcpy(mac + 3, ip + 13, 3); 98 } 99 100 void host2addr128_t_be(const addr128_t host, addr128_t be) 101 { 102 #ifdef __BE__ 103 memcpy(be, host, 16); 104 #else 105 be[0] = host[15]; 106 be[1] = host[14]; 107 be[2] = host[13]; 108 be[3] = host[12]; 109 be[4] = host[11]; 110 be[5] = host[10]; 111 be[6] = host[9]; 112 be[7] = host[8]; 113 be[8] = host[7]; 114 be[9] = host[6]; 115 be[10] = host[5]; 116 be[11] = host[4]; 117 be[12] = host[3]; 118 be[13] = host[2]; 119 be[14] = host[1]; 120 be[15] = host[0]; 121 #endif 122 } 123 124 void addr128_t_be2host(const addr128_t be, addr128_t host) 125 { 126 #ifdef __BE__ 127 memcpy(host, be, 16); 128 #else 129 host[0] = be[15]; 130 host[1] = be[14]; 131 host[2] = be[13]; 132 host[3] = be[12]; 133 host[4] = be[11]; 134 host[5] = be[10]; 135 host[6] = be[9]; 136 host[7] = be[8]; 137 host[8] = be[7]; 138 host[9] = be[6]; 139 host[10] = be[5]; 140 host[11] = be[4]; 141 host[12] = be[3]; 142 host[13] = be[2]; 143 host[14] = be[1]; 144 host[15] = be[0]; 145 #endif 146 } 147 148 void inet_addr(inet_addr_t *addr, uint8_t a, uint8_t b, uint8_t c, uint8_t d) 149 { 150 addr->family = AF_INET; 151 addr->addr = ((addr32_t) a << 24) | ((addr32_t) b << 16) | 152 ((addr32_t) c << 8) | ((addr32_t) d); 153 } 154 155 void inet_naddr(inet_naddr_t *naddr, uint8_t a, uint8_t b, uint8_t c, uint8_t d, 156 uint8_t prefix) 157 { 158 naddr->family = AF_INET; 159 naddr->addr = ((addr32_t) a << 24) | ((addr32_t) b << 16) | 160 ((addr32_t) c << 8) | ((addr32_t) d); 161 naddr->prefix = prefix; 162 } 163 164 void inet_addr6(inet_addr_t *addr, uint16_t a, uint16_t b, uint16_t c, 165 uint16_t d, uint16_t e, uint16_t f, uint16_t g, uint16_t h) 166 { 167 addr->family = AF_INET6; 168 addr->addr6[0] = (a >> 8) & 0xff; 169 addr->addr6[1] = a & 0xff; 170 addr->addr6[2] = (b >> 8) & 0xff; 171 addr->addr6[3] = b & 0xff; 172 addr->addr6[4] = (c >> 8) & 0xff; 173 addr->addr6[5] = c & 0xff; 174 addr->addr6[6] = (d >> 8) & 0xff; 175 addr->addr6[7] = d & 0xff; 176 addr->addr6[8] = (e >> 8) & 0xff; 177 addr->addr6[9] = e & 0xff; 178 addr->addr6[10] = (f >> 8) & 0xff; 179 addr->addr6[11] = f & 0xff; 180 addr->addr6[12] = (g >> 8) & 0xff; 181 addr->addr6[13] = g & 0xff; 182 addr->addr6[14] = (h >> 8) & 0xff; 183 addr->addr6[15] = h & 0xff; 184 } 185 186 void inet_naddr6(inet_naddr_t *naddr, uint16_t a, uint16_t b, uint16_t c, 187 uint16_t d, uint16_t e, uint16_t f, uint16_t g, uint16_t h, uint8_t prefix) 188 { 189 naddr->family = AF_INET6; 190 naddr->addr6[0] = (a >> 8) & 0xff; 191 naddr->addr6[1] = a & 0xff; 192 naddr->addr6[2] = (b >> 8) & 0xff; 193 naddr->addr6[3] = b & 0xff; 194 naddr->addr6[4] = (c >> 8) & 0xff; 195 naddr->addr6[5] = c & 0xff; 196 naddr->addr6[6] = (d >> 8) & 0xff; 197 naddr->addr6[7] = d & 0xff; 198 naddr->addr6[8] = (e >> 8) & 0xff; 199 naddr->addr6[9] = e & 0xff; 200 naddr->addr6[10] = (f >> 8) & 0xff; 201 naddr->addr6[11] = f & 0xff; 202 naddr->addr6[12] = (g >> 8) & 0xff; 203 naddr->addr6[13] = g & 0xff; 204 naddr->addr6[14] = (h >> 8) & 0xff; 205 naddr->addr6[15] = h & 0xff; 206 naddr->prefix = prefix; 207 } 208 209 /** Parse network address family. 210 * 211 * @param text Network address in common notation. 212 * @param af Place to store network address family. 213 * 214 * @return EOK on success, EINVAL if input is not in valid format. 215 * 216 */ 217 int inet_addr_family(const char *text, uint16_t *af) 218 { 219 char *dot = str_chr(text, '.'); 220 if (dot != NULL) { 221 *af = AF_INET; 222 return EOK; 223 } 224 225 char *collon = str_chr(text, ':'); 226 if (collon != NULL) { 227 *af = AF_INET6; 228 return EOK; 229 } 230 231 return EINVAL; 232 } 233 234 void inet_naddr_addr(const inet_naddr_t *naddr, inet_addr_t *addr) 235 { 236 addr->family = naddr->family; 237 memcpy(addr->addr6, naddr->addr6, 16); 238 } 239 240 void inet_addr_naddr(const inet_addr_t *addr, uint8_t prefix, 241 inet_naddr_t *naddr) 242 { 243 naddr->family = addr->family; 244 memcpy(naddr->addr6, addr->addr6, 16); 245 naddr->prefix = prefix; 246 } 247 248 void inet_addr_any(inet_addr_t *addr) 249 { 250 addr->family = AF_NONE; 251 memset(addr->addr6, 0, 16); 252 } 253 254 void inet_naddr_any(inet_naddr_t *naddr) 255 { 256 naddr->family = AF_NONE; 257 memset(naddr->addr6, 0, 16); 258 naddr->prefix = 0; 259 } 260 261 int inet_addr_compare(const inet_addr_t *a, const inet_addr_t *b) 262 { 263 if (a->family != b->family) 264 return 0; 265 266 switch (a->family) { 267 case AF_INET: 268 return (a->addr == b->addr); 269 case AF_INET6: 270 return addr128_compare(a->addr6, b->addr6); 271 default: 272 return 0; 273 } 274 } 275 276 int inet_addr_is_any(const inet_addr_t *addr) 277 { 278 return ((addr->family == 0) || 279 (inet_addr_compare(addr, &inet_addr_any_addr)) || 280 (inet_addr_compare(addr, &inet_addr_any_addr6))); 281 } 282 283 int inet_naddr_compare(const inet_naddr_t *naddr, const inet_addr_t *addr) 284 { 285 if (naddr->family != addr->family) 286 return 0; 287 288 switch (naddr->family) { 289 case AF_INET: 290 return (naddr->addr == addr->addr); 291 case AF_INET6: 292 return addr128_compare(naddr->addr6, addr->addr6); 293 default: 294 return 0; 295 } 296 } 297 298 int inet_naddr_compare_mask(const inet_naddr_t *naddr, const inet_addr_t *addr) 299 { 300 if (naddr->family != addr->family) 301 return 0; 302 303 switch (naddr->family) { 304 case AF_INET: 305 if (naddr->prefix > 32) 306 return 0; 307 308 addr32_t mask = 309 BIT_RANGE(addr32_t, 31, 31 - (naddr->prefix - 1)); 310 return ((naddr->addr & mask) == (addr->addr & mask)); 311 case AF_INET6: 312 if (naddr->prefix > 128) 313 return 0; 314 315 size_t pos = 0; 316 for (size_t i = 0; i < 16; i++) { 317 /* Further bits do not matter */ 318 if (naddr->prefix < pos) 319 break; 320 321 if (naddr->prefix - pos > 8) { 322 /* Comparison without masking */ 323 if (naddr->addr6[i] != addr->addr6[i]) 324 return 0; 325 } else { 326 /* Comparison with masking */ 327 uint8_t mask = 328 BIT_RANGE(uint8_t, 8, 8 - (naddr->prefix - pos - 1)); 329 if ((naddr->addr6[i] & mask) != (addr->addr6[i] & mask)) 330 return 0; 331 } 332 333 pos += 8; 334 } 335 336 return 1; 337 default: 338 return 0; 339 } 340 } 341 342 /** Parse node address. 343 * 344 * @param text Network address in common notation. 345 * @param addr Place to store node address. 346 * 347 * @return EOK on success, EINVAL if input is not in valid format. 348 * 349 */ 350 int inet_addr_parse(const char *text, inet_addr_t *addr) 351 { 352 int rc = inet_addr_family(text, &addr->family); 353 if (rc != EOK) 354 return rc; 355 356 uint8_t buf[16]; 357 rc = inet_pton(addr->family, text, buf); 358 if (rc != EOK) 359 return rc; 360 361 switch (addr->family) { 362 case AF_INET: 363 addr->addr = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | 364 buf[3]; 365 break; 366 case AF_INET6: 367 memcpy(addr->addr6, buf, 16); 368 break; 369 default: 370 return EINVAL; 371 } 372 373 return EOK; 374 } 38 375 39 376 /** Parse network address. 40 377 * 41 * @param text Network address in CIDR notation (a.b.c.d/w) 42 * @param naddr Place to store network address 43 * 44 * @return EOK on success, EINVAL if input is not in valid format 378 * @param text Network address in common notation. 379 * @param naddr Place to store network address. 380 * 381 * @return EOK on success, EINVAL if input is not in valid format. 382 * 45 383 */ 46 384 int inet_naddr_parse(const char *text, inet_naddr_t *naddr) 47 385 { 48 unsigned long a[4], bits; 49 char *cp = (char *)text; 50 int i; 51 52 for (i = 0; i < 3; i++) { 53 a[i] = strtoul(cp, &cp, 10); 54 if (*cp != '.') 386 char *slash = str_chr(text, '/'); 387 if (slash == NULL) 388 return EINVAL; 389 390 *slash = 0; 391 392 int rc = inet_addr_family(text, &naddr->family); 393 if (rc != EOK) 394 return rc; 395 396 uint8_t buf[16]; 397 rc = inet_pton(naddr->family, text, buf); 398 *slash = '/'; 399 400 if (rc != EOK) 401 return rc; 402 403 slash++; 404 uint8_t prefix; 405 406 switch (naddr->family) { 407 case AF_INET: 408 prefix = strtoul(slash, &slash, 10); 409 if (prefix > 32) 55 410 return EINVAL; 56 ++cp; 57 } 58 59 a[3] = strtoul(cp, &cp, 10); 60 if (*cp != '/') 61 return EINVAL; 62 ++cp; 63 64 bits = strtoul(cp, &cp, 10); 65 if (*cp != '\0') 66 return EINVAL; 67 68 naddr->ipv4 = 0; 69 for (i = 0; i < 4; i++) { 70 if (a[i] > 255) 411 412 naddr->addr = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | 413 buf[3]; 414 naddr->prefix = prefix; 415 416 break; 417 case AF_INET6: 418 prefix = strtoul(slash, &slash, 10); 419 if (prefix > 128) 71 420 return EINVAL; 72 naddr->ipv4 = (naddr->ipv4 << 8) | a[i]; 73 } 74 75 if (bits > 31) 76 return EINVAL; 77 78 naddr->bits = bits; 421 422 memcpy(naddr->addr6, buf, 16); 423 naddr->prefix = prefix; 424 425 break; 426 default: 427 return ENOTSUP; 428 } 429 79 430 return EOK; 80 431 } 81 432 82 /** Parse node address. 83 * 84 * @param text Network address in dot notation (a.b.c.d) 85 * @param addr Place to store node address 86 * 87 * @return EOK on success, EINVAL if input is not in valid format 88 */ 89 int inet_addr_parse(const char *text, inet_addr_t *addr) 90 { 91 unsigned long a[4]; 92 char *cp = (char *)text; 93 int i; 94 95 for (i = 0; i < 3; i++) { 96 a[i] = strtoul(cp, &cp, 10); 97 if (*cp != '.') 98 return EINVAL; 99 ++cp; 100 } 101 102 a[3] = strtoul(cp, &cp, 10); 103 if (*cp != '\0') 104 return EINVAL; 105 106 addr->ipv4 = 0; 107 for (i = 0; i < 4; i++) { 108 if (a[i] > 255) 109 return EINVAL; 110 addr->ipv4 = (addr->ipv4 << 8) | a[i]; 111 } 112 113 return EOK; 114 } 115 116 /** Format network address. 117 * 118 * @param naddr Network address 119 * @param bufp Place to store pointer to formatted string (CIDR notation) 120 * 121 * @return EOK on success, ENOMEM if out of memory. 122 */ 123 int inet_naddr_format(inet_naddr_t *naddr, char **bufp) 124 { 125 int rc; 126 127 rc = asprintf(bufp, "%d.%d.%d.%d/%d", naddr->ipv4 >> 24, 128 (naddr->ipv4 >> 16) & 0xff, (naddr->ipv4 >> 8) & 0xff, 129 naddr->ipv4 & 0xff, naddr->bits); 130 433 /** Format node address. 434 * 435 * @param addr Node address. 436 * @param bufp Place to store pointer to formatted string. 437 * 438 * @return EOK on success. 439 * @return ENOMEM if out of memory. 440 * @return ENOTSUP on unsupported address family. 441 * 442 */ 443 int inet_addr_format(const inet_addr_t *addr, char **bufp) 444 { 445 int rc = 0; 446 447 switch (addr->family) { 448 case AF_NONE: 449 rc = asprintf(bufp, "none"); 450 break; 451 case AF_INET: 452 rc = asprintf(bufp, "%u.%u.%u.%u", (addr->addr >> 24) & 0xff, 453 (addr->addr >> 16) & 0xff, (addr->addr >> 8) & 0xff, 454 addr->addr & 0xff); 455 break; 456 case AF_INET6: 457 *bufp = (char *) malloc(INET6_ADDRSTRLEN); 458 if (*bufp == NULL) 459 return ENOMEM; 460 461 return inet_ntop(AF_INET6, addr->addr6, *bufp, INET6_ADDRSTRLEN); 462 default: 463 return ENOTSUP; 464 } 465 131 466 if (rc < 0) 132 467 return ENOMEM; 133 468 134 469 return EOK; 135 470 } 136 471 137 /** Format node address. 138 * 139 * @param addr Node address 140 * @param bufp Place to store pointer to formatted string (dot notation) 141 * 142 * @return EOK on success, ENOMEM if out of memory. 143 */ 144 int inet_addr_format(inet_addr_t *addr, char **bufp) 145 { 146 int rc; 147 148 rc = asprintf(bufp, "%d.%d.%d.%d", addr->ipv4 >> 24, 149 (addr->ipv4 >> 16) & 0xff, (addr->ipv4 >> 8) & 0xff, 150 addr->ipv4 & 0xff); 151 472 /** Format network address. 473 * 474 * @param naddr Network address. 475 * @param bufp Place to store pointer to formatted string. 476 * 477 * @return EOK on success. 478 * @return ENOMEM if out of memory. 479 * @return ENOTSUP on unsupported address family. 480 * 481 */ 482 int inet_naddr_format(const inet_naddr_t *naddr, char **bufp) 483 { 484 int rc = 0; 485 char prefix[INET_PREFIXSTRSIZE]; 486 487 switch (naddr->family) { 488 case AF_NONE: 489 rc = asprintf(bufp, "none"); 490 break; 491 case AF_INET: 492 rc = asprintf(bufp, "%" PRIu8 ".%" PRIu8 ".%" PRIu8 ".%" PRIu8 493 "/%" PRIu8, (naddr->addr >> 24) & 0xff, 494 (naddr->addr >> 16) & 0xff, (naddr->addr >> 8) & 0xff, 495 naddr->addr & 0xff, naddr->prefix); 496 break; 497 case AF_INET6: 498 *bufp = (char *) malloc(INET6_ADDRSTRLEN + INET_PREFIXSTRSIZE); 499 if (*bufp == NULL) 500 return ENOMEM; 501 502 rc = inet_ntop(AF_INET6, naddr->addr6, *bufp, 503 INET6_ADDRSTRLEN + INET_PREFIXSTRSIZE); 504 if (rc != EOK) { 505 free(*bufp); 506 return rc; 507 } 508 509 rc = snprintf(prefix, INET_PREFIXSTRSIZE, "/%" PRIu8, 510 naddr->prefix); 511 if (rc < 0) { 512 free(*bufp); 513 return ENOMEM; 514 } 515 516 str_append(*bufp, INET6_ADDRSTRLEN + INET_PREFIXSTRSIZE, prefix); 517 518 break; 519 default: 520 return ENOTSUP; 521 } 522 152 523 if (rc < 0) 153 524 return ENOMEM; 154 525 155 526 return EOK; 156 527 } 157 528 529 uint16_t inet_addr_get(const inet_addr_t *addr, addr32_t *v4, addr128_t *v6) 530 { 531 switch (addr->family) { 532 case AF_INET: 533 if (v4 != NULL) 534 *v4 = addr->addr; 535 536 break; 537 case AF_INET6: 538 if (v6 != NULL) 539 memcpy(*v6, addr->addr6, 16); 540 541 break; 542 } 543 544 return addr->family; 545 } 546 547 uint16_t inet_naddr_get(const inet_naddr_t *naddr, addr32_t *v4, addr128_t *v6, 548 uint8_t *prefix) 549 { 550 switch (naddr->family) { 551 case AF_INET: 552 if (v4 != NULL) 553 *v4 = naddr->addr; 554 555 if (prefix != NULL) 556 *prefix = naddr->prefix; 557 558 break; 559 case AF_INET6: 560 if (v6 != NULL) 561 memcpy(*v6, naddr->addr6, 16); 562 563 if (prefix != NULL) 564 *prefix = naddr->prefix; 565 566 break; 567 } 568 569 return naddr->family; 570 } 571 572 void inet_addr_set(addr32_t v4, inet_addr_t *addr) 573 { 574 addr->family = AF_INET; 575 addr->addr = v4; 576 } 577 578 void inet_naddr_set(addr32_t v4, uint8_t prefix, inet_naddr_t *naddr) 579 { 580 naddr->family = AF_INET; 581 naddr->addr = v4; 582 naddr->prefix = prefix; 583 } 584 585 void inet_sockaddr_in_addr(const sockaddr_in_t *sockaddr_in, inet_addr_t *addr) 586 { 587 addr->family = AF_INET; 588 addr->addr = uint32_t_be2host(sockaddr_in->sin_addr.s_addr); 589 } 590 591 void inet_addr_set6(addr128_t v6, inet_addr_t *addr) 592 { 593 addr->family = AF_INET6; 594 memcpy(addr->addr6, v6, 16); 595 } 596 597 void inet_naddr_set6(addr128_t v6, uint8_t prefix, inet_naddr_t *naddr) 598 { 599 naddr->family = AF_INET6; 600 memcpy(naddr->addr6, v6, 16); 601 naddr->prefix = prefix; 602 } 603 604 void inet_sockaddr_in6_addr(const sockaddr_in6_t *sockaddr_in6, 605 inet_addr_t *addr) 606 { 607 addr->family = AF_INET6; 608 addr128_t_be2host(sockaddr_in6->sin6_addr.s6_addr, addr->addr6); 609 } 610 611 uint16_t inet_addr_sockaddr_in(const inet_addr_t *addr, 612 sockaddr_in_t *sockaddr_in, sockaddr_in6_t *sockaddr_in6) 613 { 614 switch (addr->family) { 615 case AF_INET: 616 if (sockaddr_in != NULL) { 617 sockaddr_in->sin_family = AF_INET; 618 sockaddr_in->sin_addr.s_addr = host2uint32_t_be(addr->addr); 619 } 620 621 break; 622 case AF_INET6: 623 if (sockaddr_in6 != NULL) { 624 sockaddr_in6->sin6_family = AF_INET6; 625 host2addr128_t_be(addr->addr6, sockaddr_in6->sin6_addr.s6_addr); 626 } 627 628 break; 629 } 630 631 return addr->family; 632 } 633 158 634 /** @} 159 635 */ -
uspace/lib/c/generic/inetcfg.c
rf2c19b0 r03c971f 137 137 { 138 138 async_exch_t *exch = async_exchange_begin(inetcfg_sess); 139 140 ipc_call_t answer; 141 aid_t req = async_send_3(exch, INETCFG_ADDR_CREATE_STATIC, naddr->ipv4, 142 naddr->bits, link_id, &answer); 139 140 ipc_call_t answer; 141 aid_t req = async_send_1(exch, INETCFG_ADDR_CREATE_STATIC, link_id, 142 &answer); 143 144 int rc = async_data_write_start(exch, naddr, sizeof(inet_naddr_t)); 145 if (rc != EOK) { 146 async_exchange_end(exch); 147 async_forget(req); 148 return rc; 149 } 150 151 rc = async_data_write_start(exch, name, str_size(name)); 152 153 async_exchange_end(exch); 154 155 if (rc != EOK) { 156 async_forget(req); 157 return rc; 158 } 159 160 sysarg_t retval; 161 async_wait_for(req, &retval); 162 163 *addr_id = IPC_GET_ARG1(answer); 164 165 return (int) retval; 166 } 167 168 int inetcfg_addr_delete(sysarg_t addr_id) 169 { 170 async_exch_t *exch = async_exchange_begin(inetcfg_sess); 171 172 int rc = async_req_1_0(exch, INETCFG_ADDR_DELETE, addr_id); 173 async_exchange_end(exch); 174 175 return rc; 176 } 177 178 int inetcfg_addr_get(sysarg_t addr_id, inet_addr_info_t *ainfo) 179 { 180 async_exch_t *exch = async_exchange_begin(inetcfg_sess); 181 182 ipc_call_t answer; 183 aid_t req = async_send_1(exch, INETCFG_ADDR_GET, addr_id, &answer); 184 185 ipc_call_t answer_naddr; 186 aid_t req_naddr = async_data_read(exch, &ainfo->naddr, 187 sizeof(inet_naddr_t), &answer_naddr); 188 189 sysarg_t retval_naddr; 190 async_wait_for(req_naddr, &retval_naddr); 191 192 if (retval_naddr != EOK) { 193 async_exchange_end(exch); 194 async_forget(req); 195 return (int) retval_naddr; 196 } 197 198 ipc_call_t answer_name; 199 char name_buf[LOC_NAME_MAXLEN + 1]; 200 aid_t req_name = async_data_read(exch, name_buf, LOC_NAME_MAXLEN, 201 &answer_name); 202 203 async_exchange_end(exch); 204 205 sysarg_t retval_name; 206 async_wait_for(req_name, &retval_name); 207 208 if (retval_name != EOK) { 209 async_forget(req); 210 return (int) retval_name; 211 } 212 213 sysarg_t retval; 214 async_wait_for(req, &retval); 215 216 if (retval != EOK) 217 return (int) retval; 218 219 size_t act_size = IPC_GET_ARG2(answer_name); 220 assert(act_size <= LOC_NAME_MAXLEN); 221 222 name_buf[act_size] = '\0'; 223 224 ainfo->ilink = IPC_GET_ARG1(answer); 225 ainfo->name = str_dup(name_buf); 226 227 return EOK; 228 } 229 230 int inetcfg_addr_get_id(const char *name, sysarg_t link_id, sysarg_t *addr_id) 231 { 232 async_exch_t *exch = async_exchange_begin(inetcfg_sess); 233 234 ipc_call_t answer; 235 aid_t req = async_send_1(exch, INETCFG_ADDR_GET_ID, link_id, &answer); 143 236 sysarg_t retval = async_data_write_start(exch, name, str_size(name)); 144 237 … … 156 249 } 157 250 158 int inetcfg_addr_delete(sysarg_t addr_id) 159 { 160 async_exch_t *exch = async_exchange_begin(inetcfg_sess); 161 162 int rc = async_req_1_0(exch, INETCFG_ADDR_DELETE, addr_id); 163 async_exchange_end(exch); 164 165 return rc; 166 } 167 168 int inetcfg_addr_get(sysarg_t addr_id, inet_addr_info_t *ainfo) 251 int inetcfg_get_addr_list(sysarg_t **addrs, size_t *count) 252 { 253 return inetcfg_get_ids_internal(INETCFG_GET_ADDR_LIST, 254 0, addrs, count); 255 } 256 257 int inetcfg_get_link_list(sysarg_t **links, size_t *count) 258 { 259 return inetcfg_get_ids_internal(INETCFG_GET_LINK_LIST, 260 0, links, count); 261 } 262 263 int inetcfg_get_sroute_list(sysarg_t **sroutes, size_t *count) 264 { 265 return inetcfg_get_ids_internal(INETCFG_GET_SROUTE_LIST, 266 0, sroutes, count); 267 } 268 269 int inetcfg_link_get(sysarg_t link_id, inet_link_info_t *linfo) 169 270 { 170 271 ipc_call_t dreply; … … 176 277 177 278 ipc_call_t answer; 178 aid_t req = async_send_1(exch, INETCFG_ ADDR_GET, addr_id, &answer);279 aid_t req = async_send_1(exch, INETCFG_LINK_GET, link_id, &answer); 179 280 aid_t dreq = async_data_read(exch, name_buf, LOC_NAME_MAXLEN, &dreply); 180 281 async_wait_for(dreq, &dretval); … … 197 298 name_buf[act_size] = '\0'; 198 299 199 ainfo->naddr.ipv4 = IPC_GET_ARG1(answer);200 ainfo->naddr.bits = IPC_GET_ARG2(answer);201 ainfo->ilink = IPC_GET_ARG3(answer);202 ainfo->name = str_dup(name_buf);203 204 return EOK;205 }206 207 int inetcfg_addr_get_id(const char *name, sysarg_t link_id, sysarg_t *addr_id)208 {209 async_exch_t *exch = async_exchange_begin(inetcfg_sess);210 211 ipc_call_t answer;212 aid_t req = async_send_1(exch, INETCFG_ADDR_GET_ID, link_id, &answer);213 sysarg_t retval = async_data_write_start(exch, name, str_size(name));214 215 async_exchange_end(exch);216 217 if (retval != EOK) {218 async_forget(req);219 return retval;220 }221 222 async_wait_for(req, &retval);223 *addr_id = IPC_GET_ARG1(answer);224 225 return retval;226 }227 228 int inetcfg_get_addr_list(sysarg_t **addrs, size_t *count)229 {230 return inetcfg_get_ids_internal(INETCFG_GET_ADDR_LIST,231 0, addrs, count);232 }233 234 int inetcfg_get_link_list(sysarg_t **links, size_t *count)235 {236 return inetcfg_get_ids_internal(INETCFG_GET_LINK_LIST,237 0, links, count);238 }239 240 int inetcfg_get_sroute_list(sysarg_t **sroutes, size_t *count)241 {242 return inetcfg_get_ids_internal(INETCFG_GET_SROUTE_LIST,243 0, sroutes, count);244 }245 246 int inetcfg_link_get(sysarg_t link_id, inet_link_info_t *linfo)247 {248 ipc_call_t dreply;249 sysarg_t dretval;250 size_t act_size;251 char name_buf[LOC_NAME_MAXLEN + 1];252 253 async_exch_t *exch = async_exchange_begin(inetcfg_sess);254 255 ipc_call_t answer;256 aid_t req = async_send_1(exch, INETCFG_LINK_GET, link_id, &answer);257 aid_t dreq = async_data_read(exch, name_buf, LOC_NAME_MAXLEN, &dreply);258 async_wait_for(dreq, &dretval);259 260 async_exchange_end(exch);261 262 if (dretval != EOK) {263 async_forget(req);264 return dretval;265 }266 267 sysarg_t retval;268 async_wait_for(req, &retval);269 270 if (retval != EOK)271 return retval;272 273 act_size = IPC_GET_ARG2(dreply);274 assert(act_size <= LOC_NAME_MAXLEN);275 name_buf[act_size] = '\0';276 277 300 linfo->name = str_dup(name_buf); 278 301 linfo->def_mtu = IPC_GET_ARG1(answer); … … 285 308 { 286 309 async_exch_t *exch = async_exchange_begin(inetcfg_sess); 287 288 ipc_call_t answer; 289 aid_t req = async_send_3(exch, INETCFG_SROUTE_CREATE, 290 dest->ipv4, dest->bits, router->ipv4, &answer); 291 sysarg_t retval = async_data_write_start(exch, name, str_size(name)); 292 293 async_exchange_end(exch); 294 295 if (retval != EOK) { 296 async_forget(req); 297 return retval; 298 } 299 300 async_wait_for(req, &retval); 310 311 ipc_call_t answer; 312 aid_t req = async_send_0(exch, INETCFG_SROUTE_CREATE, &answer); 313 314 int rc = async_data_write_start(exch, dest, sizeof(inet_naddr_t)); 315 if (rc != EOK) { 316 async_exchange_end(exch); 317 async_forget(req); 318 return rc; 319 } 320 321 rc = async_data_write_start(exch, router, sizeof(inet_addr_t)); 322 if (rc != EOK) { 323 async_exchange_end(exch); 324 async_forget(req); 325 return rc; 326 } 327 328 rc = async_data_write_start(exch, name, str_size(name)); 329 330 async_exchange_end(exch); 331 332 if (rc != EOK) { 333 async_forget(req); 334 return rc; 335 } 336 337 sysarg_t retval; 338 async_wait_for(req, &retval); 339 301 340 *sroute_id = IPC_GET_ARG1(answer); 302 303 return retval;341 342 return (int) retval; 304 343 } 305 344 … … 316 355 int inetcfg_sroute_get(sysarg_t sroute_id, inet_sroute_info_t *srinfo) 317 356 { 318 ipc_call_t dreply; 319 sysarg_t dretval; 320 size_t act_size; 357 async_exch_t *exch = async_exchange_begin(inetcfg_sess); 358 359 ipc_call_t answer; 360 aid_t req = async_send_1(exch, INETCFG_SROUTE_GET, sroute_id, &answer); 361 362 ipc_call_t answer_dest; 363 aid_t req_dest = async_data_read(exch, &srinfo->dest, 364 sizeof(inet_naddr_t), &answer_dest); 365 366 sysarg_t retval_dest; 367 async_wait_for(req_dest, &retval_dest); 368 369 if (retval_dest != EOK) { 370 async_exchange_end(exch); 371 async_forget(req); 372 return (int) retval_dest; 373 } 374 375 ipc_call_t answer_router; 376 aid_t req_router = async_data_read(exch, &srinfo->router, 377 sizeof(inet_addr_t), &answer_router); 378 379 sysarg_t retval_router; 380 async_wait_for(req_router, &retval_router); 381 382 if (retval_router != EOK) { 383 async_exchange_end(exch); 384 async_forget(req); 385 return (int) retval_router; 386 } 387 388 ipc_call_t answer_name; 321 389 char name_buf[LOC_NAME_MAXLEN + 1]; 322 323 async_exch_t *exch = async_exchange_begin(inetcfg_sess); 324 325 ipc_call_t answer; 326 aid_t req = async_send_1(exch, INETCFG_SROUTE_GET, sroute_id, &answer); 327 aid_t dreq = async_data_read(exch, name_buf, LOC_NAME_MAXLEN, &dreply); 328 async_wait_for(dreq, &dretval); 329 330 async_exchange_end(exch); 331 332 if (dretval != EOK) { 333 async_forget(req); 334 return dretval; 335 } 336 337 sysarg_t retval; 338 async_wait_for(req, &retval); 339 390 aid_t req_name = async_data_read(exch, name_buf, LOC_NAME_MAXLEN, 391 &answer_name); 392 393 async_exchange_end(exch); 394 395 sysarg_t retval_name; 396 async_wait_for(req_name, &retval_name); 397 398 if (retval_name != EOK) { 399 async_forget(req); 400 return (int) retval_name; 401 } 402 403 sysarg_t retval; 404 async_wait_for(req, &retval); 405 340 406 if (retval != EOK) 341 return retval;342 343 act_size = IPC_GET_ARG2(dreply);407 return (int) retval; 408 409 size_t act_size = IPC_GET_ARG2(answer_name); 344 410 assert(act_size <= LOC_NAME_MAXLEN); 411 345 412 name_buf[act_size] = '\0'; 346 347 srinfo->dest.ipv4 = IPC_GET_ARG1(answer); 348 srinfo->dest.bits = IPC_GET_ARG2(answer); 349 srinfo->router.ipv4 = IPC_GET_ARG3(answer); 413 350 414 srinfo->name = str_dup(name_buf); 351 415 352 416 return EOK; 353 417 } -
uspace/lib/c/generic/inetping.c
rf2c19b0 r03c971f 79 79 { 80 80 async_exch_t *exch = async_exchange_begin(inetping_sess); 81 81 82 82 ipc_call_t answer; 83 aid_t req = async_send_3(exch, INETPING_SEND, sdu->src.ipv4,84 sdu->dest.ipv4, sdu->seq_no, &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 85 sysarg_t retval = async_data_write_start(exch, sdu->data, sdu->size); 86 86 87 87 async_exchange_end(exch); 88 88 89 89 if (retval != EOK) { 90 90 async_forget(req); 91 91 return retval; 92 92 } 93 93 94 94 async_wait_for(req, &retval); 95 95 return retval; 96 96 } 97 97 98 int inetping_get_srcaddr( inet_addr_t *remote, inet_addr_t *local)98 int inetping_get_srcaddr(uint32_t remote, uint32_t *local) 99 99 { 100 async_exch_t *exch = async_exchange_begin(inetping_sess); 101 100 102 sysarg_t local_addr; 101 async_exch_t *exch = async_exchange_begin(inetping_sess); 102 103 int rc = async_req_1_1(exch, INETPING_GET_SRCADDR, remote->ipv4, 103 int rc = async_req_1_1(exch, INETPING_GET_SRCADDR, (sysarg_t) remote, 104 104 &local_addr); 105 105 106 async_exchange_end(exch); 106 107 107 108 if (rc != EOK) 108 109 return rc; 109 110 local->ipv4 =local_addr;110 111 *local = (uint32_t) local_addr; 111 112 return EOK; 112 113 } … … 114 115 static void inetping_ev_recv(ipc_callid_t callid, ipc_call_t *call) 115 116 { 116 int rc;117 117 inetping_sdu_t sdu; 118 119 sdu.src .ipv4= IPC_GET_ARG1(*call);120 sdu.dest .ipv4= IPC_GET_ARG2(*call);118 119 sdu.src = IPC_GET_ARG1(*call); 120 sdu.dest = IPC_GET_ARG2(*call); 121 121 sdu.seq_no = IPC_GET_ARG3(*call); 122 123 rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, &sdu.size);122 123 int rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, &sdu.size); 124 124 if (rc != EOK) { 125 125 async_answer_0(callid, rc); 126 126 return; 127 127 } 128 128 129 129 rc = inetping_ev_ops->recv(&sdu); 130 130 free(sdu.data); -
uspace/lib/c/generic/io/io.c
rf2c19b0 r03c971f 192 192 } 193 193 194 /** Set stream buffer. 195 * 196 * When @p buf is NULL, the stream is set as unbuffered, otherwise 197 * full buffering is enabled. 198 */ 199 void setbuf(FILE *stream, void *buf) 200 { 201 if (buf == NULL) { 202 setvbuf(stream, NULL, _IONBF, BUFSIZ); 203 } else { 204 setvbuf(stream, buf, _IOFBF, BUFSIZ); 205 } 206 } 207 194 208 static void _setvbuf(FILE *stream) 195 209 { -
uspace/lib/c/generic/iplink.c
rf2c19b0 r03c971f 39 39 #include <errno.h> 40 40 #include <inet/iplink.h> 41 #include <inet/addr.h> 41 42 #include <ipc/iplink.h> 42 43 #include <ipc/services.h> … … 83 84 { 84 85 async_exch_t *exch = async_exchange_begin(iplink->sess); 85 86 ipc_call_t answer; 87 aid_t req = async_send_2(exch, IPLINK_SEND, sdu->lsrc.ipv4, 88 sdu->ldest.ipv4, &answer); 86 87 ipc_call_t answer; 88 aid_t req = async_send_2(exch, IPLINK_SEND, (sysarg_t) sdu->src, 89 (sysarg_t) sdu->dest, &answer); 90 89 91 int rc = async_data_write_start(exch, sdu->data, sdu->size); 90 async_exchange_end(exch); 91 92 if (rc != EOK) { 93 async_forget(req); 94 return rc; 95 } 96 97 sysarg_t retval; 98 async_wait_for(req, &retval); 99 if (retval != EOK) 100 return retval; 101 102 return EOK; 92 93 async_exchange_end(exch); 94 95 if (rc != EOK) { 96 async_forget(req); 97 return rc; 98 } 99 100 sysarg_t retval; 101 async_wait_for(req, &retval); 102 103 return (int) retval; 104 } 105 106 int iplink_send6(iplink_t *iplink, iplink_sdu6_t *sdu) 107 { 108 async_exch_t *exch = async_exchange_begin(iplink->sess); 109 110 ipc_call_t answer; 111 aid_t req = async_send_0(exch, IPLINK_SEND6, &answer); 112 113 int rc = async_data_write_start(exch, &sdu->dest, sizeof(addr48_t)); 114 if (rc != EOK) { 115 async_exchange_end(exch); 116 async_forget(req); 117 return rc; 118 } 119 120 rc = async_data_write_start(exch, sdu->data, sdu->size); 121 122 async_exchange_end(exch); 123 124 if (rc != EOK) { 125 async_forget(req); 126 return rc; 127 } 128 129 sysarg_t retval; 130 async_wait_for(req, &retval); 131 132 return (int) retval; 103 133 } 104 134 105 135 int iplink_get_mtu(iplink_t *iplink, size_t *rmtu) 106 136 { 137 async_exch_t *exch = async_exchange_begin(iplink->sess); 138 107 139 sysarg_t mtu; 108 async_exch_t *exch = async_exchange_begin(iplink->sess);109 110 140 int rc = async_req_0_1(exch, IPLINK_GET_MTU, &mtu); 111 async_exchange_end(exch); 112 141 142 async_exchange_end(exch); 143 113 144 if (rc != EOK) 114 145 return rc; 115 146 116 147 *rmtu = mtu; 117 148 return EOK; 118 149 } 119 150 120 int iplink_addr_add(iplink_t *iplink, iplink_addr_t *addr) 121 { 122 async_exch_t *exch = async_exchange_begin(iplink->sess); 123 124 int rc = async_req_1_0(exch, IPLINK_ADDR_ADD, (sysarg_t)addr->ipv4); 125 async_exchange_end(exch); 126 127 return rc; 128 } 129 130 int iplink_addr_remove(iplink_t *iplink, iplink_addr_t *addr) 131 { 132 async_exch_t *exch = async_exchange_begin(iplink->sess); 133 134 int rc = async_req_1_0(exch, IPLINK_ADDR_REMOVE, (sysarg_t)addr->ipv4); 135 async_exchange_end(exch); 136 137 return rc; 138 } 139 140 static void iplink_ev_recv(iplink_t *iplink, ipc_callid_t callid, 141 ipc_call_t *call) 142 { 143 int rc; 144 iplink_sdu_t sdu; 145 146 sdu.lsrc.ipv4 = IPC_GET_ARG1(*call); 147 sdu.ldest.ipv4 = IPC_GET_ARG2(*call); 148 149 rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, &sdu.size); 150 if (rc != EOK) { 151 async_answer_0(callid, rc); 151 int iplink_get_mac48(iplink_t *iplink, addr48_t *mac) 152 { 153 async_exch_t *exch = async_exchange_begin(iplink->sess); 154 155 ipc_call_t answer; 156 aid_t req = async_send_0(exch, IPLINK_GET_MAC48, &answer); 157 158 int rc = async_data_read_start(exch, mac, sizeof(addr48_t)); 159 160 loc_exchange_end(exch); 161 162 if (rc != EOK) { 163 async_forget(req); 164 return rc; 165 } 166 167 sysarg_t retval; 168 async_wait_for(req, &retval); 169 170 return (int) retval; 171 } 172 173 int iplink_addr_add(iplink_t *iplink, inet_addr_t *addr) 174 { 175 async_exch_t *exch = async_exchange_begin(iplink->sess); 176 177 ipc_call_t answer; 178 aid_t req = async_send_0(exch, IPLINK_ADDR_ADD, &answer); 179 180 int rc = async_data_write_start(exch, addr, sizeof(inet_addr_t)); 181 async_exchange_end(exch); 182 183 if (rc != EOK) { 184 async_forget(req); 185 return rc; 186 } 187 188 sysarg_t retval; 189 async_wait_for(req, &retval); 190 191 return (int) retval; 192 } 193 194 int iplink_addr_remove(iplink_t *iplink, inet_addr_t *addr) 195 { 196 async_exch_t *exch = async_exchange_begin(iplink->sess); 197 198 ipc_call_t answer; 199 aid_t req = async_send_0(exch, IPLINK_ADDR_REMOVE, &answer); 200 201 int rc = async_data_write_start(exch, addr, sizeof(inet_addr_t)); 202 async_exchange_end(exch); 203 204 if (rc != EOK) { 205 async_forget(req); 206 return rc; 207 } 208 209 sysarg_t retval; 210 async_wait_for(req, &retval); 211 212 return (int) retval; 213 } 214 215 static void iplink_ev_recv(iplink_t *iplink, ipc_callid_t iid, 216 ipc_call_t *icall) 217 { 218 iplink_recv_sdu_t sdu; 219 220 uint16_t af = IPC_GET_ARG1(*icall); 221 222 int rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, 223 &sdu.size); 224 if (rc != EOK) { 225 async_answer_0(iid, rc); 152 226 return; 153 227 } 154 155 rc = iplink->ev_ops->recv(iplink, &sdu );228 229 rc = iplink->ev_ops->recv(iplink, &sdu, af); 156 230 free(sdu.data); 157 async_answer_0( callid, rc);231 async_answer_0(iid, rc); 158 232 } 159 233 160 234 static void iplink_cb_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg) 161 235 { 162 iplink_t *iplink = (iplink_t *) arg;163 236 iplink_t *iplink = (iplink_t *) arg; 237 164 238 while (true) { 165 239 ipc_call_t call; 166 240 ipc_callid_t callid = async_get_call(&call); 167 241 168 242 if (!IPC_GET_IMETHOD(call)) { 169 243 /* TODO: Handle hangup */ 170 244 return; 171 245 } 172 246 173 247 switch (IPC_GET_IMETHOD(call)) { 174 248 case IPLINK_EV_RECV: -
uspace/lib/c/generic/iplink_srv.c
rf2c19b0 r03c971f 34 34 * @brief IP link server stub 35 35 */ 36 36 37 #include <errno.h> 37 38 #include <ipc/iplink.h> 38 39 #include <stdlib.h> 39 40 #include <sys/types.h> 40 41 #include <inet/addr.h> 41 42 #include <inet/iplink_srv.h> 42 43 … … 44 45 ipc_call_t *call) 45 46 { 46 int rc;47 47 size_t mtu; 48 49 rc = srv->ops->get_mtu(srv, &mtu); 48 int rc = srv->ops->get_mtu(srv, &mtu); 50 49 async_answer_1(callid, rc, mtu); 51 50 } 52 51 53 static void iplink_addr_add_srv(iplink_srv_t *srv, ipc_callid_t callid, 54 ipc_call_t *call) 55 { 56 int rc; 57 iplink_srv_addr_t addr; 58 59 addr.ipv4 = IPC_GET_ARG1(*call); 60 52 static void iplink_get_mac48_srv(iplink_srv_t *srv, ipc_callid_t iid, 53 ipc_call_t *icall) 54 { 55 addr48_t mac; 56 int rc = srv->ops->get_mac48(srv, &mac); 57 if (rc != EOK) { 58 async_answer_0(iid, rc); 59 return; 60 } 61 62 ipc_callid_t callid; 63 size_t size; 64 if (!async_data_read_receive(&callid, &size)) { 65 async_answer_0(callid, EREFUSED); 66 async_answer_0(iid, EREFUSED); 67 return; 68 } 69 70 if (size != sizeof(addr48_t)) { 71 async_answer_0(callid, EINVAL); 72 async_answer_0(iid, EINVAL); 73 return; 74 } 75 76 rc = async_data_read_finalize(callid, &mac, size); 77 if (rc != EOK) 78 async_answer_0(callid, rc); 79 80 async_answer_0(iid, (sysarg_t) rc); 81 } 82 83 static void iplink_addr_add_srv(iplink_srv_t *srv, ipc_callid_t iid, 84 ipc_call_t *icall) 85 { 86 ipc_callid_t callid; 87 size_t size; 88 if (!async_data_write_receive(&callid, &size)) { 89 async_answer_0(callid, EREFUSED); 90 async_answer_0(iid, EREFUSED); 91 return; 92 } 93 94 if (size != sizeof(inet_addr_t)) { 95 async_answer_0(callid, EINVAL); 96 async_answer_0(iid, EINVAL); 97 return; 98 } 99 100 inet_addr_t addr; 101 int rc = async_data_write_finalize(callid, &addr, size); 102 if (rc != EOK) { 103 async_answer_0(callid, (sysarg_t) rc); 104 async_answer_0(iid, (sysarg_t) rc); 105 } 106 61 107 rc = srv->ops->addr_add(srv, &addr); 62 async_answer_0(callid, rc); 63 } 64 65 static void iplink_addr_remove_srv(iplink_srv_t *srv, ipc_callid_t callid, 66 ipc_call_t *call) 67 { 68 int rc; 69 iplink_srv_addr_t addr; 70 71 addr.ipv4 = IPC_GET_ARG1(*call); 72 108 async_answer_0(iid, (sysarg_t) rc); 109 } 110 111 static void iplink_addr_remove_srv(iplink_srv_t *srv, ipc_callid_t iid, 112 ipc_call_t *icall) 113 { 114 ipc_callid_t callid; 115 size_t size; 116 if (!async_data_write_receive(&callid, &size)) { 117 async_answer_0(callid, EREFUSED); 118 async_answer_0(iid, EREFUSED); 119 return; 120 } 121 122 if (size != sizeof(inet_addr_t)) { 123 async_answer_0(callid, EINVAL); 124 async_answer_0(iid, EINVAL); 125 return; 126 } 127 128 inet_addr_t addr; 129 int rc = async_data_write_finalize(callid, &addr, size); 130 if (rc != EOK) { 131 async_answer_0(callid, (sysarg_t) rc); 132 async_answer_0(iid, (sysarg_t) rc); 133 } 134 73 135 rc = srv->ops->addr_remove(srv, &addr); 74 async_answer_0( callid,rc);75 } 76 77 static void iplink_send_srv(iplink_srv_t *srv, ipc_callid_t callid,78 ipc_call_t * call)79 { 80 iplink_s rv_sdu_t sdu;81 int rc;82 83 sdu. lsrc.ipv4 = IPC_GET_ARG1(*call);84 sdu.ldest.ipv4 = IPC_GET_ARG2(*call);85 86 rc = async_data_write_accept(&sdu.data, false, 0, 0, 0,&sdu.size);87 if (rc != EOK) { 88 async_answer_0( callid, rc);89 return; 90 } 91 136 async_answer_0(iid, (sysarg_t) rc); 137 } 138 139 static void iplink_send_srv(iplink_srv_t *srv, ipc_callid_t iid, 140 ipc_call_t *icall) 141 { 142 iplink_sdu_t sdu; 143 144 sdu.src = IPC_GET_ARG1(*icall); 145 sdu.dest = IPC_GET_ARG2(*icall); 146 147 int rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, 148 &sdu.size); 149 if (rc != EOK) { 150 async_answer_0(iid, rc); 151 return; 152 } 153 92 154 rc = srv->ops->send(srv, &sdu); 93 155 free(sdu.data); 94 async_answer_0(callid, rc); 156 async_answer_0(iid, rc); 157 } 158 159 static void iplink_send6_srv(iplink_srv_t *srv, ipc_callid_t iid, 160 ipc_call_t *icall) 161 { 162 iplink_sdu6_t sdu; 163 164 ipc_callid_t callid; 165 size_t size; 166 if (!async_data_write_receive(&callid, &size)) { 167 async_answer_0(callid, EREFUSED); 168 async_answer_0(iid, EREFUSED); 169 return; 170 } 171 172 if (size != sizeof(addr48_t)) { 173 async_answer_0(callid, EINVAL); 174 async_answer_0(iid, EINVAL); 175 return; 176 } 177 178 int rc = async_data_write_finalize(callid, &sdu.dest, size); 179 if (rc != EOK) { 180 async_answer_0(callid, (sysarg_t) rc); 181 async_answer_0(iid, (sysarg_t) rc); 182 } 183 184 rc = async_data_write_accept(&sdu.data, false, 0, 0, 0, 185 &sdu.size); 186 if (rc != EOK) { 187 async_answer_0(iid, rc); 188 return; 189 } 190 191 rc = srv->ops->send6(srv, &sdu); 192 free(sdu.data); 193 async_answer_0(iid, rc); 95 194 } 96 195 … … 106 205 int iplink_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg) 107 206 { 108 iplink_srv_t *srv = (iplink_srv_t *) arg;207 iplink_srv_t *srv = (iplink_srv_t *) arg; 109 208 int rc; 110 209 111 210 fibril_mutex_lock(&srv->lock); 112 211 if (srv->connected) { … … 115 214 return EBUSY; 116 215 } 117 216 118 217 srv->connected = true; 119 218 fibril_mutex_unlock(&srv->lock); 120 219 121 220 /* Accept the connection */ 122 221 async_answer_0(iid, EOK); 123 222 124 223 async_sess_t *sess = async_callback_receive(EXCHANGE_SERIALIZE); 125 224 if (sess == NULL) 126 225 return ENOMEM; 127 226 128 227 srv->client_sess = sess; 129 228 130 229 rc = srv->ops->open(srv); 131 230 if (rc != EOK) 132 231 return rc; 133 232 134 233 while (true) { 135 234 ipc_call_t call; 136 235 ipc_callid_t callid = async_get_call(&call); 137 236 sysarg_t method = IPC_GET_IMETHOD(call); 138 237 139 238 if (!method) { 140 239 /* The other side has hung up */ 141 240 fibril_mutex_lock(&srv->lock); 142 241 srv->connected = false; 143 242 fibril_mutex_unlock(&srv->lock); 144 243 async_answer_0(callid, EOK); 145 244 break; 146 245 } 147 246 148 247 switch (method) { 149 248 case IPLINK_GET_MTU: 150 249 iplink_get_mtu_srv(srv, callid, &call); 151 250 break; 251 case IPLINK_GET_MAC48: 252 iplink_get_mac48_srv(srv, callid, &call); 253 break; 152 254 case IPLINK_SEND: 153 255 iplink_send_srv(srv, callid, &call); 256 break; 257 case IPLINK_SEND6: 258 iplink_send6_srv(srv, callid, &call); 154 259 break; 155 260 case IPLINK_ADDR_ADD: … … 163 268 } 164 269 } 165 270 166 271 return srv->ops->close(srv); 167 272 } 168 273 169 int iplink_ev_recv(iplink_srv_t *srv, iplink_ srv_sdu_t *sdu)274 int iplink_ev_recv(iplink_srv_t *srv, iplink_recv_sdu_t *sdu, uint16_t af) 170 275 { 171 276 if (srv->client_sess == NULL) 172 277 return EIO; 173 278 174 279 async_exch_t *exch = async_exchange_begin(srv->client_sess); 175 280 176 281 ipc_call_t answer; 177 aid_t req = async_send_2(exch, IPLINK_EV_RECV, sdu->lsrc.ipv4, 178 sdu->ldest.ipv4, &answer); 282 aid_t req = async_send_1(exch, IPLINK_EV_RECV, (sysarg_t) af, 283 &answer); 284 179 285 int rc = async_data_write_start(exch, sdu->data, sdu->size); 180 286 async_exchange_end(exch); 181 287 182 288 if (rc != EOK) { 183 289 async_forget(req); 184 290 return rc; 185 291 } 186 292 187 293 sysarg_t retval; 188 294 async_wait_for(req, &retval); 189 295 if (retval != EOK) 190 296 return retval; 191 297 192 298 return EOK; 193 299 } -
uspace/lib/c/generic/net/inet.c
rf2c19b0 r03c971f 1 1 /* 2 * Copyright (c) 20 09 Lukas Mejdrech2 * Copyright (c) 2013 Martin Decky 3 3 * All rights reserved. 4 4 * … … 39 39 #include <net/in6.h> 40 40 #include <net/inet.h> 41 41 #include <inet/addr.h> 42 42 #include <errno.h> 43 43 #include <mem.h> … … 45 45 #include <str.h> 46 46 47 const in6_addr_t in6addr_any = { 48 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } 49 }; 50 51 static int inet_ntop4(const uint8_t *data, char *address, size_t length) 52 { 53 /* Check output buffer size */ 54 if (length < INET_ADDRSTRLEN) 55 return ENOMEM; 56 57 /* Fill buffer with IPv4 address */ 58 snprintf(address, length, 59 "%" PRIu8 ".%" PRIu8 ".%" PRIu8 ".%" PRIu8, 60 data[0], data[1], data[2], data[3]); 61 62 return EOK; 63 } 64 65 static int inet_ntop6(const uint8_t *data, char *address, size_t length) 66 { 67 /* Check output buffer size */ 68 if (length < INET6_ADDRSTRLEN) 69 return ENOMEM; 70 71 /* Find the longest zero subsequence */ 72 73 uint16_t zeroes[8]; 74 uint16_t bioctets[8]; 75 76 for (size_t i = 8; i > 0; i--) { 77 size_t j = i - 1; 78 79 bioctets[j] = (data[j << 1] << 8) | data[(j << 1) + 1]; 80 81 if (bioctets[j] == 0) { 82 zeroes[j] = 1; 83 if (j < 7) 84 zeroes[j] += zeroes[j + 1]; 85 } else 86 zeroes[j] = 0; 87 } 88 89 size_t wildcard_pos = (size_t) -1; 90 size_t wildcard_size = 0; 91 92 for (size_t i = 0; i < 8; i++) { 93 if (zeroes[i] > wildcard_size) { 94 wildcard_pos = i; 95 wildcard_size = zeroes[i]; 96 } 97 } 98 99 char *cur = address; 100 size_t rest = length; 101 bool tail_zero = false; 102 int ret; 103 104 for (size_t i = 0; i < 8; i++) { 105 if ((i == wildcard_pos) && (wildcard_size > 1)) { 106 ret = snprintf(cur, rest, ":"); 107 i += wildcard_size - 1; 108 tail_zero = true; 109 } else if (i == 0) { 110 ret = snprintf(cur, rest, "%" PRIx16, bioctets[i]); 111 tail_zero = false; 112 } else { 113 ret = snprintf(cur, rest, ":%" PRIx16, bioctets[i]); 114 tail_zero = false; 115 } 116 117 if (ret < 0) 118 return EINVAL; 119 120 cur += ret; 121 rest -= ret; 122 } 123 124 if (tail_zero) { 125 ret = snprintf(cur, rest, ":"); 126 if (ret < 0) 127 return EINVAL; 128 } 129 130 return EOK; 131 } 132 47 133 /** Prints the address into the character buffer. 48 134 * 49 * @param[in] family The address family. 50 * @param[in] data The address data. 51 * @param[out] address The character buffer to be filled. 52 * @param[in] length The buffer length. 53 * @return EOK on success. 54 * @return EINVAL if the data or address parameter is NULL. 55 * @return ENOMEM if the character buffer is not long enough. 56 * @return ENOTSUP if the address family is not supported. 57 */ 58 int 59 inet_ntop(uint16_t family, const uint8_t *data, char *address, size_t length) 60 { 61 if ((!data) || (!address)) 62 return EINVAL; 63 135 * @param[in] family Address family. 136 * @param[in] data Address data. 137 * @param[out] address Character buffer to be filled. 138 * @param[in] length Buffer length. 139 * 140 * @return EOK on success. 141 * @return EINVAL if the data or address parameter is NULL. 142 * @return ENOMEM if the character buffer is not long enough. 143 * @return ENOTSUP if the address family is not supported. 144 * 145 */ 146 int inet_ntop(uint16_t family, const uint8_t *data, char *address, size_t length) 147 { 64 148 switch (family) { 65 149 case AF_INET: 66 /* Check output buffer size */ 67 if (length < INET_ADDRSTRLEN) 68 return ENOMEM; 69 70 /* Fill buffer with IPv4 address */ 71 snprintf(address, length, "%hhu.%hhu.%hhu.%hhu", 72 data[0], data[1], data[2], data[3]); 73 74 return EOK; 75 150 return inet_ntop4(data, address, length); 76 151 case AF_INET6: 77 /* Check output buffer size */ 78 if (length < INET6_ADDRSTRLEN) 79 return ENOMEM; 80 81 /* Fill buffer with IPv6 address */ 82 snprintf(address, length, 83 "%hhx%hhx:%hhx%hhx:%hhx%hhx:%hhx%hhx:%hhx%hhx:%hhx%hhx:" 84 "%hhx%hhx:%hhx%hhx", 85 data[0], data[1], data[2], data[3], data[4], data[5], 86 data[6], data[7], data[8], data[9], data[10], data[11], 87 data[12], data[13], data[14], data[15]); 88 89 return EOK; 90 152 return inet_ntop6(data, address, length); 91 153 default: 92 154 return ENOTSUP; … … 94 156 } 95 157 158 static int inet_pton4(const char *address, uint8_t *data) 159 { 160 memset(data, 0, 4); 161 162 const char *cur = address; 163 size_t i = 0; 164 165 while (i < 4) { 166 int rc = str_uint8_t(cur, &cur, 10, false, &data[i]); 167 if (rc != EOK) 168 return rc; 169 170 i++; 171 172 if (*cur == 0) 173 break; 174 175 if (*cur != '.') 176 return EINVAL; 177 178 if (i < 4) 179 cur++; 180 } 181 182 if ((i == 4) && (*cur != 0)) 183 return EINVAL; 184 185 return EOK; 186 } 187 188 static int inet_pton6(const char *address, uint8_t *data) 189 { 190 memset(data, 0, 16); 191 192 const char *cur = address; 193 size_t i = 0; 194 size_t wildcard_pos = (size_t) -1; 195 size_t wildcard_size = 0; 196 197 /* Handle initial wildcard */ 198 if ((address[0] == ':') && (address[1] == ':')) { 199 cur = address + 2; 200 wildcard_pos = 0; 201 wildcard_size = 16; 202 203 /* Handle empty address */ 204 if (*cur == 0) 205 return EOK; 206 } 207 208 while (i < 16) { 209 uint16_t bioctet; 210 int rc = str_uint16_t(cur, &cur, 16, false, &bioctet); 211 if (rc != EOK) 212 return rc; 213 214 data[i] = (bioctet >> 8) & 0xff; 215 data[i + 1] = bioctet & 0xff; 216 217 if (wildcard_pos != (size_t) -1) { 218 if (wildcard_size < 2) 219 return EINVAL; 220 221 wildcard_size -= 2; 222 } 223 224 i += 2; 225 226 if (*cur == 0) 227 break; 228 229 if (*cur != ':') 230 return EINVAL; 231 232 if (i < 16) { 233 cur++; 234 235 /* Handle wildcard */ 236 if (*cur == ':') { 237 if (wildcard_pos != (size_t) -1) 238 return EINVAL; 239 240 wildcard_pos = i; 241 wildcard_size = 16 - i; 242 cur++; 243 244 if (*cur == 0) 245 break; 246 } 247 } 248 } 249 250 if ((i == 16) && (*cur != 0)) 251 return EINVAL; 252 253 /* Create wildcard positions */ 254 if ((wildcard_pos != (size_t) -1) && (wildcard_size > 0)) { 255 size_t wildcard_shift = 16 - wildcard_size; 256 257 for (i = wildcard_pos + wildcard_shift; i > wildcard_pos; i--) { 258 size_t j = i - 1; 259 data[j + wildcard_size] = data[j]; 260 data[j] = 0; 261 } 262 } 263 264 return EOK; 265 } 266 96 267 /** Parses the character string into the address. 97 268 * 98 * If the string is shorter than the full address, zero bytes are added.99 * 100 * @param[in] family The address family.101 * @param[in] address The character buffer to be parsed.102 * @param[out] data The address data to be filled.103 * @return EOK on success.104 * @return EINVAL if the dataparameter is NULL.105 * @return ENOENT if the address parameter is NULL.106 * @return ENOTSUP if the address family is not supported.269 * @param[in] family The address family. 270 * @param[in] address The character buffer to be parsed. 271 * @param[out] data The address data to be filled. 272 * 273 * @return EOK on success. 274 * @return EINVAL if the data parameter is NULL. 275 * @return ENOENT if the address parameter is NULL. 276 * @return ENOTSUP if the address family is not supported. 277 * 107 278 */ 108 279 int inet_pton(uint16_t family, const char *address, uint8_t *data) 109 280 { 110 /** The base number of the values. */111 int base;112 /** The number of bytes per a section. */113 size_t bytes;114 /** The number of bytes of the address data. */115 int count;116 117 const char *next;118 char *last;119 int index;120 size_t shift;121 unsigned long value;122 123 if (!data)124 return EINVAL;125 126 /* Set processing parameters */127 281 switch (family) { 128 282 case AF_INET: 129 count = 4; 130 base = 10; 131 bytes = 1; 132 break; 133 283 return inet_pton4(address, data); 134 284 case AF_INET6: 135 count = 16; 136 base = 16; 137 bytes = 4; 138 break; 139 285 return inet_pton6(address, data); 140 286 default: 287 /** Unknown address family */ 141 288 return ENOTSUP; 142 289 } 143 144 /* Erase if no address */145 if (!address) {146 memset(data, 0, count);147 return ENOENT;148 }149 150 /* Process string from the beginning */151 next = address;152 index = 0;153 do {154 /* If the actual character is set */155 if (next && *next) {156 157 /* If not on the first character */158 if (index) {159 /* Move to the next character */160 ++next;161 }162 163 /* Parse the actual integral value */164 value = strtoul(next, &last, base);165 /*166 * Remember the last problematic character167 * should be either '.' or ':' but is ignored to be168 * more generic169 */170 next = last;171 172 /* Fill the address data byte by byte */173 shift = bytes - 1;174 do {175 /* like little endian */176 data[index + shift] = value;177 value >>= 8;178 } while(shift --);179 180 index += bytes;181 } else {182 /* Erase the rest of the address */183 memset(data + index, 0, count - index);184 return EOK;185 }186 } while (index < count);187 188 return EOK;189 290 } 190 291 -
uspace/lib/c/generic/net/socket_client.c
rf2c19b0 r03c971f 87 87 /** Parent module service. */ 88 88 services_t service; 89 /** Socket family */ 90 int family; 89 91 90 92 /** … … 395 397 switch (domain) { 396 398 case PF_INET: 399 case PF_INET6: 397 400 switch (type) { 398 401 case SOCK_STREAM: … … 433 436 break; 434 437 435 case PF_INET6:436 438 default: 437 439 return EPFNOSUPPORT; … … 447 449 448 450 memset(socket, 0, sizeof(*socket)); 451 socket->family = domain; 449 452 fibril_rwlock_write_lock(&socket_globals.lock); 450 453 -
uspace/lib/c/generic/net/socket_parse.c
rf2c19b0 r03c971f 53 53 int socket_parse_address_family(const char *name, int *af) 54 54 { 55 if (str_lcmp(name, "AF_INET ", 7) == 0) {56 *af = AF_INET ;55 if (str_lcmp(name, "AF_INET6", 8) == 0) { 56 *af = AF_INET6; 57 57 return EOK; 58 58 } 59 59 60 if (str_lcmp(name, "AF_INET 6", 8) == 0) {61 *af = AF_INET 6;60 if (str_lcmp(name, "AF_INET", 7) == 0) { 61 *af = AF_INET; 62 62 return EOK; 63 63 } … … 79 79 int socket_parse_protocol_family(const char *name, int *pf) 80 80 { 81 if (str_lcmp(name, "PF_INET6", 8) == 0) { 82 *pf = PF_INET6; 83 return EOK; 84 } 85 81 86 if (str_lcmp(name, "PF_INET", 7) == 0) { 82 87 *pf = PF_INET; 83 return EOK;84 }85 86 if (str_lcmp(name, "PF_INET6", 8) == 0) {87 *pf = PF_INET6;88 88 return EOK; 89 89 } -
uspace/lib/c/generic/str.c
rf2c19b0 r03c971f 1524 1524 * 1525 1525 */ 1526 int str_uint8_t(const char *nptr, c har **endptr, unsigned int base,1526 int str_uint8_t(const char *nptr, const char **endptr, unsigned int base, 1527 1527 bool strict, uint8_t *result) 1528 1528 { … … 1571 1571 * 1572 1572 */ 1573 int str_uint16_t(const char *nptr, c har **endptr, unsigned int base,1573 int str_uint16_t(const char *nptr, const char **endptr, unsigned int base, 1574 1574 bool strict, uint16_t *result) 1575 1575 { … … 1618 1618 * 1619 1619 */ 1620 int str_uint32_t(const char *nptr, c har **endptr, unsigned int base,1620 int str_uint32_t(const char *nptr, const char **endptr, unsigned int base, 1621 1621 bool strict, uint32_t *result) 1622 1622 { … … 1665 1665 * 1666 1666 */ 1667 int str_uint64_t(const char *nptr, c har **endptr, unsigned int base,1667 int str_uint64_t(const char *nptr, const char **endptr, unsigned int base, 1668 1668 bool strict, uint64_t *result) 1669 1669 { … … 1704 1704 * 1705 1705 */ 1706 int str_size_t(const char *nptr, c har **endptr, unsigned int base,1706 int str_size_t(const char *nptr, const char **endptr, unsigned int base, 1707 1707 bool strict, size_t *result) 1708 1708 { -
uspace/lib/c/include/bd_srv.h
rf2c19b0 r03c971f 57 57 } bd_srv_t; 58 58 59 typedefstruct bd_ops {59 struct bd_ops { 60 60 int (*open)(bd_srvs_t *, bd_srv_t *); 61 61 int (*close)(bd_srv_t *); … … 65 65 int (*get_block_size)(bd_srv_t *, size_t *); 66 66 int (*get_num_blocks)(bd_srv_t *, aoff64_t *); 67 } bd_ops_t;67 }; 68 68 69 69 extern void bd_srvs_init(bd_srvs_t *); -
uspace/lib/c/include/bitops.h
rf2c19b0 r03c971f 107 107 } 108 108 109 extern int __popcountsi2(int); 110 109 111 #endif 110 112 -
uspace/lib/c/include/inet/addr.h
rf2c19b0 r03c971f 37 37 38 38 #include <stdint.h> 39 #include <net/in.h> 40 #include <net/in6.h> 41 42 typedef uint32_t addr32_t; 43 typedef uint8_t addr48_t[6]; 44 typedef uint8_t addr128_t[16]; 39 45 40 46 /** Node address */ 41 47 typedef struct { 42 uint32_t ipv4; 48 uint16_t family; 49 union { 50 addr32_t addr; 51 addr128_t addr6; 52 }; 43 53 } inet_addr_t; 44 54 45 55 /** Network address */ 46 56 typedef struct { 57 /** Address family */ 58 uint16_t family; 59 47 60 /** Address */ 48 uint32_t ipv4; 49 /** Number of valid bits in @c ipv4 */ 50 int bits; 61 union { 62 addr32_t addr; 63 addr128_t addr6; 64 }; 65 66 /** Number of valid bits */ 67 uint8_t prefix; 51 68 } inet_naddr_t; 52 69 70 extern const addr48_t addr48_broadcast; 71 72 extern void addr48(const addr48_t, addr48_t); 73 extern void addr128(const addr128_t, addr128_t); 74 75 extern int addr48_compare(const addr48_t, const addr48_t); 76 extern int addr128_compare(const addr128_t, const addr128_t); 77 78 extern void addr48_solicited_node(const addr128_t, addr48_t); 79 80 extern void host2addr128_t_be(const addr128_t, addr128_t); 81 extern void addr128_t_be2host(const addr128_t, addr128_t); 82 83 extern void inet_addr(inet_addr_t *, uint8_t, uint8_t, uint8_t, uint8_t); 84 extern void inet_naddr(inet_naddr_t *, uint8_t, uint8_t, uint8_t, uint8_t, 85 uint8_t); 86 87 extern void inet_addr6(inet_addr_t *, uint16_t, uint16_t, uint16_t, uint16_t, 88 uint16_t, uint16_t, uint16_t, uint16_t); 89 extern void inet_naddr6(inet_naddr_t *, uint16_t, uint16_t, uint16_t, uint16_t, 90 uint16_t, uint16_t, uint16_t, uint16_t, uint8_t); 91 92 extern int inet_addr_family(const char *, uint16_t *); 93 extern void inet_naddr_addr(const inet_naddr_t *, inet_addr_t *); 94 extern void inet_addr_naddr(const inet_addr_t *, uint8_t, inet_naddr_t *); 95 96 extern void inet_addr_any(inet_addr_t *); 97 extern void inet_naddr_any(inet_naddr_t *); 98 99 extern int inet_addr_compare(const inet_addr_t *, const inet_addr_t *); 100 extern int inet_addr_is_any(const inet_addr_t *); 101 102 extern int inet_naddr_compare(const inet_naddr_t *, const inet_addr_t *); 103 extern int inet_naddr_compare_mask(const inet_naddr_t *, const inet_addr_t *); 104 105 extern int inet_addr_parse(const char *, inet_addr_t *); 53 106 extern int inet_naddr_parse(const char *, inet_naddr_t *); 54 extern int inet_addr_parse(const char *, inet_addr_t *); 55 extern int inet_naddr_format(inet_naddr_t *, char **); 56 extern int inet_addr_format(inet_addr_t *, char **); 107 108 extern int inet_addr_format(const inet_addr_t *, char **); 109 extern int inet_naddr_format(const inet_naddr_t *, char **); 110 111 extern uint16_t inet_addr_get(const inet_addr_t *, addr32_t *, addr128_t *); 112 extern uint16_t inet_naddr_get(const inet_naddr_t *, addr32_t *, addr128_t *, 113 uint8_t *); 114 115 extern void inet_addr_set(addr32_t, inet_addr_t *); 116 extern void inet_naddr_set(addr32_t, uint8_t, inet_naddr_t *); 117 extern void inet_sockaddr_in_addr(const sockaddr_in_t *, inet_addr_t *); 118 119 extern void inet_addr_set6(addr128_t, inet_addr_t *); 120 extern void inet_naddr_set6(addr128_t, uint8_t, inet_naddr_t *); 121 extern void inet_sockaddr_in6_addr(const sockaddr_in6_t *, inet_addr_t *); 122 123 extern uint16_t inet_addr_sockaddr_in(const inet_addr_t *, sockaddr_in_t *, 124 sockaddr_in6_t *); 57 125 58 126 #endif -
uspace/lib/c/include/inet/dnsr.h
rf2c19b0 r03c971f 37 37 38 38 #include <inet/inet.h> 39 #include <inet/addr.h> 39 40 40 41 enum { … … 50 51 51 52 extern int dnsr_init(void); 52 extern int dnsr_name2host(const char *, dnsr_hostinfo_t ** );53 extern int dnsr_name2host(const char *, dnsr_hostinfo_t **, uint16_t); 53 54 extern void dnsr_hostinfo_destroy(dnsr_hostinfo_t *); 54 55 extern int dnsr_get_srvaddr(inet_addr_t *); -
uspace/lib/c/include/inet/inetping.h
rf2c19b0 r03c971f 40 40 41 41 typedef struct { 42 inet_addr_t src;43 inet_addr_t dest;42 uint32_t src; 43 uint32_t dest; 44 44 uint16_t seq_no; 45 45 void *data; … … 53 53 extern int inetping_init(inetping_ev_ops_t *); 54 54 extern int inetping_send(inetping_sdu_t *); 55 extern int inetping_get_srcaddr(inet_addr_t *, inet_addr_t *); 56 55 extern int inetping_get_srcaddr(uint32_t, uint32_t *); 57 56 58 57 #endif -
uspace/lib/c/include/inet/iplink.h
rf2c19b0 r03c971f 38 38 #include <async.h> 39 39 #include <sys/types.h> 40 #include <inet/addr.h> 40 41 41 42 struct iplink_ev_ops; … … 46 47 } iplink_t; 47 48 48 typedef struct { 49 uint32_t ipv4; 50 } iplink_addr_t; 51 52 /** IP link Service Data Unit */ 49 /** IPv4 link Service Data Unit */ 53 50 typedef struct { 54 51 /** Local source address */ 55 iplink_addr_t lsrc;52 addr32_t src; 56 53 /** Local destination address */ 57 iplink_addr_t ldest;54 addr32_t dest; 58 55 /** Serialized IP packet */ 59 56 void *data; … … 62 59 } iplink_sdu_t; 63 60 61 /** IPv6 link Service Data Unit */ 62 typedef struct { 63 /** Local MAC destination address */ 64 addr48_t dest; 65 /** Serialized IP packet */ 66 void *data; 67 /** Size of @c data in bytes */ 68 size_t size; 69 } iplink_sdu6_t; 70 71 /** Internet link receive Service Data Unit */ 72 typedef struct { 73 /** Serialized datagram */ 74 void *data; 75 /** Size of @c data in bytes */ 76 size_t size; 77 } iplink_recv_sdu_t; 78 64 79 typedef struct iplink_ev_ops { 65 int (*recv)(iplink_t *, iplink_ sdu_t *);80 int (*recv)(iplink_t *, iplink_recv_sdu_t *, uint16_t); 66 81 } iplink_ev_ops_t; 67 82 … … 69 84 extern void iplink_close(iplink_t *); 70 85 extern int iplink_send(iplink_t *, iplink_sdu_t *); 71 extern int iplink_addr_add(iplink_t *, iplink_addr_t *); 72 extern int iplink_addr_remove(iplink_t *, iplink_addr_t *); 86 extern int iplink_send6(iplink_t *, iplink_sdu6_t *); 87 extern int iplink_addr_add(iplink_t *, inet_addr_t *); 88 extern int iplink_addr_remove(iplink_t *, inet_addr_t *); 73 89 extern int iplink_get_mtu(iplink_t *, size_t *); 90 extern int iplink_get_mac48(iplink_t *, addr48_t *); 74 91 75 92 #endif -
uspace/lib/c/include/inet/iplink_srv.h
rf2c19b0 r03c971f 40 40 #include <stdbool.h> 41 41 #include <sys/types.h> 42 #include <inet/addr.h> 43 #include <inet/iplink.h> 42 44 43 45 struct iplink_ops; … … 51 53 } iplink_srv_t; 52 54 53 typedef struct {54 uint32_t ipv4;55 } iplink_srv_addr_t;56 57 /** IP link Service Data Unit */58 typedef struct {59 /** Local source address */60 iplink_srv_addr_t lsrc;61 /** Local destination address */62 iplink_srv_addr_t ldest;63 /** Serialized IP packet */64 void *data;65 /** Size of @c data in bytes */66 size_t size;67 } iplink_srv_sdu_t;68 69 55 typedef struct iplink_ops { 70 56 int (*open)(iplink_srv_t *); 71 57 int (*close)(iplink_srv_t *); 72 int (*send)(iplink_srv_t *, iplink_srv_sdu_t *); 58 int (*send)(iplink_srv_t *, iplink_sdu_t *); 59 int (*send6)(iplink_srv_t *, iplink_sdu6_t *); 73 60 int (*get_mtu)(iplink_srv_t *, size_t *); 74 int (*addr_add)(iplink_srv_t *, iplink_srv_addr_t *); 75 int (*addr_remove)(iplink_srv_t *, iplink_srv_addr_t *); 61 int (*get_mac48)(iplink_srv_t *, addr48_t *); 62 int (*addr_add)(iplink_srv_t *, inet_addr_t *); 63 int (*addr_remove)(iplink_srv_t *, inet_addr_t *); 76 64 } iplink_ops_t; 77 65 … … 79 67 80 68 extern int iplink_conn(ipc_callid_t, ipc_call_t *, void *); 81 extern int iplink_ev_recv(iplink_srv_t *, iplink_ srv_sdu_t *);69 extern int iplink_ev_recv(iplink_srv_t *, iplink_recv_sdu_t *, uint16_t); 82 70 83 71 #endif -
uspace/lib/c/include/io/con_srv.h
rf2c19b0 r03c971f 66 66 } con_srv_t; 67 67 68 typedefstruct con_ops {68 struct con_ops { 69 69 int (*open)(con_srvs_t *, con_srv_t *); 70 70 int (*close)(con_srv_t *); … … 83 83 void (*set_cursor_visibility)(con_srv_t *, bool); 84 84 int (*get_event)(con_srv_t *, cons_event_t *); 85 } con_ops_t;85 }; 86 86 87 87 extern void con_srvs_init(con_srvs_t *); -
uspace/lib/c/include/io/verify.h
rf2c19b0 r03c971f 38 38 #ifndef NVERIFY_PRINTF 39 39 40 #ifdef __clang__ 41 #define PRINTF_ATTRIBUTE(start, end) \ 42 __attribute__((format(__printf__, start, end))) 43 #else 40 44 #define PRINTF_ATTRIBUTE(start, end) \ 41 45 __attribute__((format(gnu_printf, start, end))) 46 #endif 42 47 43 48 #else /* NVERIFY_PRINTF */ -
uspace/lib/c/include/ipc/inet.h
rf2c19b0 r03c971f 45 45 INET_PORT_CFG, 46 46 /** Ping service port */ 47 INET_PORT_PING 47 INET_PORT_PING, 48 /** Ping6 service port */ 49 INET_PORT_PING6 48 50 } inet_port_t; 49 51 … … 88 90 } inetping_request_t; 89 91 92 /** Events on Inet ping6 port */ 93 typedef enum { 94 INETPING6_EV_RECV = IPC_FIRST_USER_METHOD 95 } inetping6_event_t; 96 97 /** Requests on Inet ping6 port */ 98 typedef enum { 99 INETPING6_SEND = IPC_FIRST_USER_METHOD, 100 INETPING6_GET_SRCADDR 101 } inetping6_request_t; 102 90 103 #endif 91 104 -
uspace/lib/c/include/ipc/iplink.h
rf2c19b0 r03c971f 40 40 typedef enum { 41 41 IPLINK_GET_MTU = IPC_FIRST_USER_METHOD, 42 IPLINK_GET_MAC48, 42 43 IPLINK_SEND, 44 IPLINK_SEND6, 43 45 IPLINK_ADDR_ADD, 44 46 IPLINK_ADDR_REMOVE -
uspace/lib/c/include/ipc/services.h
rf2c19b0 r03c971f 53 53 } services_t; 54 54 55 #define SERVICE_NAME_DNSR "net/dnsr" 56 #define SERVICE_NAME_INET "net/inet" 57 #define SERVICE_NAME_INETCFG "net/inetcfg" 58 #define SERVICE_NAME_INETPING "net/inetping" 55 #define SERVICE_NAME_DNSR "net/dnsr" 56 #define SERVICE_NAME_INET "net/inet" 57 #define SERVICE_NAME_INETCFG "net/inetcfg" 58 #define SERVICE_NAME_INETPING "net/inetping" 59 #define SERVICE_NAME_INETPING6 "net/inetping6" 59 60 60 61 #endif -
uspace/lib/c/include/mem.h
rf2c19b0 r03c971f 37 37 38 38 #include <sys/types.h> 39 #include <cc.h> 39 40 40 41 extern void *memset(void *, int, size_t) 41 __attribute__ ((optimize("-fno-tree-loop-distribute-patterns")));42 ATTRIBUTE_OPTIMIZE("-fno-tree-loop-distribute-patterns"); 42 43 extern void *memcpy(void *, const void *, size_t) 43 __attribute__ ((optimize("-fno-tree-loop-distribute-patterns")));44 ATTRIBUTE_OPTIMIZE("-fno-tree-loop-distribute-patterns"); 44 45 extern void *memmove(void *, const void *, size_t); 45 46 extern int memcmp(const void *, const void *, size_t); -
uspace/lib/c/include/net/in.h
rf2c19b0 r03c971f 45 45 #define INET_ADDRSTRLEN (4 * 3 + 3 + 1) 46 46 47 #define INADDR_ANY 0 48 49 /** Type definition of the INET address. 50 * @see in_addr 51 */ 52 typedef struct in_addr in_addr_t; 53 54 /** Type definition of the INET socket address. 55 * @see sockaddr_in 56 */ 57 typedef struct sockaddr_in sockaddr_in_t; 47 #define INADDR_ANY 0 58 48 59 49 /** INET address. */ 60 struct in_addr {50 typedef struct in_addr { 61 51 /** 4 byte IP address. */ 62 52 uint32_t s_addr; 63 } ;53 } in_addr_t; 64 54 65 55 /** INET socket address. 66 56 * @see sockaddr 67 57 */ 68 struct sockaddr_in {58 typedef struct sockaddr_in { 69 59 /** Address family. Should be AF_INET. */ 70 60 uint16_t sin_family; … … 72 62 uint16_t sin_port; 73 63 /** Internet address. */ 74 struct in_addrsin_addr;64 in_addr_t sin_addr; 75 65 /** Padding to meet the sockaddr size. */ 76 66 uint8_t sin_zero[8]; 77 } ;67 } sockaddr_in_t; 78 68 79 69 #endif -
uspace/lib/c/include/net/in6.h
rf2c19b0 r03c971f 43 43 44 44 /** INET6 string address maximum length. */ 45 #define INET6_ADDRSTRLEN (8 * 4 + 7 + 1) 46 47 /** Type definition of the INET6 address. 48 * @see in6_addr 49 */ 50 typedef struct in6_addr in6_addr_t; 51 52 /** Type definition of the INET6 socket address. 53 * @see sockaddr_in6 54 */ 55 typedef struct sockaddr_in6 sockaddr_in6_t; 45 #define INET6_ADDRSTRLEN (8 * 4 + 7 + 1) 56 46 57 47 /** INET6 address. */ 58 struct in6_addr {48 typedef struct in6_addr { 59 49 /** 16 byte IPv6 address. */ 60 u nsigned chars6_addr[16];61 } ;50 uint8_t s6_addr[16]; 51 } in6_addr_t; 62 52 63 53 /** INET6 socket address. 64 54 * @see sockaddr 65 55 */ 66 struct sockaddr_in6 {56 typedef struct sockaddr_in6 { 67 57 /** Address family. Should be AF_INET6. */ 68 58 uint16_t sin6_family; … … 75 65 /** Scope identifier. */ 76 66 uint32_t sin6_scope_id; 77 }; 67 } sockaddr_in6_t; 68 69 extern const in6_addr_t in6addr_any; 78 70 79 71 #endif -
uspace/lib/c/include/net/inet.h
rf2c19b0 r03c971f 41 41 #include <byteorder.h> 42 42 43 /** Type definition of the socket address.44 * @see sockaddr45 */46 typedef struct sockaddr sockaddr_t;47 48 43 /** Type definition of the address information. 49 44 * @see addrinfo 50 45 */ 51 typedef struct addrinfo 46 typedef struct addrinfo addrinfo_t; 52 47 53 48 /** Socket address. */ 54 struct sockaddr {49 typedef struct sockaddr { 55 50 /** Address family. @see socket.h */ 56 51 uint16_t sa_family; 57 52 /** 14 byte protocol address. */ 58 53 uint8_t sa_data[14]; 59 } ;54 } sockaddr_t; 60 55 61 56 extern int inet_ntop(uint16_t, const uint8_t *, char *, size_t); -
uspace/lib/c/include/net/ip_protocols.h
rf2c19b0 r03c971f 44 44 /*@{*/ 45 45 46 #define IPPROTO_ICMP 1 47 #define IPPROTO_TCP 6 48 #define IPPROTO_UDP 17 46 #define IPPROTO_ICMP 1 47 #define IPPROTO_TCP 6 48 #define IPPROTO_UDP 17 49 #define IPPROTO_ICMPV6 58 49 50 50 51 /*@}*/ -
uspace/lib/c/include/net/socket_codes.h
rf2c19b0 r03c971f 45 45 46 46 enum { 47 AF_ UNKNOWN= 0,48 AF_INET, 49 AF_INET6 47 AF_NONE = 0, 48 AF_INET, /* IPv4 address */ 49 AF_INET6 /* IPv6 address */ 50 50 }; 51 51 … … 53 53 54 54 /** @name Protocol families definitions 55 * 55 * Same as address families. 56 56 */ 57 57 /*@{*/ 58 58 59 #define PF_INET 60 #define PF_INET6 59 #define PF_INET AF_INET 60 #define PF_INET6 AF_INET6 61 61 62 62 /*@}*/ -
uspace/lib/c/include/stdio.h
rf2c19b0 r03c971f 143 143 144 144 extern void setvbuf(FILE *, void *, int, size_t); 145 extern void setbuf(FILE *, void *); 145 146 146 147 /* Misc file functions */ -
uspace/lib/c/include/str.h
rf2c19b0 r03c971f 109 109 extern char *str_ndup(const char *, size_t max_size); 110 110 111 extern int str_uint8_t(const char *, char **, unsigned int, bool, uint8_t *); 112 extern int str_uint16_t(const char *, char **, unsigned int, bool, uint16_t *); 113 extern int str_uint32_t(const char *, char **, unsigned int, bool, uint32_t *); 114 extern int str_uint64_t(const char *, char **, unsigned int, bool, uint64_t *); 115 extern int str_size_t(const char *, char **, unsigned int, bool, size_t *); 111 extern int str_uint8_t(const char *, const char **, unsigned int, bool, 112 uint8_t *); 113 extern int str_uint16_t(const char *, const char **, unsigned int, bool, 114 uint16_t *); 115 extern int str_uint32_t(const char *, const char **, unsigned int, bool, 116 uint32_t *); 117 extern int str_uint64_t(const char *, const char **, unsigned int, bool, 118 uint64_t *); 119 extern int str_size_t(const char *, const char **, unsigned int, bool, 120 size_t *); 116 121 117 122 extern void order_suffix(const uint64_t, uint64_t *, char *);
Note:
See TracChangeset
for help on using the changeset viewer.