Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
C
criu
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zhul
criu
Commits
a8e056bf
Commit
a8e056bf
authored
Aug 20, 2012
by
Pavel Emelyanov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
inet: Factor out sockaddr-s preparations
Signed-off-by:
Pavel Emelyanov
<
xemul@parallels.com
>
parent
7cb67410
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
41 additions
and
46 deletions
+41
-46
sk-inet.c
sk-inet.c
+41
-46
No files found.
sk-inet.c
View file @
a8e056bf
...
@@ -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"
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment