Committer: Rene Hummen <rene.hummen@xxxxxxxxxxxxxxxxx> Date: Thu Feb 11 01:11:39 2010 +0100 Revision: 3595 Revision-id: rene.hummen@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Branch nick: trunk Log: uncrustified lib/opphip Modified: M lib/opphip/wrap.c M lib/opphip/wrap_db.c M lib/opphip/wrap_db.h === modified file 'lib/opphip/wrap.c' --- lib/opphip/wrap.c 2010-01-19 11:51:05 +0000 +++ lib/opphip/wrap.c 2010-02-11 00:11:39 +0000 @@ -45,32 +45,31 @@ * @todo: add clone() dup(), dup2(), fclose(), select ? */ struct { - int (*socket_dlsym)(int domain, int type, int protocol); - int (*bind_dlsym)(int socket, const struct sockaddr *sa, - socklen_t sa_len); - int (*connect_dlsym)(int a, const struct sockaddr * b, socklen_t c); - ssize_t (*send_dlsym)(int s, const void *buf, size_t len, int flags); - ssize_t (*sendto_dlsym)(int s, const void *buf, size_t len, int flags, - const struct sockaddr *to, socklen_t tolen); - ssize_t (*sendmsg_dlsym)(int s, const struct msghdr *msg, int flags); - ssize_t (*recv_dlsym)(int s, const void *buf, size_t len, int flags); - ssize_t (*recvfrom_dlsym)(int s, void *buf, size_t len, int flags, - struct sockaddr *from, socklen_t *fromlen); - ssize_t (*recvmsg_dlsym)(int s, struct msghdr *msg, int flags); - int (*accept_dlsym)(int sockfd, struct sockaddr *addr, - socklen_t *addrlen); - ssize_t (*write_dlsym)(int fd, const void *buf, size_t count); - ssize_t (*read_dlsym)(int fd, void *buf, size_t count); - int (*close_dlsym)(int fd); - int (*listen_dlsym)(int sockfd, int backlog); - ssize_t (*readv_dlsym)(int fd, const struct iovec *vector, int count); - ssize_t (*writev_dlsym)(int fd, const struct iovec *vector, int count); - int (*poll_dlsym)(struct pollfd *fds, nfds_t nfds, int timeout); - + int (*socket_dlsym)(int domain, int type, int protocol); + int (*bind_dlsym)(int socket, const struct sockaddr *sa, + socklen_t sa_len); + int (*connect_dlsym)(int a, const struct sockaddr *b, socklen_t c); + ssize_t (*send_dlsym)(int s, const void *buf, size_t len, int flags); + ssize_t (*sendto_dlsym)(int s, const void *buf, size_t len, int flags, + const struct sockaddr *to, socklen_t tolen); + ssize_t (*sendmsg_dlsym)(int s, const struct msghdr *msg, int flags); + ssize_t (*recv_dlsym)(int s, const void *buf, size_t len, int flags); + ssize_t (*recvfrom_dlsym)(int s, void *buf, size_t len, int flags, + struct sockaddr *from, socklen_t *fromlen); + ssize_t (*recvmsg_dlsym)(int s, struct msghdr *msg, int flags); + int (*accept_dlsym)(int sockfd, struct sockaddr *addr, + socklen_t *addrlen); + ssize_t (*write_dlsym)(int fd, const void *buf, size_t count); + ssize_t (*read_dlsym)(int fd, void *buf, size_t count); + int (*close_dlsym)(int fd); + int (*listen_dlsym)(int sockfd, int backlog); + ssize_t (*readv_dlsym)(int fd, const struct iovec *vector, int count); + ssize_t (*writev_dlsym)(int fd, const struct iovec *vector, int count); + int (*poll_dlsym)(struct pollfd *fds, nfds_t nfds, int timeout); } dl_function_ptr; -/** An array of wrapper handlers. Each handler points to the wrapped function. Must be - * filled in the same order as @c dl_function_ptr array. +/** An array of wrapper handlers. Each handler points to the wrapped function. + * Must be filled in the same order as @c dl_function_ptr array. */ void *dl_function_fd[NUMBER_OF_DLSYM_FUNCTIONS]; @@ -78,10 +77,10 @@ * @c dl_function_ptr array. */ void *dl_function_name[] = -{"socket", "bind", "connect", "send", "sendto", +{"socket", "bind", "connect", "send", "sendto", "sendmsg", "recv", "recvfrom", "recvmsg", "accept", - "write", "read", "close", "listen", "readv", - "writev", "poll"}; + "write", "read", "close", "listen", "readv", + "writev", "poll"}; /** * Initialize the @c dl_function_fd array to support wrapping of socket calls @@ -90,32 +89,32 @@ */ void hip_init_dlsym_functions(void) { - int err = 0, i; - char *error = NULL; - - for (i = 0; i < NUMBER_OF_DLSYM_FUNCTIONS; i++) { - dl_function_fd[i] = dlopen(SOFILE, RTLD_LAZY); - HIP_ASSERT(dl_function_fd[i]); - ((int **) (&dl_function_ptr))[i] = - dlsym(dl_function_fd[i], dl_function_name[i]); - } - - error = dlerror(); - if (err){ - HIP_DIE("dlerror: %s\n", error); - } + int err = 0, i; + char *error = NULL; + + for (i = 0; i < NUMBER_OF_DLSYM_FUNCTIONS; i++) { + dl_function_fd[i] = dlopen(SOFILE, RTLD_LAZY); + HIP_ASSERT(dl_function_fd[i]); + ((int **) (&dl_function_ptr))[i] = + dlsym(dl_function_fd[i], dl_function_name[i]); + } + + error = dlerror(); + if (err) { + HIP_DIE("dlerror: %s\n", error); + } } /** - * Uninitialize the @c dl_function_fd array to stop wrapping of socket calls using - * LD_PRELOAD. + * Uninitialize the @c dl_function_fd array to stop wrapping of socket calls + * using LD_PRELOAD. */ void hip_uninit_dlsym_functions(void) { - int i = 0; - for (i = 0; i < NUMBER_OF_DLSYM_FUNCTIONS; i++) { - dlclose(dl_function_fd[i]); - } + int i = 0; + for (i = 0; i < NUMBER_OF_DLSYM_FUNCTIONS; i++) { + dlclose(dl_function_fd[i]); + } } /** @@ -124,8 +123,8 @@ */ void hip_uninitialize_db(void) { - hip_uninit_dlsym_functions(); - hip_uninit_socket_db(); + hip_uninit_dlsym_functions(); + hip_uninit_socket_db(); } /** @@ -134,31 +133,30 @@ */ void hip_initialize_db_when_not_exist(void) { - - const char *cfile = "default"; - int err = 0; - - if (hip_db_exist) - return; - - srand(getpid()); - - hip_set_logtype(LOGTYPE_SYSLOG); - //hip_set_logtype(LOGTYPE_STDERR); - hip_set_logfmt(LOGFMT_LONG); - HIP_IFEL(hip_set_auto_logdebug(cfile), -1, - "Error: Cannot set the debugging parameter.\n"); - - hip_init_dlsym_functions(); - hip_init_socket_db(); - HIP_DEBUG("socketdb initialized\n"); - /** @todo: should have signal handlers too? */ - atexit(hip_uninitialize_db); - hip_db_exist = 1; - - out_err: - return; - + const char *cfile = "default"; + int err = 0; + + if (hip_db_exist) { + return; + } + + srand(getpid()); + + hip_set_logtype(LOGTYPE_SYSLOG); + //hip_set_logtype(LOGTYPE_STDERR); + hip_set_logfmt(LOGFMT_LONG); + HIP_IFEL(hip_set_auto_logdebug(cfile), -1, + "Error: Cannot set the debugging parameter.\n"); + + hip_init_dlsym_functions(); + hip_init_socket_db(); + HIP_DEBUG("socketdb initialized\n"); + /** @todo: should have signal handlers too? */ + atexit(hip_uninitialize_db); + hip_db_exist = 1; + +out_err: + return; } /** @@ -170,49 +168,53 @@ */ int hip_get_local_hit_wrapper(hip_hit_t *hit) { - int err = 0; - char *param; - struct hip_common *msg = NULL; - - HIP_IFEL(!(msg = hip_msg_alloc()), -1, "malloc failed\n"); - HIP_IFEL(hip_build_user_hdr(msg, SO_HIP_DEFAULT_HIT, 0), - -1, "Fail to get hits"); - HIP_IFEL(hip_send_recv_daemon_info(msg, 0, 0), -1, "send/recv\n"); - HIP_IFEL(!(param = hip_get_param(msg, HIP_PARAM_HIT)), -1, - "No HIT received\n"); - ipv6_addr_copy(hit, hip_get_param_contents_direct(param)); - _HIP_DEBUG_HIT("hit", hit); - - out_err: - if (msg) - free(msg); - return err; + int err = 0; + char *param; + struct hip_common *msg = NULL; + + HIP_IFEL(!(msg = hip_msg_alloc()), -1, "malloc failed\n"); + HIP_IFEL(hip_build_user_hdr(msg, SO_HIP_DEFAULT_HIT, 0), + -1, "Fail to get hits"); + HIP_IFEL(hip_send_recv_daemon_info(msg, 0, 0), -1, "send/recv\n"); + HIP_IFEL(!(param = hip_get_param(msg, HIP_PARAM_HIT)), -1, + "No HIT received\n"); + ipv6_addr_copy(hit, hip_get_param_contents_direct(param)); + _HIP_DEBUG_HIT("hit", hit); + +out_err: + if (msg) { + free(msg); + } + return err; } /** - * Verify if domain argument for socket() can be translated using opportunistic mode. - * + * Verify if domain argument for socket() can be translated using opportunistic + * mode. + * * @param domain the domain argument for socket() call * @return one if the socket is translatable or zero otherwise */ inline int hip_domain_is_inet(int domain) { - return (domain == PF_INET || domain == PF_INET6); + return domain == PF_INET || domain == PF_INET6; } /** - * Check the type argument for socket() call if it can be translated using opportunistic mode. + * Check the type argument for socket() call if it can be translated using + * opportunistic mode. * * @param type the type argument for socket() call * @return one if the socket is translatable or zero otherwise */ inline int hip_type_is_stream_or_dgram(int type) { - return (type == SOCK_STREAM || type == SOCK_DGRAM); + return type == SOCK_STREAM || type == SOCK_DGRAM; } /** - * Verify applicability of opportunistic mode translation for the given socket address structure. + * Verify applicability of opportunistic mode translation for the given socket + * address structure. * * @param sa the socket address structure to be verified * @return one if the socket is translatable or zero otherwise @@ -220,23 +222,27 @@ */ static inline int hip_sockaddr_wrapping_is_applicable(const struct sockaddr *sa) { - if (sa->sa_family == AF_INET6) - if (ipv6_addr_is_hit(hip_cast_sa_addr(sa)) || IN6_IS_ADDR_LOOPBACK(hip_cast_sa_addr(sa))) - return 0; - - if (!(sa->sa_family == AF_INET || sa->sa_family == AF_INET6)) - return 0; - - if (sa->sa_family == AF_INET) { - struct in_addr *oip = hip_cast_sa_addr(sa); - if (oip->s_addr == htonl(INADDR_LOOPBACK) /*|| oip->s_addr == htonl(INADDR_ANY)*/) - return 0; - } - - return 1; + if (sa->sa_family == AF_INET6) { + if (ipv6_addr_is_hit(hip_cast_sa_addr(sa)) + || IN6_IS_ADDR_LOOPBACK(hip_cast_sa_addr(sa))) { + return 0; + } + } + + if (!(sa->sa_family == AF_INET || sa->sa_family == AF_INET6)) { + return 0; + } + + if (sa->sa_family == AF_INET) { + struct in_addr *oip = hip_cast_sa_addr(sa); + if (oip->s_addr == htonl(INADDR_LOOPBACK)) { + return 0; + } + } + + return 1; } - /** * Verify applicability of opportunistic mode translation in general. * @@ -244,55 +250,68 @@ * @param entry the corresponding database entry (must be non-null) * @return 1 if applicable, zero otherwise */ -static inline int hip_wrapping_is_applicable(const struct sockaddr *sa, hip_opp_socket_t *entry) +static inline int hip_wrapping_is_applicable(const struct sockaddr *sa, + hip_opp_socket_t *entry) { - HIP_ASSERT(entry); - - if (!(entry->protocol == 0 || - entry->protocol == IPPROTO_TCP || - entry->protocol == IPPROTO_UDP || - entry->protocol == IPPROTO_ICMP || - entry->protocol == IPPROTO_ICMPV6)) - return 0; - - if (!(entry->domain == PF_INET6 || entry->domain == PF_INET)) - return 0; - - if (!(entry->type == SOCK_STREAM || - entry->type == SOCK_DGRAM || - entry->type == SOCK_RAW)) - return 0; - - if(entry->type == SOCK_RAW){ - if(!(entry->protocol == IPPROTO_ICMP || - entry->protocol == IPPROTO_ICMPV6)) - return 0; - } - - if (entry->force_orig) - return 0; - - if (sa && !hip_sockaddr_wrapping_is_applicable(sa)) { - HIP_DEBUG_SOCKADDR("wrap not applicable for addr", sa); - return 0; - } - - if (entry->orig_local_id.ss_family) - if (hip_sockaddr_wrapping_is_applicable((struct sockaddr *) &entry->orig_local_id) == 0) - return 0; - - if (entry->orig_peer_id.ss_family) - if (hip_sockaddr_wrapping_is_applicable((struct sockaddr *) &entry->orig_peer_id) == 0) - return 0; - - HIP_DEBUG("Wrapping applicable\n"); - - return 1; + HIP_ASSERT(entry); + + if (!(entry->protocol == 0 || + entry->protocol == IPPROTO_TCP || + entry->protocol == IPPROTO_UDP || + entry->protocol == IPPROTO_ICMP || + entry->protocol == IPPROTO_ICMPV6)) { + return 0; + } + + if (!(entry->domain == PF_INET6 || entry->domain == PF_INET)) { + return 0; + } + + if (!(entry->type == SOCK_STREAM || + entry->type == SOCK_DGRAM || + entry->type == SOCK_RAW)) { + return 0; + } + + if (entry->type == SOCK_RAW) { + if (!(entry->protocol == IPPROTO_ICMP || + entry->protocol == IPPROTO_ICMPV6)) { + return 0; + } + } + + if (entry->force_orig) { + return 0; + } + + if (sa && !hip_sockaddr_wrapping_is_applicable(sa)) { + HIP_DEBUG_SOCKADDR("wrap not applicable for addr", sa); + return 0; + } + + if (entry->orig_local_id.ss_family) { + if (hip_sockaddr_wrapping_is_applicable( + (struct sockaddr *) &entry->orig_local_id) == 0) { + return 0; + } + } + + if (entry->orig_peer_id.ss_family) { + if (hip_sockaddr_wrapping_is_applicable( + (struct sockaddr *) &entry->orig_peer_id) == 0) { + return 0; + } + } + + HIP_DEBUG("Wrapping applicable\n"); + + return 1; } /** - * Store information into the database about the original socket before it is translated. - * This way, the active socket call can be restored e.g. when the peer does not support HIP. + * Store information into the database about the original socket before it is + * translated. This way, the active socket call can be restored e.g. when the + * peer does not support HIP. * * @param entry the corresponding opportunistic mode database entry * @param is_peer one if the @c sa argument is remote and zero if local @@ -300,18 +319,21 @@ * @param sa the socket address structure * @param sa_len length of @c sa in bytes */ -void hip_store_orig_socket_info(hip_opp_socket_t *entry, int is_peer, const int socket, - const struct sockaddr *sa, const socklen_t sa_len) +void hip_store_orig_socket_info(hip_opp_socket_t *entry, + int is_peer, + const int socket, + const struct sockaddr *sa, + const socklen_t sa_len) { - /* Fill in the information of original socket */ - entry->orig_socket = socket; - if (is_peer) { - memcpy(&entry->orig_peer_id, sa, sa_len); - entry->orig_peer_id_len = sa_len; - } else { - memcpy(&entry->orig_local_id, sa, sa_len); - entry->orig_local_id_len = sa_len; - } + /* Fill in the information of original socket */ + entry->orig_socket = socket; + if (is_peer) { + memcpy(&entry->orig_peer_id, sa, sa_len); + entry->orig_peer_id_len = sa_len; + } else { + memcpy(&entry->orig_local_id, sa, sa_len); + entry->orig_local_id_len = sa_len; + } } /** @@ -330,112 +352,114 @@ * @return zero on success, non-zero on failure */ int hip_request_peer_hit_from_hipd(const struct in6_addr *peer_ip, - struct in6_addr *peer_hit, - const struct in6_addr *local_hit, - in_port_t *src_tcp_port, - in_port_t *dst_tcp_port, - int *fallback, - int *reject) + struct in6_addr *peer_hit, + const struct in6_addr *local_hit, + in_port_t *src_tcp_port, + in_port_t *dst_tcp_port, + int *fallback, + int *reject) { - struct hip_common *msg = NULL; - hip_hit_t *ptr = NULL; - int err = 0; - - *fallback = 1; - *reject = 0; - - HIP_IFE(!(msg = hip_msg_alloc()), -1); - - /* build the message header */ - HIP_IFEL(hip_build_user_hdr(msg, SO_HIP_GET_PEER_HIT, 0), -1, - "build hdr failed\n"); - - HIP_IFEL(hip_build_param_contents(msg, (void *)(local_hit), - HIP_PARAM_HIT_PEER, - sizeof(struct in6_addr)), -1, - "build param HIP_PARAM_HIT failed\n"); - HIP_IFEL(hip_build_param_contents(msg, (void *)(local_hit), - HIP_PARAM_HIT_LOCAL, - sizeof(struct in6_addr)), -1, - "build param HIP_PARAM_HIT failed\n"); - HIP_IFEL(hip_build_param_contents(msg, (void *)(peer_ip), - HIP_PARAM_IPV6_ADDR_PEER, - sizeof(struct in6_addr)), -1, - "build param HIP_PARAM_IPV6_ADDR failed\n"); - - HIP_IFEL(hip_build_param_contents(msg, (void *)(src_tcp_port), - HIP_PARAM_SRC_TCP_PORT, - sizeof(in_port_t)), -1, - "build param HIP_PARAM_SRC_TCP_PORT failed\n"); - - HIP_IFEL(hip_build_param_contents(msg, (void *)(dst_tcp_port), - HIP_PARAM_DST_TCP_PORT, - sizeof(in_port_t)), -1, - "build param HIP_PARAM_DST_TCP_PORT failed\n"); - - /* send and receive msg to/from hipd */ - HIP_IFEL(hip_send_recv_daemon_info(msg, 0, 0), -1, "send_recv msg failed\n"); - _HIP_DEBUG("send_recv msg succeed\n"); - - /* check error value */ - HIP_IFEL(hip_get_msg_err(msg), -1, "Got erroneous message!\n"); - - ptr = (hip_hit_t *) hip_get_param_contents(msg, HIP_PARAM_HIT_PEER); - if (ptr) { - memcpy(peer_hit, ptr, sizeof(hip_hit_t)); - HIP_DEBUG_HIT("peer_hit", peer_hit); - *fallback = 0; - } - - ptr = hip_get_param(msg, HIP_PARAM_AGENT_REJECT); - if (ptr) - { - HIP_DEBUG("Connection is to be rejected\n"); - *reject = 1; - } - - out_err: - - if(msg) - free(msg); - - return err; + struct hip_common *msg = NULL; + hip_hit_t *ptr = NULL; + int err = 0; + + *fallback = 1; + *reject = 0; + + HIP_IFE(!(msg = hip_msg_alloc()), -1); + + /* build the message header */ + HIP_IFEL(hip_build_user_hdr(msg, SO_HIP_GET_PEER_HIT, 0), -1, + "build hdr failed\n"); + + HIP_IFEL(hip_build_param_contents(msg, (void *) (local_hit), + HIP_PARAM_HIT_PEER, + sizeof(struct in6_addr)), -1, + "build param HIP_PARAM_HIT failed\n"); + HIP_IFEL(hip_build_param_contents(msg, (void *) (local_hit), + HIP_PARAM_HIT_LOCAL, + sizeof(struct in6_addr)), -1, + "build param HIP_PARAM_HIT failed\n"); + HIP_IFEL(hip_build_param_contents(msg, (void *) (peer_ip), + HIP_PARAM_IPV6_ADDR_PEER, + sizeof(struct in6_addr)), -1, + "build param HIP_PARAM_IPV6_ADDR failed\n"); + + HIP_IFEL(hip_build_param_contents(msg, (void *) (src_tcp_port), + HIP_PARAM_SRC_TCP_PORT, + sizeof(in_port_t)), -1, + "build param HIP_PARAM_SRC_TCP_PORT failed\n"); + + HIP_IFEL(hip_build_param_contents(msg, (void *) (dst_tcp_port), + HIP_PARAM_DST_TCP_PORT, + sizeof(in_port_t)), -1, + "build param HIP_PARAM_DST_TCP_PORT failed\n"); + + /* send and receive msg to/from hipd */ + HIP_IFEL(hip_send_recv_daemon_info(msg, 0, 0), -1, "send_recv msg failed\n"); + _HIP_DEBUG("send_recv msg succeed\n"); + + /* check error value */ + HIP_IFEL(hip_get_msg_err(msg), -1, "Got erroneous message!\n"); + + ptr = (hip_hit_t *) hip_get_param_contents(msg, HIP_PARAM_HIT_PEER); + if (ptr) { + memcpy(peer_hit, ptr, sizeof(hip_hit_t)); + HIP_DEBUG_HIT("peer_hit", peer_hit); + *fallback = 0; + } + + ptr = hip_get_param(msg, HIP_PARAM_AGENT_REJECT); + if (ptr) { + HIP_DEBUG("Connection is to be rejected\n"); + *reject = 1; + } + +out_err: + + if (msg) { + free(msg); + } + + return err; } /** - * Sets the state of the socket in the database to "fall back" (i.e. non-HIP based connecvitity) + * Sets the state of the socket in the database to "fall back" (i.e. + * non-HIP based connecvitity) * * @param entry opportunistic database entry * @param is_peer one when setting state for remote host and zero for local host */ void hip_translate_to_original(hip_opp_socket_t *entry, int is_peer) { - /* translated entries correspond to originals */ - _HIP_DEBUG("Translating to original %d\n", entry->orig_socket); + /* translated entries correspond to originals */ + _HIP_DEBUG("Translating to original %d\n", entry->orig_socket); - entry->translated_socket = entry->orig_socket; - if (is_peer) { - memcpy(&entry->translated_peer_id, &entry->orig_peer_id, - sizeof(struct sockaddr_storage)); - entry->peer_id_is_translated = 1; - } else { - memcpy(&entry->translated_local_id, &entry->orig_local_id, - sizeof(struct sockaddr_storage)); - entry->local_id_is_translated = 1; - } + entry->translated_socket = entry->orig_socket; + if (is_peer) { + memcpy(&entry->translated_peer_id, &entry->orig_peer_id, + sizeof(struct sockaddr_storage)); + entry->peer_id_is_translated = 1; + } else { + memcpy(&entry->translated_local_id, &entry->orig_local_id, + sizeof(struct sockaddr_storage)); + entry->local_id_is_translated = 1; + } } /** - * Create a new HIT-based socket. Note that the translated socket is always separate - * from the original because the fall back requires it. + * Create a new HIT-based socket. Note that the translated socket is always + * separate from the original because the fall back requires it. * * @param entry the opportunistic database entry * @return same return values as with socket() call */ -static inline int hip_create_new_hit_socket(hip_opp_socket_t *entry) { - return dl_function_ptr.socket_dlsym(AF_INET6, - entry->type, - entry->protocol); +static inline int hip_create_new_hit_socket(hip_opp_socket_t *entry) +{ + return dl_function_ptr.socket_dlsym(AF_INET6, + entry->type, + entry->protocol); } /** @@ -444,74 +468,77 @@ * @param entry the database entry where to store the HIT * @param hit the HIT * @param peer one if HIT is remote or zero for local HIT - * @return + * @return */ int hip_set_translation(hip_opp_socket_t *entry, - struct sockaddr_in6 *hit, - int is_peer) { - int err = 0; - - if (!entry->translated_socket) { - int new_socket = hip_create_new_hit_socket(entry); - HIP_DEBUG("Created new translatable socket %d\n", new_socket); - if (new_socket <= 0) { - err = -1; - HIP_ERROR("socket allocation failed\n"); - goto out_err; - } - entry->translated_socket = new_socket; - _HIP_DEBUG("Inserted translated socket in: pid=%d orig_socket=%d new_socket=%d domain=%d\n", - entry->pid, entry->orig_socket, - entry->translated_socket, - entry->domain); - } - - if (is_peer) { - memcpy(&entry->translated_peer_id, hit, hip_sockaddr_len(hit)); - entry->translated_peer_id_len = hip_sockaddr_len(hit); - entry->peer_id_is_translated = 1; - } else { - memcpy(&entry->translated_local_id, hit, hip_sockaddr_len(hit)); - entry->translated_local_id_len = hip_sockaddr_len(hit); - entry->local_id_is_translated = 1; - } - - out_err: - return err; - + struct sockaddr_in6 *hit, + int is_peer) +{ + int err = 0; + + if (!entry->translated_socket) { + int new_socket = hip_create_new_hit_socket(entry); + HIP_DEBUG("Created new translatable socket %d\n", new_socket); + if (new_socket <= 0) { + err = -1; + HIP_ERROR("socket allocation failed\n"); + goto out_err; + } + entry->translated_socket = new_socket; + _HIP_DEBUG("Inserted translated socket in: pid=%d orig_socket=%d new_socket=%d domain=%d\n", + entry->pid, entry->orig_socket, + entry->translated_socket, + entry->domain); + } + + if (is_peer) { + memcpy(&entry->translated_peer_id, hit, hip_sockaddr_len(hit)); + entry->translated_peer_id_len = hip_sockaddr_len(hit); + entry->peer_id_is_translated = 1; + } else { + memcpy(&entry->translated_local_id, hit, hip_sockaddr_len(hit)); + entry->translated_local_id_len = hip_sockaddr_len(hit); + entry->local_id_is_translated = 1; + } + +out_err: + return err; } /** - * Handle automatic binding. Called e.g. when app calls connect() without bind() first. + * Handle automatic binding. Called e.g. when app calls connect() without bind() + * first. * * @param entry corresponding database entry * @param hit a local HIT used for binding * @return same return values as bind() */ -int hip_autobind_port(hip_opp_socket_t *entry, struct sockaddr_in6 *hit) { - int err = 0; - - _HIP_DEBUG("autobind called\n"); - - /* Client software does not care about the port number; assign a random one */ - do { /* XX FIXME: CHECK UPPER BOUNDARY */ - hit->sin6_port = htons(rand()); - } while (ntohs(hit->sin6_port) < 1024); - - _HIP_DEBUG("autobind selected port %d\n", ntohs(hit->sin6_port)); - - HIP_IFE(hip_set_translation(entry, hit, 0), -1); - - err = dl_function_ptr.bind_dlsym(entry->translated_socket, - (struct sockaddr *) &entry->translated_local_id, - hip_sockaddr_len(&entry->translated_local_id)); - if (err) { - HIP_PERROR("autobind"); - goto out_err; - } - - out_err: - return err; +int hip_autobind_port(hip_opp_socket_t *entry, struct sockaddr_in6 *hit) +{ + int err = 0; + + _HIP_DEBUG("autobind called\n"); + + /* Client software does not care about the port number; + * assign a random one */ + do { /* XX FIXME: CHECK UPPER BOUNDARY */ + hit->sin6_port = htons(rand()); + } while (ntohs(hit->sin6_port) < 1024); + + _HIP_DEBUG("autobind selected port %d\n", ntohs(hit->sin6_port)); + + HIP_IFE(hip_set_translation(entry, hit, 0), -1); + + err = dl_function_ptr.bind_dlsym(entry->translated_socket, + (struct sockaddr *) &entry->translated_local_id, + hip_sockaddr_len(&entry->translated_local_id)); + if (err) { + HIP_PERROR("autobind"); + goto out_err; + } + +out_err: + return err; } /** @@ -531,129 +558,132 @@ * @return zero on success or non-zero on error */ int hip_translate_new(hip_opp_socket_t *entry, - const int orig_socket, - const struct sockaddr *orig_id, - const socklen_t orig_id_len, - int is_peer, int is_dgram, - int is_translated, int wrap_applicable) + const int orig_socket, + const struct sockaddr *orig_id, + const socklen_t orig_id_len, + int is_peer, int is_dgram, + int is_translated, int wrap_applicable) { - int err = 0; - in_port_t src_opptcp_port = 0, dst_opptcp_port = 0;/*the ports needed to send the TCP SYN i1*/ - struct sockaddr_in6 src_hit, dst_hit, - *hit = (is_peer ? &dst_hit : &src_hit); - struct sockaddr_in6 mapped_addr; - struct sockaddr *sa = NULL; - - /* i.e. socket(PF_FILE), connect and read */ - HIP_IFEL(!orig_id, 0, "No new id to translate, bailing out\n"); - - HIP_DEBUG("Translating to new socket (orig %d)\n", orig_socket); - - memset(&src_hit, 0, sizeof(src_hit)); - memset(&dst_hit, 0, sizeof(dst_hit)); - src_hit.sin6_family = AF_INET6; - - HIP_IFEL(hip_get_local_hit_wrapper(&src_hit.sin6_addr), -1, - "Querying of local HIT failed (no hipd running?)\n"); - - if (is_peer && !entry->local_id_is_translated) { - /* Can happen also with UDP based sockets with - connect() + send() */ - HIP_IFEL(hip_autobind_port(entry, &src_hit), -1, - "autobind failed\n"); - } else { - _HIP_DEBUG("autobind was not necessary\n"); - } - - _HIP_DEBUG_IN6ADDR("translate new: src addr", &src_hit.sin6_addr); - - /* hipd requires IPv4 addresses in IPv6 mapped format */ - if (orig_id->sa_family == AF_INET) { - IPV4_TO_IPV6_MAP(&((struct sockaddr_in *) orig_id)->sin_addr, - &mapped_addr.sin6_addr); - _HIP_DEBUG_SOCKADDR("ipv4 addr", orig_id); - dst_opptcp_port = ((struct sockaddr_in *)orig_id)->sin_port; - } else if (orig_id->sa_family == AF_INET6) { - memcpy(&mapped_addr, orig_id, orig_id_len); - _HIP_DEBUG_SOCKADDR("ipv6 addr\n", orig_id); - dst_opptcp_port = ((struct sockaddr_in6 *)orig_id)->sin6_port; - } else { - HIP_ASSERT("Not an IPv4/IPv6 socket: wrapping_is_applicable failed?\n"); - } - mapped_addr.sin6_family = orig_id->sa_family; - mapped_addr.sin6_port = dst_opptcp_port; - - hit->sin6_port = dst_opptcp_port; - - _HIP_DEBUG("sin_port=%d\n", ntohs(dst_opptcp_port)); - _HIP_DEBUG_IN6ADDR("sin6_addr ip = ", ip); - - - /* Find the local TCP port where the application initiated the connection, - We need it for sending the TCP SYN_I1 */ - sa = (struct sockaddr*)&(entry->translated_local_id); - if(sa->sa_family == AF_INET) - src_opptcp_port = ((struct sockaddr_in *) sa)->sin_port; - else /* AF_INET6 */ - src_opptcp_port = ((struct sockaddr_in6 *) sa)->sin6_port; - - /* Try opportunistic base exchange to retrieve peer's HIT */ - if (is_peer) { - int fallback, reject; - /* Request a HIT of the peer from hipd. This will possibly - launch an I1 with NULL HIT that will block until R1 is - received. Called e.g. in connect() or sendto(). If - opportunistic HIP fails, it can return an IP address - instead of a HIT */ - HIP_DEBUG("requesting hit from hipd\n"); - HIP_DEBUG_IN6ADDR("ip addr", &mapped_addr.sin6_addr); - HIP_IFEL(hip_request_peer_hit_from_hipd(&mapped_addr.sin6_addr, - &dst_hit.sin6_addr, - &src_hit.sin6_addr, - (in_port_t *) &src_opptcp_port, - (in_port_t *) &dst_opptcp_port, - &fallback, - &reject), - -1, "Request from hipd failed\n"); - if (reject) { - HIP_DEBUG("Connection should be rejected\n"); - err = -1; - goto out_err; - } - - if (fallback) { - HIP_DEBUG("Peer does not support HIP, fallback\n"); - goto out_err; - } - dst_hit.sin6_family = AF_INET6; - } else { - /* Called e.g. in bind() */ - HIP_DEBUG("Binding to inaddr6_any\n"); - src_hit.sin6_addr = in6addr_any; - src_hit.sin6_family = AF_INET6; - } - - if (err || IN6_IS_ADDR_V4MAPPED(&hit->sin6_addr) || - (!ipv6_addr_any(&hit->sin6_addr) && !ipv6_addr_is_hit(&hit->sin6_addr))) { - HIP_DEBUG("Localhost/peer does not support HIP, falling back to IP\n"); - goto out_err; - } - - HIP_DEBUG("HIT translation was successful\n"); - - /* We have now successfully translated an IP to an HIT. The HIT - requires a new socket. Also, we need set the return values - correctly */ - HIP_IFE(hip_set_translation(entry, hit, is_peer), -1); - - _HIP_DEBUG("translation: pid %p, orig socket %p, translated sock %p\n", - entry->pid, entry->orig_socket, entry->translated_socket); - - return err; - - out_err: - hip_translate_to_original(entry, is_peer); - return err; + int err = 0; + /*the ports needed to send the TCP SYN i1*/ + in_port_t src_opptcp_port = 0, dst_opptcp_port = 0; + struct sockaddr_in6 src_hit, dst_hit, + *hit = (is_peer ? &dst_hit : &src_hit); + struct sockaddr_in6 mapped_addr; + struct sockaddr *sa = NULL; + + /* i.e. socket(PF_FILE), connect and read */ + HIP_IFEL(!orig_id, 0, "No new id to translate, bailing out\n"); + + HIP_DEBUG("Translating to new socket (orig %d)\n", orig_socket); + + memset(&src_hit, 0, sizeof(src_hit)); + memset(&dst_hit, 0, sizeof(dst_hit)); + src_hit.sin6_family = AF_INET6; + + HIP_IFEL(hip_get_local_hit_wrapper(&src_hit.sin6_addr), -1, + "Querying of local HIT failed (no hipd running?)\n"); + + if (is_peer && !entry->local_id_is_translated) { + /* Can happen also with UDP based sockets with + * connect() + send() */ + HIP_IFEL(hip_autobind_port(entry, &src_hit), -1, + "autobind failed\n"); + } else { + _HIP_DEBUG("autobind was not necessary\n"); + } + + _HIP_DEBUG_IN6ADDR("translate new: src addr", &src_hit.sin6_addr); + + /* hipd requires IPv4 addresses in IPv6 mapped format */ + if (orig_id->sa_family == AF_INET) { + IPV4_TO_IPV6_MAP(&((struct sockaddr_in *) orig_id)->sin_addr, + &mapped_addr.sin6_addr); + _HIP_DEBUG_SOCKADDR("ipv4 addr", orig_id); + dst_opptcp_port = ((struct sockaddr_in *) orig_id)->sin_port; + } else if (orig_id->sa_family == AF_INET6) { + memcpy(&mapped_addr, orig_id, orig_id_len); + _HIP_DEBUG_SOCKADDR("ipv6 addr\n", orig_id); + dst_opptcp_port = ((struct sockaddr_in6 *) orig_id)->sin6_port; + } else { + HIP_ASSERT("Not an IPv4/IPv6 socket: wrapping_is_applicable failed?\n"); + } + mapped_addr.sin6_family = orig_id->sa_family; + mapped_addr.sin6_port = dst_opptcp_port; + + hit->sin6_port = dst_opptcp_port; + + _HIP_DEBUG("sin_port=%d\n", ntohs(dst_opptcp_port)); + _HIP_DEBUG_IN6ADDR("sin6_addr ip = ", ip); + + + /* Find the local TCP port where the application initiated the connection, + * We need it for sending the TCP SYN_I1 */ + sa = (struct sockaddr *) &(entry->translated_local_id); + if (sa->sa_family == AF_INET) { + src_opptcp_port = ((struct sockaddr_in *) sa)->sin_port; + } else { /* AF_INET6 */ + src_opptcp_port = ((struct sockaddr_in6 *) sa)->sin6_port; + } + + /* Try opportunistic base exchange to retrieve peer's HIT */ + if (is_peer) { + int fallback, reject; + /* Request a HIT of the peer from hipd. This will possibly + * launch an I1 with NULL HIT that will block until R1 is + * received. Called e.g. in connect() or sendto(). If + * opportunistic HIP fails, it can return an IP address + * instead of a HIT */ + HIP_DEBUG("requesting hit from hipd\n"); + HIP_DEBUG_IN6ADDR("ip addr", &mapped_addr.sin6_addr); + HIP_IFEL(hip_request_peer_hit_from_hipd(&mapped_addr.sin6_addr, + &dst_hit.sin6_addr, + &src_hit.sin6_addr, + (in_port_t *) &src_opptcp_port, + (in_port_t *) &dst_opptcp_port, + &fallback, + &reject), + -1, "Request from hipd failed\n"); + if (reject) { + HIP_DEBUG("Connection should be rejected\n"); + err = -1; + goto out_err; + } + + if (fallback) { + HIP_DEBUG("Peer does not support HIP, fallback\n"); + goto out_err; + } + dst_hit.sin6_family = AF_INET6; + } else { + /* Called e.g. in bind() */ + HIP_DEBUG("Binding to inaddr6_any\n"); + src_hit.sin6_addr = in6addr_any; + src_hit.sin6_family = AF_INET6; + } + + if (err || IN6_IS_ADDR_V4MAPPED(&hit->sin6_addr) + || (!ipv6_addr_any(&hit->sin6_addr) + && !ipv6_addr_is_hit(&hit->sin6_addr))) { + HIP_DEBUG("Localhost/peer does not support HIP, falling back to IP\n"); + goto out_err; + } + + HIP_DEBUG("HIT translation was successful\n"); + + /* We have now successfully translated an IP to an HIT. The HIT + * requires a new socket. Also, we need set the return values + * correctly */ + HIP_IFE(hip_set_translation(entry, hit, is_peer), -1); + + _HIP_DEBUG("translation: pid %p, orig socket %p, translated sock %p\n", + entry->pid, entry->orig_socket, entry->translated_socket); + + return err; + +out_err: + hip_translate_to_original(entry, is_peer); + return err; } /** @@ -667,42 +697,42 @@ * @param is_dgram one for datagram-oriented socket and zero for connection oriented * @param is_translated one when the socket has been translated already once and zero otherwise * @param wrap_applicable one when wrapping seems plausible and zero otherwise - * @return + * @return */ int hip_old_translation_is_ok(hip_opp_socket_t *entry, - const int orig_socket, - const struct sockaddr *orig_id, - const socklen_t orig_id_len, - int is_peer, int is_dgram, - int is_translated, int wrap_applicable) + const int orig_socket, + const struct sockaddr *orig_id, + const socklen_t orig_id_len, + int is_peer, int is_dgram, + int is_translated, int wrap_applicable) { - void *translated_id = - (is_peer ? &entry->translated_peer_id : &entry->translated_local_id); - - /** - * An entry does not require translation when... - * - * (1) the entry must be already translated once - * - * and one of the following: - * - * (2) connection oriented socket call does not require new translation - * (3) original id was not given (e.g. recvfrom with NULL src) - * (4) optimization: we don't do a new translation unless the app - * layer id has changed. Note: this optimization may have - * limitations when addressing hosts behind a remote NAT network - */ - - if (is_translated && /* 1 */ - (!is_dgram || /* 2 */ - !orig_id || /* 3 */ - !memcmp(translated_id, orig_id, orig_id_len))) /* 4 */ { - _HIP_DEBUG("Old translation ok %d\n", entry->orig_socket); - return 1; - } else { - _HIP_DEBUG("New translation required\n"); - return 0; - } + void *translated_id = + (is_peer ? &entry->translated_peer_id : &entry->translated_local_id); + + /** + * An entry does not require translation when... + * + * (1) the entry must be already translated once + * + * and one of the following: + * + * (2) connection oriented socket call does not require new translation + * (3) original id was not given (e.g. recvfrom with NULL src) + * (4) optimization: we don't do a new translation unless the app + * layer id has changed. Note: this optimization may have + * limitations when addressing hosts behind a remote NAT network + */ + + if (is_translated && /* 1 */ + (!is_dgram || /* 2 */ + !orig_id || /* 3 */ + !memcmp(translated_id, orig_id, orig_id_len))) { /* 4 */ + _HIP_DEBUG("Old translation ok %d\n", entry->orig_socket); + return 1; + } else { + _HIP_DEBUG("New translation required\n"); + return 0; + } } /** @@ -715,27 +745,28 @@ */ hip_opp_socket_t *hip_create_new_opp_entry(int pid, const int fd, pthread_t tid) { - hip_opp_socket_t *entry = NULL; - int err = 0; - - _HIP_DEBUG("\n"); - - hip_initialize_db_when_not_exist(); - - if (!hip_exists_translation(pid, fd, tid)) - err = hip_socketdb_add_entry(pid, fd, tid); - if(err) { - HIP_ERROR("Could not add entry\n"); - goto out_err; - } - - entry = hip_socketdb_find_entry(pid, fd, pthread_self()); - HIP_ASSERT(entry); - - out_err: - _HIP_DEBUG("Called socket_dlsym fd=%d\n", fd); - - return entry; + hip_opp_socket_t *entry = NULL; + int err = 0; + + _HIP_DEBUG("\n"); + + hip_initialize_db_when_not_exist(); + + if (!hip_exists_translation(pid, fd, tid)) { + err = hip_socketdb_add_entry(pid, fd, tid); + } + if (err) { + HIP_ERROR("Could not add entry\n"); + goto out_err; + } + + entry = hip_socketdb_find_entry(pid, fd, pthread_self()); + HIP_ASSERT(entry); + +out_err: + _HIP_DEBUG("Called socket_dlsym fd=%d\n", fd); + + return entry; } /** @@ -748,42 +779,42 @@ * @return zero on success, non-zero on error */ int hip_add_orig_socket_to_db(int socket_fd, int domain, int type, - int protocol) + int protocol) { - hip_opp_socket_t *entry = NULL; - int pid = 0, err = 0; - pthread_t tid = pthread_self(); - - _HIP_DEBUG("socket fd %d\n", socket_fd); - - if(socket_fd == -1) { - HIP_ERROR("Socket error\n"); - goto out_err; - } - - pid = getpid(); - - //HIP_ASSERT(!hip_socketdb_find_entry(pid, socket_fd)); - - /* Workaround: see bug id 271. For some unknown reason, the library - is not catching all close() calls from libinet6. */ - if ((entry = hip_socketdb_find_entry(pid, socket_fd, tid)) != NULL) { - hip_socketdb_del_entry_by_entry(entry); - } - - entry = hip_create_new_opp_entry(pid, socket_fd, tid); - HIP_ASSERT(entry); - entry->domain = domain; - entry->type = type; - if (protocol == -1) { - entry->protocol = protocol; - entry->force_orig = 1; - } else { - entry->protocol = protocol; - } - - out_err: - return err; + hip_opp_socket_t *entry = NULL; + int pid = 0, err = 0; + pthread_t tid = pthread_self(); + + _HIP_DEBUG("socket fd %d\n", socket_fd); + + if (socket_fd == -1) { + HIP_ERROR("Socket error\n"); + goto out_err; + } + + pid = getpid(); + + //HIP_ASSERT(!hip_socketdb_find_entry(pid, socket_fd)); + + /* Workaround: see bug id 271. For some unknown reason, the library + * is not catching all close() calls from libinet6. */ + if ((entry = hip_socketdb_find_entry(pid, socket_fd, tid)) != NULL) { + hip_socketdb_del_entry_by_entry(entry); + } + + entry = hip_create_new_opp_entry(pid, socket_fd, tid); + HIP_ASSERT(entry); + entry->domain = domain; + entry->type = type; + if (protocol == -1) { + entry->protocol = protocol; + entry->force_orig = 1; + } else { + entry->protocol = protocol; + } + +out_err: + return err; } /** @@ -804,101 +835,106 @@ * @return zero on success, non-zero on error */ int hip_translate_socket(const int *orig_socket, const struct sockaddr *orig_id, - const socklen_t *orig_id_len, int **translated_socket, - struct sockaddr **translated_id, - socklen_t **translated_id_len, int is_peer, - int is_dgram, int force_orig) + const socklen_t *orig_id_len, int **translated_socket, + struct sockaddr **translated_id, + socklen_t **translated_id_len, int is_peer, + int is_dgram, int force_orig) { - int err = 0, pid = 0, is_translated = 0, wrap_applicable = 0; - hip_opp_socket_t *entry = NULL; - pthread_t tid; - - pid = getpid(); - tid = pthread_self(); - - hip_initialize_db_when_not_exist(); - - HIP_ASSERT(orig_socket); - entry = hip_socketdb_find_entry(pid, *orig_socket, tid); - - if (!entry) { - _HIP_DEBUG("entry was not foundin db\n"); - /* Can happen in the case of read() or write() on a fd; - we are not wrapping open() or creat() calls which means - that we don't have an entry for them. */ - entry = hip_create_new_opp_entry(pid, *orig_socket, tid); - /* PF_LOCAL guarantees that the socket won't be translated */ - entry->domain = PF_LOCAL; - _HIP_DEBUG("created untranslated entry\n"); - } - HIP_ASSERT(entry); - - entry->force_orig = entry->force_orig | force_orig; - - is_translated = - (is_peer ? entry->peer_id_is_translated : - entry->local_id_is_translated); - wrap_applicable = hip_wrapping_is_applicable(orig_id, entry); - - _HIP_DEBUG("orig_id=%p is_dgram=%d wrap_applicable=%d already=%d is_peer=%d force=%d\n", - orig_id, is_dgram, wrap_applicable, is_translated, is_peer, - force_orig); - - if (orig_id) { - if (orig_id->sa_family == AF_INET) - _HIP_DEBUG_SOCKADDR("orig_id", orig_id); - else if (orig_id->sa_family == AF_INET6) - _HIP_DEBUG_SOCKADDR("orig_id", orig_id); - else - _HIP_DEBUG("orig_id family %d\n", orig_id->sa_family); - } - - if (!is_translated && orig_id) - hip_store_orig_socket_info(entry, is_peer, *orig_socket, - orig_id, *orig_id_len); - - if (!wrap_applicable) - hip_translate_to_original(entry, is_peer); - else if (hip_old_translation_is_ok(entry, *orig_socket, orig_id, - *orig_id_len, is_peer, is_dgram, - is_translated, wrap_applicable)) - _HIP_DEBUG("Keeping the existing translation\n"); - else - err = hip_translate_new(entry, *orig_socket, orig_id, - *orig_id_len, is_peer, is_dgram, - is_translated, wrap_applicable); - - if (err) { - HIP_ERROR("Error occurred during translation\n"); - } - - if (entry->orig_socket == entry->translated_socket) { - _HIP_DEBUG("No translation occured, returning original socket and id\n"); - *translated_socket = (int *) orig_socket; - *translated_id = (struct sockaddr *) orig_id; - *translated_id_len = (socklen_t *) orig_id_len; - } else { - HIP_DEBUG("Returning translated socket and id\n"); - *translated_socket = &entry->translated_socket; - *translated_id = (struct sockaddr *) - (is_peer ? &entry->translated_peer_id : - &entry->translated_local_id); - *translated_id_len = - (is_peer ? &entry->translated_peer_id_len : - &entry->translated_local_id_len); - } - - _HIP_DEBUG("translation: pid %p, orig socket %p, translated sock %p\n", - pid, orig_socket, *translated_socket); - _HIP_DEBUG_HIT("orig_local_id", hip_cast_sa_addr(&entry->orig_local_id)); - _HIP_DEBUG_HIT("orig_dst_id", hip_cast_sa_addr(&entry->orig_peer_id)); - _HIP_DEBUG_HIT("trans_local_id", hip_cast_sa_addr(&entry->translated_local_id)); - _HIP_DEBUG_HIT("trans_dst_id", hip_cast_sa_addr(&entry->translated_peer_id)); - _HIP_DEBUG("orig_id %p, translated_id %p\n", orig_id, *translated_id); - _HIP_DEBUG("orig fd %d, translated fd %d\n", entry->orig_socket, - entry->translated_socket); - - return err; + int err = 0, pid = 0, is_translated = 0, wrap_applicable = 0; + hip_opp_socket_t *entry = NULL; + pthread_t tid; + + pid = getpid(); + tid = pthread_self(); + + hip_initialize_db_when_not_exist(); + + HIP_ASSERT(orig_socket); + entry = hip_socketdb_find_entry(pid, *orig_socket, tid); + + if (!entry) { + _HIP_DEBUG("entry was not foundin db\n"); + /* Can happen in the case of read() or write() on a fd; + * we are not wrapping open() or creat() calls which means + * that we don't have an entry for them. */ + entry = hip_create_new_opp_entry(pid, *orig_socket, tid); + /* PF_LOCAL guarantees that the socket won't be translated */ + entry->domain = PF_LOCAL; + _HIP_DEBUG("created untranslated entry\n"); + } + HIP_ASSERT(entry); + + entry->force_orig = entry->force_orig | force_orig; + + is_translated = + (is_peer ? entry->peer_id_is_translated : + entry->local_id_is_translated); + wrap_applicable = hip_wrapping_is_applicable(orig_id, entry); + + _HIP_DEBUG("orig_id=%p is_dgram=%d wrap_applicable=%d already=%d is_peer=%d force=%d\n", + orig_id, is_dgram, wrap_applicable, is_translated, is_peer, + force_orig); + + if (orig_id) { + if (orig_id->sa_family == AF_INET) { + _HIP_DEBUG_SOCKADDR("orig_id", orig_id); + } else if (orig_id->sa_family == AF_INET6) { + _HIP_DEBUG_SOCKADDR("orig_id", orig_id); + } else { + _HIP_DEBUG("orig_id family %d\n", orig_id->sa_family); + } + } + + if (!is_translated && orig_id) { + hip_store_orig_socket_info(entry, is_peer, *orig_socket, + orig_id, *orig_id_len); + } + + if (!wrap_applicable) { + hip_translate_to_original(entry, is_peer); + } else if (hip_old_translation_is_ok(entry, *orig_socket, orig_id, + *orig_id_len, is_peer, is_dgram, + is_translated, wrap_applicable)) { + _HIP_DEBUG("Keeping the existing translation\n"); + } else { + err = hip_translate_new(entry, *orig_socket, orig_id, + *orig_id_len, is_peer, is_dgram, + is_translated, wrap_applicable); + } + + if (err) { + HIP_ERROR("Error occurred during translation\n"); + } + + if (entry->orig_socket == entry->translated_socket) { + _HIP_DEBUG("No translation occured, returning original socket and id\n"); + *translated_socket = (int *) orig_socket; + *translated_id = (struct sockaddr *) orig_id; + *translated_id_len = (socklen_t *) orig_id_len; + } else { + HIP_DEBUG("Returning translated socket and id\n"); + *translated_socket = &entry->translated_socket; + *translated_id = (struct sockaddr *) + (is_peer ? &entry->translated_peer_id : + &entry->translated_local_id); + *translated_id_len = + (is_peer ? &entry->translated_peer_id_len : + &entry->translated_local_id_len); + } + + _HIP_DEBUG("translation: pid %p, orig socket %p, translated sock %p\n", + pid, orig_socket, *translated_socket); + _HIP_DEBUG_HIT("orig_local_id", hip_cast_sa_addr(&entry->orig_local_id)); + _HIP_DEBUG_HIT("orig_dst_id", hip_cast_sa_addr(&entry->orig_peer_id)); + _HIP_DEBUG_HIT("trans_local_id", + hip_cast_sa_addr(&entry->translated_local_id)); + _HIP_DEBUG_HIT("trans_dst_id", + hip_cast_sa_addr(&entry->translated_peer_id)); + _HIP_DEBUG("orig_id %p, translated_id %p\n", orig_id, *translated_id); + _HIP_DEBUG("orig fd %d, translated fd %d\n", entry->orig_socket, + entry->translated_socket); + + return err; } /** @@ -911,25 +947,27 @@ */ int socket(int domain, int type, int protocol) { - int socket_fd = -1, err = 0; - - hip_initialize_db_when_not_exist(); - - _HIP_DEBUG("creating socket domain=%d type=%d protocol=%d\n", - domain, type, protocol); - - socket_fd = dl_function_ptr.socket_dlsym(domain, type, ((protocol == -1) ? 0 : protocol)); - - if (socket_fd > 0) - err = hip_add_orig_socket_to_db(socket_fd, domain, type, protocol); - if (err) { - HIP_ERROR("Failed to add orig socket to db\n"); - goto out_err; - } - - out_err: - _HIP_DEBUG("Called socket_dlsym socket_fd=%d\n", socket_fd); - return socket_fd; + int socket_fd = -1, err = 0; + + hip_initialize_db_when_not_exist(); + + _HIP_DEBUG("creating socket domain=%d type=%d protocol=%d\n", + domain, type, protocol); + + socket_fd = dl_function_ptr.socket_dlsym(domain, type, + ((protocol == -1) ? 0 : protocol)); + + if (socket_fd > 0) { + err = hip_add_orig_socket_to_db(socket_fd, domain, type, protocol); + } + if (err) { + HIP_ERROR("Failed to add orig socket to db\n"); + goto out_err; + } + +out_err: + _HIP_DEBUG("Called socket_dlsym socket_fd=%d\n", socket_fd); + return socket_fd; } /** @@ -940,53 +978,55 @@ */ int close(int orig_fd) { - int err = 0, pid = 0; - hip_opp_socket_t *entry = NULL; - pthread_t tid = pthread_self(); - - /* The database and the function pointers may not be initialized - because e.g. open call is not wrapped. We need only the - dl_function_ptr.close_dlsym to be initialized here, but let's - initialize everything anyway. This way, there is no need to - check hip_db_exist value everywhere. */ - hip_initialize_db_when_not_exist(); - - _HIP_DEBUG("close() orig fd %d\n", orig_fd); - - //if (hip_db_exist) hip_socketdb_dump(); - - /* close original socket */ - err = dl_function_ptr.close_dlsym(orig_fd); - - pid = getpid(); - - entry = hip_socketdb_find_entry(pid, orig_fd, tid); - if (!entry) - goto out_err; - - //HIP_ASSERT(entry); - - /* close new_socket */ - if(entry->translated_socket && - entry->orig_socket != entry->translated_socket) { - err = dl_function_ptr.close_dlsym(entry->translated_socket); - hip_socketdb_del_entry_by_entry(entry); - _HIP_DEBUG("old_socket %d new_socket %d deleted!\n", - entry->orig_socket, - entry->translated_socket); - }else{ - hip_socketdb_del_entry_by_entry(entry); - _HIP_DEBUG("old_socket %d new_socket %d DELETED2!\n", - entry->orig_socket, - entry->translated_socket); - } - if (err) - HIP_ERROR("Err %d close trans socket\n", err); - //hip_socketdb_dump(); - out_err: - _HIP_DEBUG("close_dlsym called with err %d\n", err); - - return err; + int err = 0, pid = 0; + hip_opp_socket_t *entry = NULL; + pthread_t tid = pthread_self(); + + /* The database and the function pointers may not be initialized + * because e.g. open call is not wrapped. We need only the + * dl_function_ptr.close_dlsym to be initialized here, but let's + * initialize everything anyway. This way, there is no need to + * check hip_db_exist value everywhere. */ + hip_initialize_db_when_not_exist(); + + _HIP_DEBUG("close() orig fd %d\n", orig_fd); + + //if (hip_db_exist) hip_socketdb_dump(); + + /* close original socket */ + err = dl_function_ptr.close_dlsym(orig_fd); + + pid = getpid(); + + entry = hip_socketdb_find_entry(pid, orig_fd, tid); + if (!entry) { + goto out_err; + } + + //HIP_ASSERT(entry); + + /* close new_socket */ + if (entry->translated_socket && + entry->orig_socket != entry->translated_socket) { + err = dl_function_ptr.close_dlsym(entry->translated_socket); + hip_socketdb_del_entry_by_entry(entry); + _HIP_DEBUG("old_socket %d new_socket %d deleted!\n", + entry->orig_socket, + entry->translated_socket); + } else { + hip_socketdb_del_entry_by_entry(entry); + _HIP_DEBUG("old_socket %d new_socket %d DELETED2!\n", + entry->orig_socket, + entry->translated_socket); + } + if (err) { + HIP_ERROR("Err %d close trans socket\n", err); + } + //hip_socketdb_dump(); +out_err: + _HIP_DEBUG("close_dlsym called with err %d\n", err); + + return err; } /** @@ -998,33 +1038,33 @@ * */ int bind(int orig_socket, const struct sockaddr *orig_id, - socklen_t orig_id_len) + socklen_t orig_id_len) { - int err = 0, *translated_socket; - socklen_t *translated_id_len; - struct sockaddr *translated_id; - - _HIP_DEBUG("bind: orig sock = %d\n", orig_socket); - - /* the address will be translated to in6addr_any */ - - err = hip_translate_socket(&orig_socket, orig_id, &orig_id_len, - &translated_socket, &translated_id, - &translated_id_len, 0, 0, 0); - - if (err) { - HIP_ERROR("Translation failure\n"); - goto out_err; - } - - err = dl_function_ptr.bind_dlsym(*translated_socket, translated_id, - *translated_id_len); - if (err) { - HIP_PERROR("bind error:"); - } - - out_err: - return err; + int err = 0, *translated_socket; + socklen_t *translated_id_len; + struct sockaddr *translated_id; + + _HIP_DEBUG("bind: orig sock = %d\n", orig_socket); + + /* the address will be translated to in6addr_any */ + + err = hip_translate_socket(&orig_socket, orig_id, &orig_id_len, + &translated_socket, &translated_id, + &translated_id_len, 0, 0, 0); + + if (err) { + HIP_ERROR("Translation failure\n"); + goto out_err; + } + + err = dl_function_ptr.bind_dlsym(*translated_socket, translated_id, + *translated_id_len); + if (err) { + HIP_PERROR("bind error:"); + } + +out_err: + return err; } /** @@ -1036,29 +1076,29 @@ */ int listen(int orig_socket, int backlog) { - int err = 0, *translated_socket; - socklen_t *translated_id_len; - struct sockaddr *translated_id; - unsigned int zero = 0; - - _HIP_DEBUG("listen: orig sock = %d\n", orig_socket); - - err = hip_translate_socket(&orig_socket, NULL, &zero, - &translated_socket, &translated_id, - &translated_id_len, 0, 0, 0); - - if (err) { - HIP_ERROR("Translation failure\n"); - goto out_err; - } - - err = dl_function_ptr.listen_dlsym(*translated_socket, backlog); - if (err) { - HIP_PERROR("connect error:"); - } - - out_err: - return err; + int err = 0, *translated_socket; + socklen_t *translated_id_len; + struct sockaddr *translated_id; + unsigned int zero = 0; + + _HIP_DEBUG("listen: orig sock = %d\n", orig_socket); + + err = hip_translate_socket(&orig_socket, NULL, &zero, + &translated_socket, &translated_id, + &translated_id_len, 0, 0, 0); + + if (err) { + HIP_ERROR("Translation failure\n"); + goto out_err; + } + + err = dl_function_ptr.listen_dlsym(*translated_socket, backlog); + if (err) { + HIP_PERROR("connect error:"); + } + +out_err: + return err; } /** @@ -1071,74 +1111,74 @@ */ int accept(int orig_socket, struct sockaddr *orig_id, socklen_t *orig_id_len) { - int err = 0, *translated_socket, new_sock; - socklen_t *translated_id_len; - struct sockaddr *translated_id; - hip_opp_socket_t *entry = NULL; - struct sockaddr_storage peer_id; - socklen_t peer_id_len = 0; - pthread_t tid = pthread_self(); - - _HIP_DEBUG("accept: orig_socket %d orig_id %p\n", - orig_socket, orig_id); - - entry = hip_socketdb_find_entry(getpid(), orig_socket, tid); - if (!entry) { - HIP_DEBUG("Did not find entry, should not happen? Fallbacking..\n"); - new_sock = dl_function_ptr.accept_dlsym(orig_socket, - (struct sockaddr *) &peer_id, - &peer_id_len); - goto out_err; - } - - HIP_ASSERT(entry); - - /* The bind() was done on in6_addr any. It supports also ipv4 mapped - addresses and we can therefore safely just accept() that. */ - - new_sock = dl_function_ptr.accept_dlsym(entry->translated_socket, - (struct sockaddr *) &peer_id, - &peer_id_len); - if (new_sock < 0) { - HIP_PERROR("accept error:"); - goto out_err; - } - - err = hip_add_orig_socket_to_db(new_sock, - entry->domain, - entry->type, - entry->protocol); - if (err) { - HIP_ERROR("Failed to add orig socket to db\n"); - goto out_err; - } - - err = hip_translate_socket(&new_sock, - (struct sockaddr *) &entry->translated_local_id, - &entry->translated_local_id_len, - &translated_socket, - &translated_id, - &translated_id_len, 0, 0, 1); - if (err) { - HIP_ERROR("Local id translation failure\n"); - goto out_err; - } - - err = hip_translate_socket(&new_sock, (struct sockaddr *) &peer_id, - &peer_id_len, - &translated_socket, &translated_id, - &translated_id_len, 1, 0, 1); - if (err) { - HIP_ERROR("Peer id translation failure\n"); - goto out_err; - } - - out_err: - - memcpy(orig_id, &peer_id, peer_id_len); - memcpy(orig_id_len, &peer_id_len, sizeof(socklen_t)); - - return new_sock; + int err = 0, *translated_socket, new_sock; + socklen_t *translated_id_len; + struct sockaddr *translated_id; + hip_opp_socket_t *entry = NULL; + struct sockaddr_storage peer_id; + socklen_t peer_id_len = 0; + pthread_t tid = pthread_self(); + + _HIP_DEBUG("accept: orig_socket %d orig_id %p\n", + orig_socket, orig_id); + + entry = hip_socketdb_find_entry(getpid(), orig_socket, tid); + if (!entry) { + HIP_DEBUG("Did not find entry, should not happen? Fallbacking..\n"); + new_sock = dl_function_ptr.accept_dlsym(orig_socket, + (struct sockaddr *) &peer_id, + &peer_id_len); + goto out_err; + } + + HIP_ASSERT(entry); + + /* The bind() was done on in6_addr any. It supports also ipv4 mapped + * addresses and we can therefore safely just accept() that. */ + + new_sock = dl_function_ptr.accept_dlsym(entry->translated_socket, + (struct sockaddr *) &peer_id, + &peer_id_len); + if (new_sock < 0) { + HIP_PERROR("accept error:"); + goto out_err; + } + + err = hip_add_orig_socket_to_db(new_sock, + entry->domain, + entry->type, + entry->protocol); + if (err) { + HIP_ERROR("Failed to add orig socket to db\n"); + goto out_err; + } + + err = hip_translate_socket(&new_sock, + (struct sockaddr *) &entry->translated_local_id, + &entry->translated_local_id_len, + &translated_socket, + &translated_id, + &translated_id_len, 0, 0, 1); + if (err) { + HIP_ERROR("Local id translation failure\n"); + goto out_err; + } + + err = hip_translate_socket(&new_sock, (struct sockaddr *) &peer_id, + &peer_id_len, + &translated_socket, &translated_id, + &translated_id_len, 1, 0, 1); + if (err) { + HIP_ERROR("Peer id translation failure\n"); + goto out_err; + } + +out_err: + + memcpy(orig_id, &peer_id, peer_id_len); + memcpy(orig_id_len, &peer_id_len, sizeof(socklen_t)); + + return new_sock; } /** @@ -1150,32 +1190,32 @@ * */ int connect(int orig_socket, const struct sockaddr *orig_id, - socklen_t orig_id_len) + socklen_t orig_id_len) { - int err = 0, *translated_socket; - socklen_t *translated_id_len; - struct sockaddr *translated_id; - - _HIP_DEBUG("connect: orig_socket=%d\n", orig_socket); - - err = hip_translate_socket(&orig_socket, orig_id, &orig_id_len, - &translated_socket, &translated_id, - &translated_id_len, 1, 0, 0); - - _HIP_DEBUG("connect: translated_socket=%d\n", translated_socket); - if (err) { - HIP_ERROR("Translation failure\n"); - goto out_err; - } - - err = dl_function_ptr.connect_dlsym(*translated_socket, translated_id, - *translated_id_len); - if (err) { - HIP_PERROR("connect error\n"); - } - - out_err: - return err; + int err = 0, *translated_socket; + socklen_t *translated_id_len; + struct sockaddr *translated_id; + + _HIP_DEBUG("connect: orig_socket=%d\n", orig_socket); + + err = hip_translate_socket(&orig_socket, orig_id, &orig_id_len, + &translated_socket, &translated_id, + &translated_id_len, 1, 0, 0); + + _HIP_DEBUG("connect: translated_socket=%d\n", translated_socket); + if (err) { + HIP_ERROR("Translation failure\n"); + goto out_err; + } + + err = dl_function_ptr.connect_dlsym(*translated_socket, translated_id, + *translated_id_len); + if (err) { + HIP_PERROR("connect error\n"); + } + +out_err: + return err; } /** @@ -1187,32 +1227,32 @@ * return as in man 2 send * */ -ssize_t send(int orig_socket, const void * b, size_t c, int flags) +ssize_t send(int orig_socket, const void *b, size_t c, int flags) { - int err = 0, *translated_socket; - socklen_t *translated_id_len, zero = 0; - struct sockaddr *translated_id; - ssize_t chars = -1; - - _HIP_DEBUG("send: %d\n", orig_socket); - - err = hip_translate_socket(&orig_socket, NULL, &zero, - &translated_socket, &translated_id, - &translated_id_len, 1, 0, 0); - - if (err) { - HIP_ERROR("Translation failure\n"); - goto out_err; - } - - chars = dl_function_ptr.send_dlsym(*translated_socket, b, c, flags); - - _HIP_DEBUG("Called send_dlsym with number of returned char=%d, err=%d\n", - chars, err); - - out_err: - - return chars; + int err = 0, *translated_socket; + socklen_t *translated_id_len, zero = 0; + struct sockaddr *translated_id; + ssize_t chars = -1; + + _HIP_DEBUG("send: %d\n", orig_socket); + + err = hip_translate_socket(&orig_socket, NULL, &zero, + &translated_socket, &translated_id, + &translated_id_len, 1, 0, 0); + + if (err) { + HIP_ERROR("Translation failure\n"); + goto out_err; + } + + chars = dl_function_ptr.send_dlsym(*translated_socket, b, c, flags); + + _HIP_DEBUG("Called send_dlsym with number of returned char=%d, err=%d\n", + chars, err); + +out_err: + + return chars; } /** @@ -1223,38 +1263,38 @@ * return as in man 2 write * */ -ssize_t write(int orig_socket, const void * b, size_t c) +ssize_t write(int orig_socket, const void *b, size_t c) { - int err = 0, *translated_socket; - ssize_t chars = -1; - socklen_t *translated_id_len, zero = 0; - struct sockaddr *translated_id; - - /* This functions is almost identical with send() */ - - _HIP_DEBUG("write: orig_socket %d\n", orig_socket); - - err = hip_translate_socket(&orig_socket, - NULL, - &zero, - &translated_socket, - &translated_id, - &translated_id_len, - 1, 0, 0); - - if (err) { - HIP_ERROR("Translation failure\n"); - goto out_err; - } - - chars = dl_function_ptr.write_dlsym(*translated_socket, b, c); - - _HIP_DEBUG("Called write_dlsym with number of returned char=%d\n", - chars); - - out_err: - - return chars; + int err = 0, *translated_socket; + ssize_t chars = -1; + socklen_t *translated_id_len, zero = 0; + struct sockaddr *translated_id; + + /* This functions is almost identical with send() */ + + _HIP_DEBUG("write: orig_socket %d\n", orig_socket); + + err = hip_translate_socket(&orig_socket, + NULL, + &zero, + &translated_socket, + &translated_id, + &translated_id_len, + 1, 0, 0); + + if (err) { + HIP_ERROR("Translation failure\n"); + goto out_err; + } + + chars = dl_function_ptr.write_dlsym(*translated_socket, b, c); + + _HIP_DEBUG("Called write_dlsym with number of returned char=%d\n", + chars); + +out_err: + + return chars; } /** @@ -1267,36 +1307,36 @@ */ ssize_t writev(int orig_socket, const struct iovec *vector, int count) { - int err = 0, *translated_socket; - ssize_t chars = -1; - socklen_t *translated_id_len, zero = 0; - struct sockaddr *translated_id; - - /* This functions is almost identical with send() */ - - _HIP_DEBUG("writev: orig_socket %d\n", orig_socket); - - err = hip_translate_socket(&orig_socket, - NULL, - &zero, - &translated_socket, - &translated_id, - &translated_id_len, - 1, 0, 0); - - if (err) { - HIP_ERROR("Translation failure\n"); - goto out_err; - } - - chars = dl_function_ptr.writev_dlsym(*translated_socket, vector, count); - - _HIP_DEBUG("Called writev_dlsym with number of returned char=%d\n", - chars); - - out_err: - - return chars; + int err = 0, *translated_socket; + ssize_t chars = -1; + socklen_t *translated_id_len, zero = 0; + struct sockaddr *translated_id; + + /* This functions is almost identical with send() */ + + _HIP_DEBUG("writev: orig_socket %d\n", orig_socket); + + err = hip_translate_socket(&orig_socket, + NULL, + &zero, + &translated_socket, + &translated_id, + &translated_id_len, + 1, 0, 0); + + if (err) { + HIP_ERROR("Translation failure\n"); + goto out_err; + } + + chars = dl_function_ptr.writev_dlsym(*translated_socket, vector, count); + + _HIP_DEBUG("Called writev_dlsym with number of returned char=%d\n", + chars); + +out_err: + + return chars; } /** @@ -1310,37 +1350,37 @@ * return as in man 2 sendto * */ -ssize_t sendto(int orig_socket, const void *buf, size_t buf_len, int flags, - const struct sockaddr *orig_id, socklen_t orig_id_len) +ssize_t sendto(int orig_socket, const void *buf, size_t buf_len, int flags, + const struct sockaddr *orig_id, socklen_t orig_id_len) { - int err = 0, *translated_socket; - socklen_t *translated_id_len; - struct sockaddr *translated_id; - ssize_t chars = -1; - - _HIP_DEBUG("sendto: orig sock = %d\n", orig_socket); - - err = hip_translate_socket(&orig_socket, - orig_id, - &orig_id_len, - &translated_socket, - &translated_id, - &translated_id_len, - 1, 1, 0); - - if (err) { - HIP_ERROR("Translation failure\n"); - goto out_err; - } - - chars = dl_function_ptr.sendto_dlsym(*translated_socket, buf, buf_len, - flags, - translated_id, - *translated_id_len); - - out_err: - - return chars; + int err = 0, *translated_socket; + socklen_t *translated_id_len; + struct sockaddr *translated_id; + ssize_t chars = -1; + + _HIP_DEBUG("sendto: orig sock = %d\n", orig_socket); + + err = hip_translate_socket(&orig_socket, + orig_id, + &orig_id_len, + &translated_socket, + &translated_id, + &translated_id_len, + 1, 1, 0); + + if (err) { + HIP_ERROR("Translation failure\n"); + goto out_err; + } + + chars = dl_function_ptr.sendto_dlsym(*translated_socket, buf, buf_len, + flags, + translated_id, + *translated_id_len); + +out_err: + + return chars; } /** @@ -1353,13 +1393,14 @@ */ ssize_t sendmsg(int a, const struct msghdr *msg, int flags) { - int charnum; - /** @todo See hip_get_pktinfo_addr(). */ - charnum = dl_function_ptr.sendmsg_dlsym(a, msg, flags); - - _HIP_DEBUG("Called sendmsg_dlsym with number of returned chars=%d\n", charnum); - - return charnum; + int charnum; + /** @todo See hip_get_pktinfo_addr(). */ + charnum = dl_function_ptr.sendmsg_dlsym(a, msg, flags); + + _HIP_DEBUG("Called sendmsg_dlsym with number of returned chars=%d\n", + charnum); + + return charnum; } /** @@ -1373,34 +1414,34 @@ */ ssize_t recv(int orig_socket, void *b, size_t c, int flags) { - int err = 0, *translated_socket; - socklen_t *translated_id_len, zero = 0; - struct sockaddr *translated_id; - ssize_t chars = -1; - - _HIP_DEBUG("recv: orig sock = %d\n", orig_socket); - - err = hip_translate_socket(&orig_socket, - NULL, - &zero, - &translated_socket, - &translated_id, - &translated_id_len, - 0, 0, 0); - - if (err) { - HIP_ERROR("Translation failure\n"); - goto out_err; - } - - chars = dl_function_ptr.recv_dlsym(*translated_socket, b, c, flags); - - _HIP_DEBUG("Called recv_dlsym with number of returned char=%d, err=%d\n", - chars, err); - - out_err: - - return chars; + int err = 0, *translated_socket; + socklen_t *translated_id_len, zero = 0; + struct sockaddr *translated_id; + ssize_t chars = -1; + + _HIP_DEBUG("recv: orig sock = %d\n", orig_socket); + + err = hip_translate_socket(&orig_socket, + NULL, + &zero, + &translated_socket, + &translated_id, + &translated_id_len, + 0, 0, 0); + + if (err) { + HIP_ERROR("Translation failure\n"); + goto out_err; + } + + chars = dl_function_ptr.recv_dlsym(*translated_socket, b, c, flags); + + _HIP_DEBUG("Called recv_dlsym with number of returned char=%d, err=%d\n", + chars, err); + +out_err: + + return chars; } /** @@ -1413,38 +1454,39 @@ */ ssize_t read(int orig_socket, void *b, size_t c) { - int err = 0, *translated_socket; - socklen_t *translated_id_len, zero = 0; - struct sockaddr *translated_id; - ssize_t chars = -1; - - /* This functions is almost identical with recv() */ - - _HIP_DEBUG("read: orig_socket %d\n", orig_socket); - - err = hip_translate_socket(&orig_socket, - NULL, - &zero, - &translated_socket, - &translated_id, - &translated_id_len, - 0, 0, 0); - - if (err) { - HIP_ERROR("Translation failure\n"); - goto out_err; - } - - if(translated_socket){ - HIP_DEBUG("read: translated_socket %d\n", *translated_socket); - chars = dl_function_ptr.read_dlsym(*translated_socket, b, c); - }else - HIP_DEBUG("read: no translated_socket found!\n"); - - _HIP_DEBUG("Called read_dlsym with number of returned char=%d\n", chars); - - out_err: - return chars; + int err = 0, *translated_socket; + socklen_t *translated_id_len, zero = 0; + struct sockaddr *translated_id; + ssize_t chars = -1; + + /* This functions is almost identical with recv() */ + + _HIP_DEBUG("read: orig_socket %d\n", orig_socket); + + err = hip_translate_socket(&orig_socket, + NULL, + &zero, + &translated_socket, + &translated_id, + &translated_id_len, + 0, 0, 0); + + if (err) { + HIP_ERROR("Translation failure\n"); + goto out_err; + } + + if (translated_socket) { + HIP_DEBUG("read: translated_socket %d\n", *translated_socket); + chars = dl_function_ptr.read_dlsym(*translated_socket, b, c); + } else { + HIP_DEBUG("read: no translated_socket found!\n"); + } + + _HIP_DEBUG("Called read_dlsym with number of returned char=%d\n", chars); + +out_err: + return chars; } /** @@ -1457,36 +1499,36 @@ */ ssize_t readv(int orig_socket, const struct iovec *vector, int count) { - int err = 0, *translated_socket; - socklen_t *translated_id_len, zero = 0; - struct sockaddr *translated_id; - ssize_t chars = -1; - - /* This functions is almost identical with recv() */ - - _HIP_DEBUG("readv: orig_socket %d\n", orig_socket); - - err = hip_translate_socket(&orig_socket, - NULL, - &zero, - &translated_socket, - &translated_id, - &translated_id_len, - 0, 0, 0); - - if (err) { - HIP_ERROR("Translation failure\n"); - goto out_err; - } - - chars = dl_function_ptr.readv_dlsym(*translated_socket, vector, count); - - _HIP_DEBUG("Called readv_dlsym with number of returned char=%d\n", - chars); - - out_err: - - return chars; + int err = 0, *translated_socket; + socklen_t *translated_id_len, zero = 0; + struct sockaddr *translated_id; + ssize_t chars = -1; + + /* This functions is almost identical with recv() */ + + _HIP_DEBUG("readv: orig_socket %d\n", orig_socket); + + err = hip_translate_socket(&orig_socket, + NULL, + &zero, + &translated_socket, + &translated_id, + &translated_id_len, + 0, 0, 0); + + if (err) { + HIP_ERROR("Translation failure\n"); + goto out_err; + } + + chars = dl_function_ptr.readv_dlsym(*translated_socket, vector, count); + + _HIP_DEBUG("Called readv_dlsym with number of returned char=%d\n", + chars); + +out_err: + + return chars; } /** @@ -1500,84 +1542,86 @@ * return as in man 2 recvfrom * */ -ssize_t recvfrom(int orig_socket, void *buf, size_t len, int flags, - struct sockaddr *orig_id, socklen_t *orig_id_len) +ssize_t recvfrom(int orig_socket, void *buf, size_t len, int flags, + struct sockaddr *orig_id, socklen_t *orig_id_len) { - int err = 0, *translated_socket = NULL; - socklen_t *translated_id_len = NULL; - struct sockaddr *translated_id = NULL; - ssize_t chars = -1; - - _HIP_DEBUG("recvfrom: orig sock = %d\n", orig_socket); - - /** @todo In the case of UDP server, this creates additional - HIP traffic even though the connection is not necessarily - secured. */ - err = hip_translate_socket(&orig_socket, orig_id, orig_id_len, - &translated_socket, &translated_id, - &translated_id_len, 0, 1, 0); - - if (err) { - HIP_ERROR("Translation failure\n"); - chars = err; - goto out_err; - } - - chars = dl_function_ptr.recvfrom_dlsym( - *translated_socket, buf, len, flags, translated_id, - translated_id_len); - - _HIP_DEBUG("recvfrom: chars = %d\n", chars); - - out_err: - return chars; + int err = 0, *translated_socket = NULL; + socklen_t *translated_id_len = NULL; + struct sockaddr *translated_id = NULL; + ssize_t chars = -1; + + _HIP_DEBUG("recvfrom: orig sock = %d\n", orig_socket); + + /** @todo In the case of UDP server, this creates additional + * HIP traffic even though the connection is not necessarily + * secured. */ + err = hip_translate_socket(&orig_socket, orig_id, orig_id_len, + &translated_socket, &translated_id, + &translated_id_len, 0, 1, 0); + + if (err) { + HIP_ERROR("Translation failure\n"); + chars = err; + goto out_err; + } + + chars = dl_function_ptr.recvfrom_dlsym( + *translated_socket, buf, len, flags, translated_id, + translated_id_len); + + _HIP_DEBUG("recvfrom: chars = %d\n", chars); + +out_err: + return chars; } #if 0 -/* poll (and maybe ppoll) should be wrapped conveniently for - applications such as ssh.*/ +/* poll (and maybe ppoll) should be wrapped conveniently for + * applications such as ssh.*/ int poll(struct pollfd *orig_fds, nfds_t nfds, int timeout) { - int n, err = 0, zero = 0; - int *translated_socket; - struct pollfd *translated_fds; - socklen_t *translated_id_len; - struct sockaddr *translated_id; - pthread_t tid = pthread_self(); - pid_t pid = getpid(); - - for (n = 0; n < nfds; n++){ - HIP_DEBUG("poll: orig_socket=%d\n", orig_fds[n].fd); - HIP_DEBUG("poll: events=%d\n", orig_fds[n].events); - HIP_DEBUG("poll: revents=%d\n", orig_fds[n].revents); - HIP_DEBUG("poll: nfds=%d\n", nfds); - hip_socketdb_dump(); - - if(hip_exists_translation(pid, orig_fds[n].fd, tid)){ - err = hip_translate_socket(&orig_fds[n].fd, NULL, &zero, - &translated_socket, &translated_id, - &translated_id_len, 1, 0, 0); - orig_fds[n].fd = *translated_socket; - HIP_DEBUG("poll: translation happened\n"); - } - HIP_DEBUG("poll: translated_socket=%d\n", orig_fds[n].fd); - _HIP_DEBUG("poll: events=%d\n", translated_fds[n].events); - _HIP_DEBUG("poll: revents=%d\n", translated_fds[n].revents); - if (err) { - HIP_ERROR("Translation failure\n"); - goto out_err; - } - } - HIP_DEBUG("calling poll: timeout=%d\n",timeout); - err = dl_function_ptr.poll_dlsym(orig_fds, nfds, timeout); - HIP_DEBUG("coming back from poll: err=%d\n",err); - if (err) { - HIP_PERROR("connect error\n"); - } - - out_err: - return err; + int n, err = 0, zero = 0; + int *translated_socket; + struct pollfd *translated_fds; + socklen_t *translated_id_len; + struct sockaddr *translated_id; + pthread_t tid = pthread_self(); + pid_t pid = getpid(); + + for (n = 0; n < nfds; n++) { + HIP_DEBUG("poll: orig_socket=%d\n", orig_fds[n].fd); + HIP_DEBUG("poll: events=%d\n", orig_fds[n].events); + HIP_DEBUG("poll: revents=%d\n", orig_fds[n].revents); + HIP_DEBUG("poll: nfds=%d\n", nfds); + hip_socketdb_dump(); + + if (hip_exists_translation(pid, orig_fds[n].fd, tid)) { + err = hip_translate_socket(&orig_fds[n].fd, NULL, &zero, + &translated_socket, + &translated_id, + &translated_id_len, 1, 0, 0); + orig_fds[n].fd = *translated_socket; + HIP_DEBUG("poll: translation happened\n"); + } + HIP_DEBUG("poll: translated_socket=%d\n", orig_fds[n].fd); + _HIP_DEBUG("poll: events=%d\n", translated_fds[n].events); + _HIP_DEBUG("poll: revents=%d\n", translated_fds[n].revents); + if (err) { + HIP_ERROR("Translation failure\n"); + goto out_err; + } + } + HIP_DEBUG("calling poll: timeout=%d\n", timeout); + err = dl_function_ptr.poll_dlsym(orig_fds, nfds, timeout); + HIP_DEBUG("coming back from poll: err=%d\n", err); + if (err) { + HIP_PERROR("connect error\n"); + } + +out_err: + return err; } + #endif @@ -1591,100 +1635,101 @@ */ ssize_t recvmsg(int s, struct msghdr *msg, int flags) { - int charnum = 0; - - // XX TODO: see hip_get_pktinfo_addr - charnum = dl_function_ptr.recvmsg_dlsym(s, msg, flags); - - _HIP_DEBUG("Called recvmsg_dlsym with number of returned chars=%d\n", - charnum); - - return charnum; + int charnum = 0; + + // XX TODO: see hip_get_pktinfo_addr + charnum = dl_function_ptr.recvmsg_dlsym(s, msg, flags); + + _HIP_DEBUG("Called recvmsg_dlsym with number of returned chars=%d\n", + charnum); + + return charnum; } #if 0 void test_db(void) { - int pid = getpid(); - int socket = 1; - int err = 0; - hip_opp_socket_t *entry = NULL; - // struct hip_opp_socket_entry *entry = NULL; - - HIP_DEBUG("1111 pid=%d, socket=%d\n", pid, socket); - entry = hip_socketdb_find_entry(pid, socket, pthread_self()); - HIP_ASSERT(!entry); - err = hip_socketdb_add_entry(pid, socket, pthread_self()); - HIP_ASSERT(!err); - entry = hip_socketdb_find_entry(pid, socket, pthread_self()); - HIP_ASSERT(entry); - hip_socketdb_dump(); - - // pid++; - socket++; - HIP_DEBUG("2222 pid=%d, socket=%d\n", pid, socket); - entry = NULL; - entry = hip_socketdb_find_entry(pid, socket, pthread_self()); - HIP_ASSERT(!entry); - err = hip_socketdb_add_entry(pid, socket, pthread_self()); - HIP_ASSERT(!err); - entry = hip_socketdb_find_entry(pid, socket, pthread_self()); - entry->translated_socket = socket+100; - HIP_ASSERT(entry); - hip_socketdb_dump(); - - - //pid++; - socket++; - HIP_DEBUG("3333 pid=%d, socket=%d\n", pid, socket); - entry = NULL; - entry = hip_socketdb_find_entry(pid, socket, pthread_self()); - HIP_ASSERT(!entry); - err = hip_socketdb_add_entry(pid, socket, pthread_self()); - HIP_ASSERT(!err); - entry = NULL; - entry = hip_socketdb_find_entry(pid, socket, pthread_self()); - HIP_ASSERT(entry); - hip_socketdb_dump(); - - HIP_DEBUG("3333 testing del entry\n\n"); - HIP_DEBUG("pid=%d, socket=%d\n", pid, socket); - entry = NULL; - entry = hip_socketdb_find_entry(pid, socket, pthread_self()); - HIP_ASSERT(entry); - entry = NULL; - err = hip_socketdb_del_entry(pid, socket, pthread_self()); - HIP_ASSERT(!err); - entry = NULL; - entry = hip_socketdb_find_entry(pid, socket, pthread_self()); - HIP_ASSERT(!entry); - hip_socketdb_dump(); - - - HIP_DEBUG("2222 testing del entry by entry\n\n"); - socket--; - HIP_DEBUG("pid=%d, socket=%d\n", pid, socket); - entry = NULL; - entry = hip_socketdb_find_entry(pid, socket, pthread_self()); - HIP_ASSERT(entry); - hip_socketdb_del_entry_by_entry(entry); - entry = NULL; - entry = NULL; - entry = hip_socketdb_find_entry(pid, socket, pthread_self()); - HIP_ASSERT(!entry); - hip_socketdb_dump(); - - HIP_DEBUG("1111 testing del entry by entry\n\n"); - socket--; - HIP_DEBUG("pid=%d, socket=%d\n", pid, socket); - entry = NULL; - entry = hip_socketdb_find_entry(pid, socket, pthread_self()); - HIP_ASSERT(entry); - hip_socketdb_del_entry_by_entry(entry); - entry = NULL; - entry = hip_socketdb_find_entry(pid, socket, pthread_self()); - HIP_ASSERT(!entry); - hip_socketdb_dump(); - HIP_DEBUG("end of testing db\n"); + int pid = getpid(); + int socket = 1; + int err = 0; + hip_opp_socket_t *entry = NULL; + // struct hip_opp_socket_entry *entry = NULL; + + HIP_DEBUG("1111 pid=%d, socket=%d\n", pid, socket); + entry = hip_socketdb_find_entry(pid, socket, pthread_self()); + HIP_ASSERT(!entry); + err = hip_socketdb_add_entry(pid, socket, pthread_self()); + HIP_ASSERT(!err); + entry = hip_socketdb_find_entry(pid, socket, pthread_self()); + HIP_ASSERT(entry); + hip_socketdb_dump(); + + // pid++; + socket++; + HIP_DEBUG("2222 pid=%d, socket=%d\n", pid, socket); + entry = NULL; + entry = hip_socketdb_find_entry(pid, socket, pthread_self()); + HIP_ASSERT(!entry); + err = hip_socketdb_add_entry(pid, socket, pthread_self()); + HIP_ASSERT(!err); + entry = hip_socketdb_find_entry(pid, socket, pthread_self()); + entry->translated_socket = socket + 100; + HIP_ASSERT(entry); + hip_socketdb_dump(); + + + //pid++; + socket++; + HIP_DEBUG("3333 pid=%d, socket=%d\n", pid, socket); + entry = NULL; + entry = hip_socketdb_find_entry(pid, socket, pthread_self()); + HIP_ASSERT(!entry); + err = hip_socketdb_add_entry(pid, socket, pthread_self()); + HIP_ASSERT(!err); + entry = NULL; + entry = hip_socketdb_find_entry(pid, socket, pthread_self()); + HIP_ASSERT(entry); + hip_socketdb_dump(); + + HIP_DEBUG("3333 testing del entry\n\n"); + HIP_DEBUG("pid=%d, socket=%d\n", pid, socket); + entry = NULL; + entry = hip_socketdb_find_entry(pid, socket, pthread_self()); + HIP_ASSERT(entry); + entry = NULL; + err = hip_socketdb_del_entry(pid, socket, pthread_self()); + HIP_ASSERT(!err); + entry = NULL; + entry = hip_socketdb_find_entry(pid, socket, pthread_self()); + HIP_ASSERT(!entry); + hip_socketdb_dump(); + + + HIP_DEBUG("2222 testing del entry by entry\n\n"); + socket--; + HIP_DEBUG("pid=%d, socket=%d\n", pid, socket); + entry = NULL; + entry = hip_socketdb_find_entry(pid, socket, pthread_self()); + HIP_ASSERT(entry); + hip_socketdb_del_entry_by_entry(entry); + entry = NULL; + entry = NULL; + entry = hip_socketdb_find_entry(pid, socket, pthread_self()); + HIP_ASSERT(!entry); + hip_socketdb_dump(); + + HIP_DEBUG("1111 testing del entry by entry\n\n"); + socket--; + HIP_DEBUG("pid=%d, socket=%d\n", pid, socket); + entry = NULL; + entry = hip_socketdb_find_entry(pid, socket, pthread_self()); + HIP_ASSERT(entry); + hip_socketdb_del_entry_by_entry(entry); + entry = NULL; + entry = hip_socketdb_find_entry(pid, socket, pthread_self()); + HIP_ASSERT(!entry); + hip_socketdb_dump(); + HIP_DEBUG("end of testing db\n"); } + #endif === modified file 'lib/opphip/wrap_db.c' --- lib/opphip/wrap_db.c 2010-01-19 11:51:05 +0000 +++ lib/opphip/wrap_db.c 2010-02-11 00:11:39 +0000 @@ -3,7 +3,8 @@ * * @author Bing Zhou <bingzhou@xxxxxxxxx> * @author Miika Komu <miika@xxxxxx> - * @note Distributed under <a href="http://www.gnu.org/licenses/gpl2.txt";>GNU/GPL</a> + * @note Distributed under + * <a href="http://www.gnu.org/licenses/gpl2.txt";>GNU/GPL</a> * */ #ifdef HAVE_CONFIG_H @@ -27,25 +28,27 @@ /** * check if a given socket has been recorded to the database * - * @param pid process id + * @param pid process id * @param socket socket file descriptor * @param tid thread id * @return one if socket existists in the database or zero otherwise */ int hip_exists_translation(int pid, int socket, pthread_t tid) { - hip_opp_socket_t *entry = NULL; - - entry = hip_socketdb_find_entry(pid, socket, tid); - - if(entry) { - if(entry->pid == pid && entry->orig_socket == socket && - entry->tid == tid) - return 1; - else - return 0; - } else - return 0; + hip_opp_socket_t *entry = NULL; + + entry = hip_socketdb_find_entry(pid, socket, tid); + + if (entry) { + if (entry->pid == pid && entry->orig_socket == socket && + entry->tid == tid) { + return 1; + } else { + return 0; + } + } else { + return 0; + } } /** @@ -56,17 +59,17 @@ */ unsigned long hip_pid_socket_hash(const void *ptr) { - hip_opp_socket_t *entry = (hip_opp_socket_t *)ptr; - uint8_t hash[HIP_AH_SHA_LEN]; - - /* - The hash table is indexed with three fields: - pid, original socket, tid (thread id) - */ - hip_build_digest(HIP_DIGEST_SHA1, entry, sizeof(pid_t)+sizeof(int)+sizeof(pthread_t), hash); - - return *((unsigned long *)hash); - + hip_opp_socket_t *entry = (hip_opp_socket_t *) ptr; + uint8_t hash[HIP_AH_SHA_LEN]; + + /* + * The hash table is indexed with three fields: + * pid, original socket, tid (thread id) + */ + hip_build_digest(HIP_DIGEST_SHA1, entry, + sizeof(pid_t) + sizeof(int) + sizeof(pthread_t), hash); + + return *((unsigned long *) hash); } /** A callback wrapper of the prototype required by @c lh_new(). */ @@ -81,12 +84,12 @@ */ int hip_socketdb_cmp(const void *ptr1, const void *ptr2) { - unsigned long key1, key2; - - key1 = hip_pid_socket_hash(ptr1); - key2 = hip_pid_socket_hash(ptr2); - _HIP_DEBUG("key1=0x%x key2=0x%x\n", key1, key2); - return (key1 != key2); + unsigned long key1, key2; + + key1 = hip_pid_socket_hash(ptr1); + key2 = hip_pid_socket_hash(ptr2); + _HIP_DEBUG("key1=0x%x key2=0x%x\n", key1, key2); + return key1 != key2; } /** A callback wrapper of the prototype required by @c lh_new(). */ @@ -98,10 +101,12 @@ */ void hip_init_socket_db() { - socketdb = hip_ht_init(LHASH_HASH_FN(hip_pid_socket), - LHASH_COMP_FN(hip_socketdb)); + socketdb = hip_ht_init(LHASH_HASH_FN(hip_pid_socket), + LHASH_COMP_FN(hip_socketdb)); - if (!socketdb) HIP_ERROR("hip_init_socket_db() error!\n"); + if (!socketdb) { + HIP_ERROR("hip_init_socket_db() error!\n"); + } } /** @@ -111,10 +116,11 @@ */ void hip_socketdb_del_entry_by_entry(hip_opp_socket_t *entry) { - _HIP_DEBUG("entry=0x%p pid=%d, orig_socket=%d\n", entry, - entry->pid, entry->orig_socket); - if (!hip_ht_delete(socketdb, entry)) - HIP_DEBUG("No entry was found to delete.\n"); + _HIP_DEBUG("entry=0x%p pid=%d, orig_socket=%d\n", entry, + entry->pid, entry->orig_socket); + if (!hip_ht_delete(socketdb, entry)) { + HIP_DEBUG("No entry was found to delete.\n"); + } } /** @@ -123,19 +129,18 @@ */ void hip_uninit_socket_db() { - int i = 0; - hip_list_t *item, *tmp; - hip_opp_socket_t *entry; - - _HIP_DEBUG("DEBUG: DUMP SOCKETDB LISTS\n"); - - _HIP_DEBUG("DELETING\n"); - list_for_each_safe(item, tmp, socketdb, i) - { - entry = (hip_opp_socket_t *)list_entry(item); - hip_socketdb_del_entry_by_entry(entry); - } - + int i = 0; + hip_list_t *item, *tmp; + hip_opp_socket_t *entry; + + _HIP_DEBUG("DEBUG: DUMP SOCKETDB LISTS\n"); + + _HIP_DEBUG("DELETING\n"); + list_for_each_safe(item, tmp, socketdb, i) + { + entry = (hip_opp_socket_t *) list_entry(item); + hip_socketdb_del_entry_by_entry(entry); + } } /** @@ -149,16 +154,16 @@ */ hip_opp_socket_t *hip_socketdb_find_entry(int pid, int socket, pthread_t tid) { - hip_opp_socket_t opp, *ret; - - opp.pid = pid; - opp.orig_socket = socket; - opp.tid = tid; - _HIP_DEBUG("pid %d socket %d computed key\n", pid, socket); - - ret = (hip_opp_socket_t *)hip_ht_find(socketdb, (void *)&opp); - - return ret; + hip_opp_socket_t opp, *ret; + + opp.pid = pid; + opp.orig_socket = socket; + opp.tid = tid; + _HIP_DEBUG("pid %d socket %d computed key\n", pid, socket); + + ret = (hip_opp_socket_t *) hip_ht_find(socketdb, (void *) &opp); + + return ret; } /** @@ -167,27 +172,25 @@ */ void hip_socketdb_dump() { - int i; - hip_list_t *item, *tmp; - hip_opp_socket_t *entry; - - HIP_DEBUG("start socketdb dump\n"); - - list_for_each_safe(item, tmp, socketdb, i) - { - entry = (hip_opp_socket_t *)list_entry(item); - - HIP_DEBUG("pid=%d orig_socket=%d tid=%d new_socket=%d domain=%d\n", - entry->pid, entry->orig_socket, entry->tid, - entry->translated_socket, - entry->domain); - - } - - HIP_DEBUG("end socketdb dump\n"); + int i; + hip_list_t *item, *tmp; + hip_opp_socket_t *entry; + + HIP_DEBUG("start socketdb dump\n"); + + list_for_each_safe(item, tmp, socketdb, i) + { + entry = (hip_opp_socket_t *) list_entry(item); + + HIP_DEBUG("pid=%d orig_socket=%d tid=%d new_socket=%d domain=%d\n", + entry->pid, entry->orig_socket, entry->tid, + entry->translated_socket, + entry->domain); + } + + HIP_DEBUG("end socketdb dump\n"); } - /** * add a new translated entry to the opportunistic HIP database * @@ -198,27 +201,26 @@ */ int hip_socketdb_add_entry(int pid, int socket, pthread_t tid) { - hip_opp_socket_t *new_item = NULL; - int err = 0; - - new_item = (hip_opp_socket_t *)malloc(sizeof(hip_opp_socket_t)); - if (!new_item) - { - HIP_ERROR("new_item malloc failed\n"); - err = -ENOMEM; - return err; - } - - memset(new_item, 0, sizeof(hip_opp_socket_t)); - - new_item->pid = pid; - new_item->orig_socket = socket; - new_item->tid = tid; - err = hip_ht_add(socketdb, new_item); - _HIP_DEBUG("pid %d, orig_sock %d, tid %d are added to HT socketdb, entry=%p\n", - new_item->pid, new_item->orig_socket, new_item->tid, new_item); - - return err; + hip_opp_socket_t *new_item = NULL; + int err = 0; + + new_item = (hip_opp_socket_t *) malloc(sizeof(hip_opp_socket_t)); + if (!new_item) { + HIP_ERROR("new_item malloc failed\n"); + err = -ENOMEM; + return err; + } + + memset(new_item, 0, sizeof(hip_opp_socket_t)); + + new_item->pid = pid; + new_item->orig_socket = socket; + new_item->tid = tid; + err = hip_ht_add(socketdb, new_item); + _HIP_DEBUG("pid %d, orig_sock %d, tid %d are added to HT socketdb, entry=%p\n", + new_item->pid, new_item->orig_socket, new_item->tid, new_item); + + return err; } /** @@ -231,13 +233,13 @@ */ int hip_socketdb_del_entry(int pid, int socket, pthread_t tid) { - hip_opp_socket_t *entry = NULL; - - entry = hip_socketdb_find_entry(pid, socket, tid); - if (!entry) { - return -ENOENT; - } - hip_socketdb_del_entry_by_entry(entry); - - return 0; + hip_opp_socket_t *entry = NULL; + + entry = hip_socketdb_find_entry(pid, socket, tid); + if (!entry) { + return -ENOENT; + } + hip_socketdb_del_entry_by_entry(entry); + + return 0; } === modified file 'lib/opphip/wrap_db.h' --- lib/opphip/wrap_db.h 2010-01-19 11:51:05 +0000 +++ lib/opphip/wrap_db.h 2010-02-11 00:11:39 +0000 @@ -2,24 +2,24 @@ #define WRAP_DB_H struct hip_opp_socket_entry { - pid_t pid; - int orig_socket; - pthread_t tid; - int translated_socket; - int domain; - int type; - int protocol; - int local_id_is_translated; - int peer_id_is_translated; - int force_orig; - struct sockaddr_storage orig_local_id; - struct sockaddr_storage orig_peer_id; - struct sockaddr_storage translated_local_id; - struct sockaddr_storage translated_peer_id; - socklen_t orig_local_id_len; - socklen_t orig_peer_id_len; - socklen_t translated_local_id_len; - socklen_t translated_peer_id_len; + pid_t pid; + int orig_socket; + pthread_t tid; + int translated_socket; + int domain; + int type; + int protocol; + int local_id_is_translated; + int peer_id_is_translated; + int force_orig; + struct sockaddr_storage orig_local_id; + struct sockaddr_storage orig_peer_id; + struct sockaddr_storage translated_local_id; + struct sockaddr_storage translated_peer_id; + socklen_t orig_local_id_len; + socklen_t orig_peer_id_len; + socklen_t translated_local_id_len; + socklen_t translated_peer_id_len; }; typedef struct hip_opp_socket_entry hip_opp_socket_t; @@ -27,10 +27,10 @@ // not implemented for hs either #define HIP_LOCK_SOCKET_INIT(entry) #define HIP_UNLOCK_SOCKET_INIT(entry) -#define HIP_LOCK_SOCKET(entry) +#define HIP_LOCK_SOCKET(entry) #define HIP_UNLOCK_SOCKET(entry) #define HIP_SOCKETDB_SIZE 533 -#define SOFILE "libc.so.6" +#define SOFILE "libc.so.6" void hip_init_socket_db(void); void hip_uninit_socket_db(void); @@ -40,10 +40,11 @@ int hip_socketdb_add_entry(int pid, int socket, pthread_t tid); int hip_socketdb_del_entry(int pid, int socket, pthread_t tid); // functions in wrap_db.c -int request_pseudo_hit_from_hipd(const struct in6_addr *ip, struct in6_addr *phit); -int request_peer_hit_from_hipd(const struct in6_addr *ip, - struct in6_addr *peer_hit, - const struct in6_addr *local_hit); +int request_pseudo_hit_from_hipd(const struct in6_addr *ip, + struct in6_addr *phit); +int request_peer_hit_from_hipd(const struct in6_addr *ip, + struct in6_addr *peer_hit, + const struct in6_addr *local_hit); int exists_mapping(int pid, int socket); int hip_exists_translation(int pid, int socket, pthread_t tid); void hip_socketdb_del_entry_by_entry(hip_opp_socket_t *entry);