Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
cd0e8af5
Commit
cd0e8af5
authored
Feb 13, 2004
by
Julian Anastasov
Committed by
David S. Miller
Feb 13, 2004
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[IPV4]: Add configurable restriction of local IP announcements in ARP requests.
parent
8daca410
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
71 additions
and
4 deletions
+71
-4
Documentation/networking/ip-sysctl.txt
Documentation/networking/ip-sysctl.txt
+31
-0
include/linux/inetdevice.h
include/linux/inetdevice.h
+2
-0
include/linux/sysctl.h
include/linux/sysctl.h
+1
-0
net/ipv4/arp.c
net/ipv4/arp.c
+28
-3
net/ipv4/devinet.c
net/ipv4/devinet.c
+9
-1
No files found.
Documentation/networking/ip-sysctl.txt
View file @
cd0e8af5
...
@@ -499,6 +499,37 @@ arp_filter - BOOLEAN
...
@@ -499,6 +499,37 @@ arp_filter - BOOLEAN
conf/{all,interface}/arp_filter is set to TRUE,
conf/{all,interface}/arp_filter is set to TRUE,
it will be disabled otherwise
it will be disabled otherwise
arp_announce - INTEGER
Define different restriction levels for announcing the local
source IP address from IP packets in ARP requests sent on
interface:
0 - (default) Use any local address, configured on any interface
1 - Try to avoid local addresses that are not in the target's
subnet for this interface. This mode is useful when target
hosts reachable via this interface require the source IP
address in ARP requests to be part of their logical network
configured on the receiving interface. When we generate the
request we will check all our subnets that include the
target IP and will preserve the source address if it is from
such subnet. If there is no such subnet we select source
address according to the rules for level 2.
2 - Always use the best local address for this target.
In this mode we ignore the source address in the IP packet
and try to select local address that we prefer for talks with
the target host. Such local address is selected by looking
for primary IP addresses on all our subnets on the outgoing
interface that include the target IP address. If no suitable
local address is found we select the first local address
we have on the outgoing interface or on all other interfaces,
with the hope we will receive reply for our request and
even sometimes no matter the source IP address we announce.
The max value from conf/{all,interface}/arp_announce is used.
Increasing the restriction level gives more chance for
receiving answer from the resolved target while decreasing
the level announces more valid sender's information.
tag - INTEGER
tag - INTEGER
Allows you to write a number, which can be used as required.
Allows you to write a number, which can be used as required.
Default value is 0.
Default value is 0.
...
...
include/linux/inetdevice.h
View file @
cd0e8af5
...
@@ -18,6 +18,7 @@ struct ipv4_devconf
...
@@ -18,6 +18,7 @@ struct ipv4_devconf
int
mc_forwarding
;
int
mc_forwarding
;
int
tag
;
int
tag
;
int
arp_filter
;
int
arp_filter
;
int
arp_announce
;
int
medium_id
;
int
medium_id
;
int
no_xfrm
;
int
no_xfrm
;
int
no_policy
;
int
no_policy
;
...
@@ -71,6 +72,7 @@ struct in_device
...
@@ -71,6 +72,7 @@ struct in_device
(ipv4_devconf.accept_redirects || (in_dev)->cnf.accept_redirects)))
(ipv4_devconf.accept_redirects || (in_dev)->cnf.accept_redirects)))
#define IN_DEV_ARPFILTER(in_dev) (ipv4_devconf.arp_filter || (in_dev)->cnf.arp_filter)
#define IN_DEV_ARPFILTER(in_dev) (ipv4_devconf.arp_filter || (in_dev)->cnf.arp_filter)
#define IN_DEV_ARP_ANNOUNCE(in_dev) (max(ipv4_devconf.arp_announce, (in_dev)->cnf.arp_announce))
struct
in_ifaddr
struct
in_ifaddr
{
{
...
...
include/linux/sysctl.h
View file @
cd0e8af5
...
@@ -362,6 +362,7 @@ enum
...
@@ -362,6 +362,7 @@ enum
NET_IPV4_CONF_NOXFRM
=
15
,
NET_IPV4_CONF_NOXFRM
=
15
,
NET_IPV4_CONF_NOPOLICY
=
16
,
NET_IPV4_CONF_NOPOLICY
=
16
,
NET_IPV4_CONF_FORCE_IGMP_VERSION
=
17
,
NET_IPV4_CONF_FORCE_IGMP_VERSION
=
17
,
NET_IPV4_CONF_ARP_ANNOUNCE
=
18
,
};
};
/* /proc/sys/net/ipv4/netfilter */
/* /proc/sys/net/ipv4/netfilter */
...
...
net/ipv4/arp.c
View file @
cd0e8af5
...
@@ -325,15 +325,40 @@ static void arp_error_report(struct neighbour *neigh, struct sk_buff *skb)
...
@@ -325,15 +325,40 @@ static void arp_error_report(struct neighbour *neigh, struct sk_buff *skb)
static
void
arp_solicit
(
struct
neighbour
*
neigh
,
struct
sk_buff
*
skb
)
static
void
arp_solicit
(
struct
neighbour
*
neigh
,
struct
sk_buff
*
skb
)
{
{
u32
saddr
;
u32
saddr
=
0
;
u8
*
dst_ha
=
NULL
;
u8
*
dst_ha
=
NULL
;
struct
net_device
*
dev
=
neigh
->
dev
;
struct
net_device
*
dev
=
neigh
->
dev
;
u32
target
=
*
(
u32
*
)
neigh
->
primary_key
;
u32
target
=
*
(
u32
*
)
neigh
->
primary_key
;
int
probes
=
atomic_read
(
&
neigh
->
probes
);
int
probes
=
atomic_read
(
&
neigh
->
probes
);
struct
in_device
*
in_dev
=
in_dev_get
(
dev
);
if
(
!
in_dev
)
return
;
switch
(
IN_DEV_ARP_ANNOUNCE
(
in_dev
))
{
default:
case
0
:
/* By default announce any local IP */
if
(
skb
&&
inet_addr_type
(
skb
->
nh
.
iph
->
saddr
)
==
RTN_LOCAL
)
if
(
skb
&&
inet_addr_type
(
skb
->
nh
.
iph
->
saddr
)
==
RTN_LOCAL
)
saddr
=
skb
->
nh
.
iph
->
saddr
;
saddr
=
skb
->
nh
.
iph
->
saddr
;
else
break
;
case
1
:
/* Restrict announcements of saddr in same subnet */
if
(
!
skb
)
break
;
saddr
=
skb
->
nh
.
iph
->
saddr
;
if
(
inet_addr_type
(
saddr
)
==
RTN_LOCAL
)
{
/* saddr should be known to target */
if
(
inet_addr_onlink
(
in_dev
,
target
,
saddr
))
break
;
}
saddr
=
0
;
break
;
case
2
:
/* Avoid secondary IPs, get a primary/preferred one */
break
;
}
if
(
in_dev
)
in_dev_put
(
in_dev
);
if
(
!
saddr
)
saddr
=
inet_select_addr
(
dev
,
target
,
RT_SCOPE_LINK
);
saddr
=
inet_select_addr
(
dev
,
target
,
RT_SCOPE_LINK
);
if
((
probes
-=
neigh
->
parms
->
ucast_probes
)
<
0
)
{
if
((
probes
-=
neigh
->
parms
->
ucast_probes
)
<
0
)
{
...
...
net/ipv4/devinet.c
View file @
cd0e8af5
...
@@ -1132,7 +1132,7 @@ int ipv4_doint_and_flush_strategy(ctl_table *table, int *name, int nlen,
...
@@ -1132,7 +1132,7 @@ int ipv4_doint_and_flush_strategy(ctl_table *table, int *name, int nlen,
static
struct
devinet_sysctl_table
{
static
struct
devinet_sysctl_table
{
struct
ctl_table_header
*
sysctl_header
;
struct
ctl_table_header
*
sysctl_header
;
ctl_table
devinet_vars
[
1
8
];
ctl_table
devinet_vars
[
1
9
];
ctl_table
devinet_dev
[
2
];
ctl_table
devinet_dev
[
2
];
ctl_table
devinet_conf_dir
[
2
];
ctl_table
devinet_conf_dir
[
2
];
ctl_table
devinet_proto_dir
[
2
];
ctl_table
devinet_proto_dir
[
2
];
...
@@ -1251,6 +1251,14 @@ static struct devinet_sysctl_table {
...
@@ -1251,6 +1251,14 @@ static struct devinet_sysctl_table {
.
mode
=
0644
,
.
mode
=
0644
,
.
proc_handler
=
&
proc_dointvec
,
.
proc_handler
=
&
proc_dointvec
,
},
},
{
.
ctl_name
=
NET_IPV4_CONF_ARP_ANNOUNCE
,
.
procname
=
"arp_announce"
,
.
data
=
&
ipv4_devconf
.
arp_announce
,
.
maxlen
=
sizeof
(
int
),
.
mode
=
0644
,
.
proc_handler
=
&
proc_dointvec
,
},
{
{
.
ctl_name
=
NET_IPV4_CONF_NOXFRM
,
.
ctl_name
=
NET_IPV4_CONF_NOXFRM
,
.
procname
=
"disable_xfrm"
,
.
procname
=
"disable_xfrm"
,
...
...
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