Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
D
Dnsmasq
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nanahira
Dnsmasq
Commits
3b3f4411
Commit
3b3f4411
authored
Oct 11, 2013
by
Simon Kelley
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Log SO_BINDTODEVICE use at startup.
parent
24b5a5d5
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
47 additions
and
22 deletions
+47
-22
src/dhcp-common.c
src/dhcp-common.c
+21
-15
src/dnsmasq.c
src/dnsmasq.c
+24
-6
src/dnsmasq.h
src/dnsmasq.h
+2
-1
No files found.
src/dhcp-common.c
View file @
3b3f4411
...
...
@@ -444,7 +444,7 @@ void dhcp_update_configs(struct dhcp_config *configs)
}
#ifdef HAVE_LINUX_NETWORK
void
bindtodevice
(
int
f
d
)
char
*
whichdevice
(
voi
d
)
{
/* If we are doing DHCP on exactly one interface, and running linux, do SO_BINDTODEVICE
to that device. This is for the use case of (eg) OpenStack, which runs a new
...
...
@@ -459,13 +459,13 @@ void bindtodevice(int fd)
struct
irec
*
iface
,
*
found
;
struct
iname
*
if_tmp
;
if
(
!
daemon
->
if_names
)
return
;
return
NULL
;
for
(
if_tmp
=
daemon
->
if_names
;
if_tmp
;
if_tmp
=
if_tmp
->
next
)
if
(
if_tmp
->
name
&&
(
!
if_tmp
->
used
||
strchr
(
if_tmp
->
name
,
'*'
)))
return
;
return
NULL
;
for
(
found
=
NULL
,
iface
=
daemon
->
interfaces
;
iface
;
iface
=
iface
->
next
)
if
(
iface
->
dhcp_ok
)
...
...
@@ -473,18 +473,24 @@ void bindtodevice(int fd)
if
(
!
found
)
found
=
iface
;
else
if
(
strcmp
(
found
->
name
,
iface
->
name
)
!=
0
)
return
;
/* more than one. */
return
NULL
;
/* more than one. */
}
if
(
found
)
{
struct
ifreq
ifr
;
strcpy
(
ifr
.
ifr_name
,
found
->
name
);
/* only allowed by root. */
if
(
setsockopt
(
fd
,
SOL_SOCKET
,
SO_BINDTODEVICE
,
(
void
*
)
&
ifr
,
sizeof
(
ifr
))
==
-
1
&&
errno
!=
EPERM
)
die
(
_
(
"failed to set SO_BINDTODEVICE on DHCP socket: %s"
),
NULL
,
EC_BADNET
);
}
return
found
->
name
;
return
NULL
;
}
void
bindtodevice
(
char
*
device
,
int
fd
)
{
struct
ifreq
ifr
;
strcpy
(
ifr
.
ifr_name
,
device
);
/* only allowed by root. */
if
(
setsockopt
(
fd
,
SOL_SOCKET
,
SO_BINDTODEVICE
,
(
void
*
)
&
ifr
,
sizeof
(
ifr
))
==
-
1
&&
errno
!=
EPERM
)
die
(
_
(
"failed to set SO_BINDTODEVICE on DHCP socket: %s"
),
NULL
,
EC_BADNET
);
}
#endif
...
...
src/dnsmasq.c
View file @
3b3f4411
...
...
@@ -50,6 +50,8 @@ int main (int argc, char **argv)
#if defined(HAVE_LINUX_NETWORK)
cap_user_header_t
hdr
=
NULL
;
cap_user_data_t
data
=
NULL
;
char
*
bound_device
=
NULL
;
int
did_bind
=
0
;
#endif
#if defined(HAVE_DHCP) || defined(HAVE_DHCP6)
struct
dhcp_context
*
context
;
...
...
@@ -239,18 +241,29 @@ int main (int argc, char **argv)
#if defined(HAVE_LINUX_NETWORK) && defined(HAVE_DHCP)
/* after enumerate_interfaces() */
bound_device
=
whichdevice
();
if
(
daemon
->
dhcp
)
{
if
(
!
daemon
->
relay4
)
bindtodevice
(
daemon
->
dhcpfd
);
if
(
daemon
->
enable_pxe
)
bindtodevice
(
daemon
->
pxefd
);
if
(
!
daemon
->
relay4
&&
bound_device
)
{
bindtodevice
(
bound_device
,
daemon
->
dhcpfd
);
did_bind
=
1
;
}
if
(
daemon
->
enable_pxe
&&
bound_device
)
{
bindtodevice
(
bound_device
,
daemon
->
pxefd
);
did_bind
=
1
;
}
}
#endif
#if defined(HAVE_LINUX_NETWORK) && defined(HAVE_DHCP6)
if
(
daemon
->
doing_dhcp6
&&
!
daemon
->
relay6
)
bindtodevice
(
daemon
->
dhcp6fd
);
if
(
daemon
->
doing_dhcp6
&&
!
daemon
->
relay6
&&
bound_device
)
{
bindtodevice
(
bound_device
,
daemon
->
dhcp6fd
);
did_bind
=
1
;
}
#endif
}
else
...
...
@@ -659,6 +672,11 @@ int main (int argc, char **argv)
my_syslog
(
MS_DHCP
|
LOG_INFO
,
_
(
"IPv6 router advertisement enabled"
));
# endif
# ifdef HAVE_LINUX_NETWORK
if
(
did_bind
)
my_syslog
(
MS_DHCP
|
LOG_INFO
,
_
(
"DHCP, sockets bound exclusively to interface %s"
),
bound_device
);
# endif
/* after dhcp_contruct_contexts */
if
(
daemon
->
dhcp
||
daemon
->
doing_dhcp6
)
lease_find_interfaces
(
now
);
...
...
src/dnsmasq.h
View file @
3b3f4411
...
...
@@ -1268,7 +1268,8 @@ struct dhcp_config *find_config(struct dhcp_config *configs,
int
hw_type
,
char
*
hostname
);
int
config_has_mac
(
struct
dhcp_config
*
config
,
unsigned
char
*
hwaddr
,
int
len
,
int
type
);
#ifdef HAVE_LINUX_NETWORK
void
bindtodevice
(
int
fd
);
char
*
whichdevice
(
void
);
void
bindtodevice
(
char
*
device
,
int
fd
);
#endif
# ifdef HAVE_DHCP6
void
display_opts6
(
void
);
...
...
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