Commit a8e056bf authored by Pavel Emelyanov's avatar Pavel Emelyanov

inet: Factor out sockaddr-s preparations

Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 7cb67410
...@@ -517,33 +517,45 @@ err: ...@@ -517,33 +517,45 @@ err:
return -1; return -1;
} }
int inet_bind(int sk, struct inet_sk_info *ii) union sockaddr_inet {
struct sockaddr_in v4;
struct sockaddr_in6 v6;
};
static int restore_sockaddr(union sockaddr_inet *sa,
int family, uint32_t pb_port, uint32_t *pb_addr)
{ {
union { BUILD_BUG_ON(sizeof(sa->v4.sin_addr.s_addr) > PB_ALEN_INET * sizeof(uint32_t));
struct sockaddr_in v4; BUILD_BUG_ON(sizeof(sa->v6.sin6_addr.s6_addr) > PB_ALEN_INET6 * sizeof(uint32_t));
struct sockaddr_in6 v6;
} addr; memzero(sa, sizeof(*sa));
int addr_size = 0;
if (family == AF_INET) {
BUILD_BUG_ON(sizeof(addr.v4.sin_addr.s_addr) > PB_ALEN_INET * sizeof(uint32_t)); sa->v4.sin_family = AF_INET;
BUILD_BUG_ON(sizeof(addr.v6.sin6_addr.s6_addr) > PB_ALEN_INET6 * sizeof(uint32_t)); sa->v4.sin_port = htons(pb_port);
memcpy(&sa->v4.sin_addr.s_addr, pb_addr, sizeof(sa->v4.sin_addr.s_addr));
memzero(&addr, sizeof(addr)); return sizeof(sa->v4);
if (ii->ie->family == AF_INET) { }
addr.v4.sin_family = ii->ie->family;
addr.v4.sin_port = htons(ii->ie->src_port); if (family == AF_INET6) {
memcpy(&addr.v4.sin_addr.s_addr, ii->ie->src_addr, sizeof(addr.v4.sin_addr.s_addr)); sa->v6.sin6_family = AF_INET6;
addr_size = sizeof(addr.v4); sa->v6.sin6_port = htons(pb_port);
} else if (ii->ie->family == AF_INET6) { memcpy(sa->v6.sin6_addr.s6_addr, pb_addr, sizeof(sa->v6.sin6_addr.s6_addr));
addr.v6.sin6_family = ii->ie->family; return sizeof(sa->v6);
addr.v6.sin6_port = htons(ii->ie->src_port);
memcpy(&addr.v6.sin6_addr.s6_addr, ii->ie->src_addr, sizeof(addr.v6.sin6_addr.s6_addr));
addr_size = sizeof(addr.v6);
} else {
pr_perror("Unsupported address family: %d\n", ii->ie->family);
return -1;
} }
BUG();
return -1;
}
int inet_bind(int sk, struct inet_sk_info *ii)
{
union sockaddr_inet addr;
int addr_size;
addr_size = restore_sockaddr(&addr, ii->ie->family,
ii->ie->src_port, ii->ie->src_addr);
if (bind(sk, (struct sockaddr *)&addr, addr_size) == -1) { if (bind(sk, (struct sockaddr *)&addr, addr_size) == -1) {
pr_perror("Can't bind inet socket"); pr_perror("Can't bind inet socket");
return -1; return -1;
...@@ -554,28 +566,11 @@ int inet_bind(int sk, struct inet_sk_info *ii) ...@@ -554,28 +566,11 @@ int inet_bind(int sk, struct inet_sk_info *ii)
int inet_connect(int sk, struct inet_sk_info *ii) int inet_connect(int sk, struct inet_sk_info *ii)
{ {
union { union sockaddr_inet addr;
struct sockaddr_in v4; int addr_size;
struct sockaddr_in6 v6;
} addr; addr_size = restore_sockaddr(&addr, ii->ie->family,
int addr_size = 0; ii->ie->dst_port, ii->ie->dst_addr);
memzero(&addr, sizeof(addr));
if (ii->ie->family == AF_INET) {
addr.v4.sin_family = ii->ie->family;
addr.v4.sin_port = htons(ii->ie->dst_port);
memcpy(&addr.v4.sin_addr.s_addr, ii->ie->dst_addr, sizeof(addr.v4.sin_addr.s_addr));
addr_size = sizeof(addr.v4);
} else if (ii->ie->family == AF_INET6) {
addr.v6.sin6_family = ii->ie->family;
addr.v6.sin6_port = htons(ii->ie->dst_port);
memcpy(&addr.v6.sin6_addr.s6_addr, ii->ie->dst_addr, sizeof(addr.v6.sin6_addr.s6_addr));
addr_size = sizeof(addr.v6);
} else {
pr_perror("Unsupported address family: %d\n", ii->ie->family);
return -1;
}
if (connect(sk, (struct sockaddr *)&addr, addr_size) == -1) { if (connect(sk, (struct sockaddr *)&addr, addr_size) == -1) {
pr_perror("Can't connect inet socket back"); pr_perror("Can't connect inet socket back");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment