Commit 1f9248e5 authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller

neigh: convert parms to an array

This patch converts the neigh param members to an array. This allows easier
manipulation which will be needed later on to provide better management of
default values.
Signed-off-by: default avatarJiri Pirko <jiri@resnulli.us>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 65be6291
...@@ -37,6 +37,32 @@ ...@@ -37,6 +37,32 @@
struct neighbour; struct neighbour;
enum {
NEIGH_VAR_MCAST_PROBES,
NEIGH_VAR_UCAST_PROBES,
NEIGH_VAR_APP_PROBES,
NEIGH_VAR_RETRANS_TIME,
NEIGH_VAR_BASE_REACHABLE_TIME,
NEIGH_VAR_DELAY_PROBE_TIME,
NEIGH_VAR_GC_STALETIME,
NEIGH_VAR_QUEUE_LEN_BYTES,
NEIGH_VAR_PROXY_QLEN,
NEIGH_VAR_ANYCAST_DELAY,
NEIGH_VAR_PROXY_DELAY,
NEIGH_VAR_LOCKTIME,
#define NEIGH_VAR_DATA_MAX (NEIGH_VAR_LOCKTIME + 1)
/* Following are used as a second way to access one of the above */
NEIGH_VAR_QUEUE_LEN, /* same data as NEIGH_VAR_QUEUE_LEN_BYTES */
NEIGH_VAR_RETRANS_TIME_MS, /* same data as NEIGH_VAR_RETRANS_TIME */
NEIGH_VAR_BASE_REACHABLE_TIME_MS, /* same data as NEIGH_VAR_BASE_REACHABLE_TIME */
/* Following are used by "default" only */
NEIGH_VAR_GC_INTERVAL,
NEIGH_VAR_GC_THRESH1,
NEIGH_VAR_GC_THRESH2,
NEIGH_VAR_GC_THRESH3,
NEIGH_VAR_MAX
};
struct neigh_parms { struct neigh_parms {
#ifdef CONFIG_NET_NS #ifdef CONFIG_NET_NS
struct net *net; struct net *net;
...@@ -53,22 +79,18 @@ struct neigh_parms { ...@@ -53,22 +79,18 @@ struct neigh_parms {
atomic_t refcnt; atomic_t refcnt;
struct rcu_head rcu_head; struct rcu_head rcu_head;
int base_reachable_time;
int retrans_time;
int gc_staletime;
int reachable_time; int reachable_time;
int delay_probe_time; int data[NEIGH_VAR_DATA_MAX];
int queue_len_bytes;
int ucast_probes;
int app_probes;
int mcast_probes;
int anycast_delay;
int proxy_delay;
int proxy_qlen;
int locktime;
}; };
static inline void neigh_var_set(struct neigh_parms *p, int index, int val)
{
p->data[index] = val;
}
#define NEIGH_VAR(p, attr) ((p)->data[NEIGH_VAR_ ## attr])
#define NEIGH_VAR_SET(p, attr, val) neigh_var_set(p, NEIGH_VAR_ ## attr, val)
struct neigh_statistics { struct neigh_statistics {
unsigned long allocs; /* number of allocated neighs */ unsigned long allocs; /* number of allocated neighs */
unsigned long destroys; /* number of destroyed neighs */ unsigned long destroys; /* number of destroyed neighs */
......
...@@ -172,14 +172,14 @@ EXPORT_SYMBOL(hippi_mac_addr); ...@@ -172,14 +172,14 @@ EXPORT_SYMBOL(hippi_mac_addr);
int hippi_neigh_setup_dev(struct net_device *dev, struct neigh_parms *p) int hippi_neigh_setup_dev(struct net_device *dev, struct neigh_parms *p)
{ {
/* Never send broadcast/multicast ARP messages */ /* Never send broadcast/multicast ARP messages */
p->mcast_probes = 0; NEIGH_VAR_SET(p, MCAST_PROBES, 0);
/* In IPv6 unicast probes are valid even on NBMA, /* In IPv6 unicast probes are valid even on NBMA,
* because they are encapsulated in normal IPv6 protocol. * because they are encapsulated in normal IPv6 protocol.
* Should be a generic flag. * Should be a generic flag.
*/ */
if (p->tbl->family != AF_INET6) if (p->tbl->family != AF_INET6)
p->ucast_probes = 0; NEIGH_VAR_SET(p, UCAST_PROBES, 0);
return 0; return 0;
} }
EXPORT_SYMBOL(hippi_neigh_setup_dev); EXPORT_SYMBOL(hippi_neigh_setup_dev);
......
This diff is collapsed.
...@@ -102,19 +102,21 @@ struct neigh_table dn_neigh_table = { ...@@ -102,19 +102,21 @@ struct neigh_table dn_neigh_table = {
.id = "dn_neigh_cache", .id = "dn_neigh_cache",
.parms ={ .parms ={
.tbl = &dn_neigh_table, .tbl = &dn_neigh_table,
.base_reachable_time = 30 * HZ,
.retrans_time = 1 * HZ,
.gc_staletime = 60 * HZ,
.reachable_time = 30 * HZ, .reachable_time = 30 * HZ,
.delay_probe_time = 5 * HZ, .data = {
.queue_len_bytes = 64*1024, [NEIGH_VAR_MCAST_PROBES] = 0,
.ucast_probes = 0, [NEIGH_VAR_UCAST_PROBES] = 0,
.app_probes = 0, [NEIGH_VAR_APP_PROBES] = 0,
.mcast_probes = 0, [NEIGH_VAR_RETRANS_TIME] = 1 * HZ,
.anycast_delay = 0, [NEIGH_VAR_BASE_REACHABLE_TIME] = 30 * HZ,
.proxy_delay = 0, [NEIGH_VAR_DELAY_PROBE_TIME] = 5 * HZ,
.proxy_qlen = 0, [NEIGH_VAR_GC_STALETIME] = 60 * HZ,
.locktime = 1 * HZ, [NEIGH_VAR_QUEUE_LEN_BYTES] = 64*1024,
[NEIGH_VAR_PROXY_QLEN] = 0,
[NEIGH_VAR_ANYCAST_DELAY] = 0,
[NEIGH_VAR_PROXY_DELAY] = 0,
[NEIGH_VAR_LOCKTIME] = 1 * HZ,
},
}, },
.gc_interval = 30 * HZ, .gc_interval = 30 * HZ,
.gc_thresh1 = 128, .gc_thresh1 = 128,
......
...@@ -166,18 +166,20 @@ struct neigh_table arp_tbl = { ...@@ -166,18 +166,20 @@ struct neigh_table arp_tbl = {
.id = "arp_cache", .id = "arp_cache",
.parms = { .parms = {
.tbl = &arp_tbl, .tbl = &arp_tbl,
.base_reachable_time = 30 * HZ,
.retrans_time = 1 * HZ,
.gc_staletime = 60 * HZ,
.reachable_time = 30 * HZ, .reachable_time = 30 * HZ,
.delay_probe_time = 5 * HZ, .data = {
.queue_len_bytes = 64*1024, [NEIGH_VAR_MCAST_PROBES] = 3,
.ucast_probes = 3, [NEIGH_VAR_UCAST_PROBES] = 3,
.mcast_probes = 3, [NEIGH_VAR_RETRANS_TIME] = 1 * HZ,
.anycast_delay = 1 * HZ, [NEIGH_VAR_BASE_REACHABLE_TIME] = 30 * HZ,
.proxy_delay = (8 * HZ) / 10, [NEIGH_VAR_DELAY_PROBE_TIME] = 5 * HZ,
.proxy_qlen = 64, [NEIGH_VAR_GC_STALETIME] = 60 * HZ,
.locktime = 1 * HZ, [NEIGH_VAR_QUEUE_LEN_BYTES] = 64 * 1024,
[NEIGH_VAR_PROXY_QLEN] = 64,
[NEIGH_VAR_ANYCAST_DELAY] = 1 * HZ,
[NEIGH_VAR_PROXY_DELAY] = (8 * HZ) / 10,
[NEIGH_VAR_LOCKTIME] = 1 * HZ,
},
}, },
.gc_interval = 30 * HZ, .gc_interval = 30 * HZ,
.gc_thresh1 = 128, .gc_thresh1 = 128,
...@@ -359,14 +361,14 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb) ...@@ -359,14 +361,14 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb)
if (!saddr) if (!saddr)
saddr = inet_select_addr(dev, target, RT_SCOPE_LINK); saddr = inet_select_addr(dev, target, RT_SCOPE_LINK);
probes -= neigh->parms->ucast_probes; probes -= NEIGH_VAR(neigh->parms, UCAST_PROBES);
if (probes < 0) { if (probes < 0) {
if (!(neigh->nud_state & NUD_VALID)) if (!(neigh->nud_state & NUD_VALID))
pr_debug("trying to ucast probe in NUD_INVALID\n"); pr_debug("trying to ucast probe in NUD_INVALID\n");
neigh_ha_snapshot(dst_ha, neigh, dev); neigh_ha_snapshot(dst_ha, neigh, dev);
dst_hw = dst_ha; dst_hw = dst_ha;
} else { } else {
probes -= neigh->parms->app_probes; probes -= NEIGH_VAR(neigh->parms, APP_PROBES);
if (probes < 0) { if (probes < 0) {
neigh_app_ns(neigh); neigh_app_ns(neigh);
return; return;
...@@ -871,7 +873,7 @@ static int arp_process(struct sk_buff *skb) ...@@ -871,7 +873,7 @@ static int arp_process(struct sk_buff *skb)
if (NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED || if (NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED ||
skb->pkt_type == PACKET_HOST || skb->pkt_type == PACKET_HOST ||
in_dev->arp_parms->proxy_delay == 0) { NEIGH_VAR(in_dev->arp_parms, PROXY_DELAY) == 0) {
arp_send(ARPOP_REPLY, ETH_P_ARP, sip, arp_send(ARPOP_REPLY, ETH_P_ARP, sip,
dev, tip, sha, dev->dev_addr, dev, tip, sha, dev->dev_addr,
sha); sha);
...@@ -910,7 +912,8 @@ static int arp_process(struct sk_buff *skb) ...@@ -910,7 +912,8 @@ static int arp_process(struct sk_buff *skb)
agents are active. Taking the first reply prevents agents are active. Taking the first reply prevents
arp trashing and chooses the fastest router. arp trashing and chooses the fastest router.
*/ */
override = time_after(jiffies, n->updated + n->parms->locktime); override = time_after(jiffies, n->updated +
NEIGH_VAR(n->parms, LOCKTIME));
/* Broadcast replies and request packets /* Broadcast replies and request packets
do not assert neighbour reachability. do not assert neighbour reachability.
......
...@@ -1071,7 +1071,7 @@ static int ipv6_create_tempaddr(struct inet6_ifaddr *ifp, struct inet6_ifaddr *i ...@@ -1071,7 +1071,7 @@ static int ipv6_create_tempaddr(struct inet6_ifaddr *ifp, struct inet6_ifaddr *i
regen_advance = idev->cnf.regen_max_retry * regen_advance = idev->cnf.regen_max_retry *
idev->cnf.dad_transmits * idev->cnf.dad_transmits *
idev->nd_parms->retrans_time / HZ; NEIGH_VAR(idev->nd_parms, RETRANS_TIME) / HZ;
write_unlock_bh(&idev->lock); write_unlock_bh(&idev->lock);
/* A temporary address is created only if this calculated Preferred /* A temporary address is created only if this calculated Preferred
...@@ -1888,7 +1888,8 @@ static void ipv6_regen_rndid(unsigned long data) ...@@ -1888,7 +1888,8 @@ static void ipv6_regen_rndid(unsigned long data)
expires = jiffies + expires = jiffies +
idev->cnf.temp_prefered_lft * HZ - idev->cnf.temp_prefered_lft * HZ -
idev->cnf.regen_max_retry * idev->cnf.dad_transmits * idev->nd_parms->retrans_time - idev->cnf.regen_max_retry * idev->cnf.dad_transmits *
NEIGH_VAR(idev->nd_parms, RETRANS_TIME) -
idev->cnf.max_desync_factor * HZ; idev->cnf.max_desync_factor * HZ;
if (time_before(expires, jiffies)) { if (time_before(expires, jiffies)) {
pr_warn("%s: too short regeneration interval; timer disabled for %s\n", pr_warn("%s: too short regeneration interval; timer disabled for %s\n",
...@@ -3188,7 +3189,8 @@ static void addrconf_dad_timer(unsigned long data) ...@@ -3188,7 +3189,8 @@ static void addrconf_dad_timer(unsigned long data)
} }
ifp->dad_probes--; ifp->dad_probes--;
addrconf_mod_dad_timer(ifp, ifp->idev->nd_parms->retrans_time); addrconf_mod_dad_timer(ifp,
NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME));
spin_unlock(&ifp->lock); spin_unlock(&ifp->lock);
write_unlock(&idev->lock); write_unlock(&idev->lock);
...@@ -3509,7 +3511,7 @@ static void addrconf_verify(unsigned long foo) ...@@ -3509,7 +3511,7 @@ static void addrconf_verify(unsigned long foo)
!(ifp->flags&IFA_F_TENTATIVE)) { !(ifp->flags&IFA_F_TENTATIVE)) {
unsigned long regen_advance = ifp->idev->cnf.regen_max_retry * unsigned long regen_advance = ifp->idev->cnf.regen_max_retry *
ifp->idev->cnf.dad_transmits * ifp->idev->cnf.dad_transmits *
ifp->idev->nd_parms->retrans_time / HZ; NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME) / HZ;
if (age >= ifp->prefered_lft - regen_advance) { if (age >= ifp->prefered_lft - regen_advance) {
struct inet6_ifaddr *ifpub = ifp->ifpub; struct inet6_ifaddr *ifpub = ifp->ifpub;
...@@ -4231,7 +4233,7 @@ static int inet6_fill_ifla6_attrs(struct sk_buff *skb, struct inet6_dev *idev) ...@@ -4231,7 +4233,7 @@ static int inet6_fill_ifla6_attrs(struct sk_buff *skb, struct inet6_dev *idev)
ci.max_reasm_len = IPV6_MAXPLEN; ci.max_reasm_len = IPV6_MAXPLEN;
ci.tstamp = cstamp_delta(idev->tstamp); ci.tstamp = cstamp_delta(idev->tstamp);
ci.reachable_time = jiffies_to_msecs(idev->nd_parms->reachable_time); ci.reachable_time = jiffies_to_msecs(idev->nd_parms->reachable_time);
ci.retrans_time = jiffies_to_msecs(idev->nd_parms->retrans_time); ci.retrans_time = jiffies_to_msecs(NEIGH_VAR(idev->nd_parms, RETRANS_TIME));
if (nla_put(skb, IFLA_INET6_CACHEINFO, sizeof(ci), &ci)) if (nla_put(skb, IFLA_INET6_CACHEINFO, sizeof(ci), &ci))
goto nla_put_failure; goto nla_put_failure;
nla = nla_reserve(skb, IFLA_INET6_CONF, DEVCONF_MAX * sizeof(s32)); nla = nla_reserve(skb, IFLA_INET6_CONF, DEVCONF_MAX * sizeof(s32));
......
...@@ -125,17 +125,19 @@ struct neigh_table nd_tbl = { ...@@ -125,17 +125,19 @@ struct neigh_table nd_tbl = {
.id = "ndisc_cache", .id = "ndisc_cache",
.parms = { .parms = {
.tbl = &nd_tbl, .tbl = &nd_tbl,
.base_reachable_time = ND_REACHABLE_TIME,
.retrans_time = ND_RETRANS_TIMER,
.gc_staletime = 60 * HZ,
.reachable_time = ND_REACHABLE_TIME, .reachable_time = ND_REACHABLE_TIME,
.delay_probe_time = 5 * HZ, .data = {
.queue_len_bytes = 64*1024, [NEIGH_VAR_MCAST_PROBES] = 3,
.ucast_probes = 3, [NEIGH_VAR_UCAST_PROBES] = 3,
.mcast_probes = 3, [NEIGH_VAR_RETRANS_TIME] = ND_RETRANS_TIMER,
.anycast_delay = 1 * HZ, [NEIGH_VAR_BASE_REACHABLE_TIME] = ND_REACHABLE_TIME,
.proxy_delay = (8 * HZ) / 10, [NEIGH_VAR_DELAY_PROBE_TIME] = 5 * HZ,
.proxy_qlen = 64, [NEIGH_VAR_GC_STALETIME] = 60 * HZ,
[NEIGH_VAR_QUEUE_LEN_BYTES] = 64 * 1024,
[NEIGH_VAR_PROXY_QLEN] = 64,
[NEIGH_VAR_ANYCAST_DELAY] = 1 * HZ,
[NEIGH_VAR_PROXY_DELAY] = (8 * HZ) / 10,
},
}, },
.gc_interval = 30 * HZ, .gc_interval = 30 * HZ,
.gc_thresh1 = 128, .gc_thresh1 = 128,
...@@ -656,14 +658,14 @@ static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb) ...@@ -656,14 +658,14 @@ static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb)
if (skb && ipv6_chk_addr(dev_net(dev), &ipv6_hdr(skb)->saddr, dev, 1)) if (skb && ipv6_chk_addr(dev_net(dev), &ipv6_hdr(skb)->saddr, dev, 1))
saddr = &ipv6_hdr(skb)->saddr; saddr = &ipv6_hdr(skb)->saddr;
if ((probes -= neigh->parms->ucast_probes) < 0) { if ((probes -= NEIGH_VAR(neigh->parms, UCAST_PROBES)) < 0) {
if (!(neigh->nud_state & NUD_VALID)) { if (!(neigh->nud_state & NUD_VALID)) {
ND_PRINTK(1, dbg, ND_PRINTK(1, dbg,
"%s: trying to ucast probe in NUD_INVALID: %pI6\n", "%s: trying to ucast probe in NUD_INVALID: %pI6\n",
__func__, target); __func__, target);
} }
ndisc_send_ns(dev, neigh, target, target, saddr); ndisc_send_ns(dev, neigh, target, target, saddr);
} else if ((probes -= neigh->parms->app_probes) < 0) { } else if ((probes -= NEIGH_VAR(neigh->parms, APP_PROBES)) < 0) {
neigh_app_ns(neigh); neigh_app_ns(neigh);
} else { } else {
addrconf_addr_solict_mult(target, &mcaddr); addrconf_addr_solict_mult(target, &mcaddr);
...@@ -790,7 +792,7 @@ static void ndisc_recv_ns(struct sk_buff *skb) ...@@ -790,7 +792,7 @@ static void ndisc_recv_ns(struct sk_buff *skb)
if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) && if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) &&
skb->pkt_type != PACKET_HOST && skb->pkt_type != PACKET_HOST &&
inc && inc &&
idev->nd_parms->proxy_delay != 0) { NEIGH_VAR(idev->nd_parms, PROXY_DELAY) != 0) {
/* /*
* for anycast or proxy, * for anycast or proxy,
* sender should delay its response * sender should delay its response
...@@ -1210,7 +1212,7 @@ static void ndisc_router_discovery(struct sk_buff *skb) ...@@ -1210,7 +1212,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)
rtime = (rtime*HZ)/1000; rtime = (rtime*HZ)/1000;
if (rtime < HZ/10) if (rtime < HZ/10)
rtime = HZ/10; rtime = HZ/10;
in6_dev->nd_parms->retrans_time = rtime; NEIGH_VAR_SET(in6_dev->nd_parms, RETRANS_TIME, rtime);
in6_dev->tstamp = jiffies; in6_dev->tstamp = jiffies;
inet6_ifinfo_notify(RTM_NEWLINK, in6_dev); inet6_ifinfo_notify(RTM_NEWLINK, in6_dev);
} }
...@@ -1222,9 +1224,11 @@ static void ndisc_router_discovery(struct sk_buff *skb) ...@@ -1222,9 +1224,11 @@ static void ndisc_router_discovery(struct sk_buff *skb)
if (rtime < HZ/10) if (rtime < HZ/10)
rtime = HZ/10; rtime = HZ/10;
if (rtime != in6_dev->nd_parms->base_reachable_time) { if (rtime != NEIGH_VAR(in6_dev->nd_parms, BASE_REACHABLE_TIME)) {
in6_dev->nd_parms->base_reachable_time = rtime; NEIGH_VAR_SET(in6_dev->nd_parms,
in6_dev->nd_parms->gc_staletime = 3 * rtime; BASE_REACHABLE_TIME, rtime);
NEIGH_VAR_SET(in6_dev->nd_parms,
GC_STALETIME, 3 * rtime);
in6_dev->nd_parms->reachable_time = neigh_rand_reach_time(rtime); in6_dev->nd_parms->reachable_time = neigh_rand_reach_time(rtime);
in6_dev->tstamp = jiffies; in6_dev->tstamp = jiffies;
inet6_ifinfo_notify(RTM_NEWLINK, in6_dev); inet6_ifinfo_notify(RTM_NEWLINK, in6_dev);
...@@ -1665,8 +1669,9 @@ int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl, int write, void __user *bu ...@@ -1665,8 +1669,9 @@ int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl, int write, void __user *bu
ret = -1; ret = -1;
if (write && ret == 0 && dev && (idev = in6_dev_get(dev)) != NULL) { if (write && ret == 0 && dev && (idev = in6_dev_get(dev)) != NULL) {
if (ctl->data == &idev->nd_parms->base_reachable_time) if (ctl->data == &NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME))
idev->nd_parms->reachable_time = neigh_rand_reach_time(idev->nd_parms->base_reachable_time); idev->nd_parms->reachable_time =
neigh_rand_reach_time(NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME));
idev->tstamp = jiffies; idev->tstamp = jiffies;
inet6_ifinfo_notify(RTM_NEWLINK, idev); inet6_ifinfo_notify(RTM_NEWLINK, idev);
in6_dev_put(idev); in6_dev_put(idev);
......
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