Commit d230ec72 authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net

Pull networking fixups from David Miller:
 "Here are the build and merge fixups for the networking stuff"

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net:
  phy: micrel.c: Enable ksz9031 energy-detect power-down mode
  netfilter: merge fixup for "nf_tables_netdev: remove redundant ip_hdr assignment"
  netfilter: nft_limit: fix divided by zero panic
  netfilter: fix namespace handling in nf_log_proc_dostring
  netfilter: xt_hashlimit: Fix link error in 32bit arch because of 64bit division
  netfilter: accommodate different kconfig in nf_set_hooks_head
  netfilter: Fix potential null pointer dereference
parents f84d9fa8 af70c1f9
...@@ -439,6 +439,10 @@ static int ksz9021_config_init(struct phy_device *phydev) ...@@ -439,6 +439,10 @@ static int ksz9021_config_init(struct phy_device *phydev)
#define MII_KSZ9031RN_TX_DATA_PAD_SKEW 6 #define MII_KSZ9031RN_TX_DATA_PAD_SKEW 6
#define MII_KSZ9031RN_CLK_PAD_SKEW 8 #define MII_KSZ9031RN_CLK_PAD_SKEW 8
/* MMD Address 0x1C */
#define MII_KSZ9031RN_EDPD 0x23
#define MII_KSZ9031RN_EDPD_ENABLE BIT(0)
static int ksz9031_extended_write(struct phy_device *phydev, static int ksz9031_extended_write(struct phy_device *phydev,
u8 mode, u32 dev_addr, u32 regnum, u16 val) u8 mode, u32 dev_addr, u32 regnum, u16 val)
{ {
...@@ -510,6 +514,18 @@ static int ksz9031_center_flp_timing(struct phy_device *phydev) ...@@ -510,6 +514,18 @@ static int ksz9031_center_flp_timing(struct phy_device *phydev)
return genphy_restart_aneg(phydev); return genphy_restart_aneg(phydev);
} }
/* Enable energy-detect power-down mode */
static int ksz9031_enable_edpd(struct phy_device *phydev)
{
int reg;
reg = ksz9031_extended_read(phydev, OP_DATA, 0x1C, MII_KSZ9031RN_EDPD);
if (reg < 0)
return reg;
return ksz9031_extended_write(phydev, OP_DATA, 0x1C, MII_KSZ9031RN_EDPD,
reg | MII_KSZ9031RN_EDPD_ENABLE);
}
static int ksz9031_config_init(struct phy_device *phydev) static int ksz9031_config_init(struct phy_device *phydev)
{ {
const struct device *dev = &phydev->mdio.dev; const struct device *dev = &phydev->mdio.dev;
...@@ -525,6 +541,11 @@ static int ksz9031_config_init(struct phy_device *phydev) ...@@ -525,6 +541,11 @@ static int ksz9031_config_init(struct phy_device *phydev)
}; };
static const char *control_skews[2] = {"txen-skew-ps", "rxdv-skew-ps"}; static const char *control_skews[2] = {"txen-skew-ps", "rxdv-skew-ps"};
const struct device *dev_walker; const struct device *dev_walker;
int result;
result = ksz9031_enable_edpd(phydev);
if (result < 0)
return result;
/* The Micrel driver has a deprecated option to place phy OF /* The Micrel driver has a deprecated option to place phy OF
* properties in the MAC node. Walk up the tree of devices to * properties in the MAC node. Walk up the tree of devices to
......
...@@ -33,7 +33,6 @@ __nft_set_pktinfo_ipv4_validate(struct nft_pktinfo *pkt, ...@@ -33,7 +33,6 @@ __nft_set_pktinfo_ipv4_validate(struct nft_pktinfo *pkt,
if (!iph) if (!iph)
return -1; return -1;
iph = ip_hdr(skb);
if (iph->ihl < 5 || iph->version != 4) if (iph->ihl < 5 || iph->version != 4)
return -1; return -1;
......
...@@ -90,10 +90,12 @@ static void nf_set_hooks_head(struct net *net, const struct nf_hook_ops *reg, ...@@ -90,10 +90,12 @@ static void nf_set_hooks_head(struct net *net, const struct nf_hook_ops *reg,
{ {
switch (reg->pf) { switch (reg->pf) {
case NFPROTO_NETDEV: case NFPROTO_NETDEV:
#ifdef CONFIG_NETFILTER_INGRESS
/* We already checked in nf_register_net_hook() that this is /* We already checked in nf_register_net_hook() that this is
* used from ingress. * used from ingress.
*/ */
rcu_assign_pointer(reg->dev->nf_hooks_ingress, entry); rcu_assign_pointer(reg->dev->nf_hooks_ingress, entry);
#endif
break; break;
default: default:
rcu_assign_pointer(net->nf.hooks[reg->pf][reg->hooknum], rcu_assign_pointer(net->nf.hooks[reg->pf][reg->hooknum],
...@@ -107,10 +109,15 @@ int nf_register_net_hook(struct net *net, const struct nf_hook_ops *reg) ...@@ -107,10 +109,15 @@ int nf_register_net_hook(struct net *net, const struct nf_hook_ops *reg)
struct nf_hook_entry *hooks_entry; struct nf_hook_entry *hooks_entry;
struct nf_hook_entry *entry; struct nf_hook_entry *entry;
if (reg->pf == NFPROTO_NETDEV && if (reg->pf == NFPROTO_NETDEV) {
(reg->hooknum != NF_NETDEV_INGRESS || #ifndef CONFIG_NETFILTER_INGRESS
!reg->dev || dev_net(reg->dev) != net)) if (reg->hooknum == NF_NETDEV_INGRESS)
return -EINVAL; return -EOPNOTSUPP;
#endif
if (reg->hooknum != NF_NETDEV_INGRESS ||
!reg->dev || dev_net(reg->dev) != net)
return -EINVAL;
}
entry = kmalloc(sizeof(*entry), GFP_KERNEL); entry = kmalloc(sizeof(*entry), GFP_KERNEL);
if (!entry) if (!entry)
...@@ -160,7 +167,7 @@ void nf_unregister_net_hook(struct net *net, const struct nf_hook_ops *reg) ...@@ -160,7 +167,7 @@ void nf_unregister_net_hook(struct net *net, const struct nf_hook_ops *reg)
mutex_lock(&nf_hook_mutex); mutex_lock(&nf_hook_mutex);
hooks_entry = nf_hook_entry_head(net, reg); hooks_entry = nf_hook_entry_head(net, reg);
if (hooks_entry->orig_ops == reg) { if (hooks_entry && hooks_entry->orig_ops == reg) {
nf_set_hooks_head(net, reg, nf_set_hooks_head(net, reg,
nf_entry_dereference(hooks_entry->next)); nf_entry_dereference(hooks_entry->next));
goto unlock; goto unlock;
......
...@@ -422,7 +422,7 @@ static int nf_log_proc_dostring(struct ctl_table *table, int write, ...@@ -422,7 +422,7 @@ static int nf_log_proc_dostring(struct ctl_table *table, int write,
char buf[NFLOGGER_NAME_LEN]; char buf[NFLOGGER_NAME_LEN];
int r = 0; int r = 0;
int tindex = (unsigned long)table->extra1; int tindex = (unsigned long)table->extra1;
struct net *net = current->nsproxy->net_ns; struct net *net = table->extra2;
if (write) { if (write) {
struct ctl_table tmp = *table; struct ctl_table tmp = *table;
...@@ -476,7 +476,6 @@ static int netfilter_log_sysctl_init(struct net *net) ...@@ -476,7 +476,6 @@ static int netfilter_log_sysctl_init(struct net *net)
3, "%d", i); 3, "%d", i);
nf_log_sysctl_table[i].procname = nf_log_sysctl_table[i].procname =
nf_log_sysctl_fnames[i]; nf_log_sysctl_fnames[i];
nf_log_sysctl_table[i].data = NULL;
nf_log_sysctl_table[i].maxlen = NFLOGGER_NAME_LEN; nf_log_sysctl_table[i].maxlen = NFLOGGER_NAME_LEN;
nf_log_sysctl_table[i].mode = 0644; nf_log_sysctl_table[i].mode = 0644;
nf_log_sysctl_table[i].proc_handler = nf_log_sysctl_table[i].proc_handler =
...@@ -486,6 +485,9 @@ static int netfilter_log_sysctl_init(struct net *net) ...@@ -486,6 +485,9 @@ static int netfilter_log_sysctl_init(struct net *net)
} }
} }
for (i = NFPROTO_UNSPEC; i < NFPROTO_NUMPROTO; i++)
table[i].extra2 = net;
net->nf.nf_log_dir_header = register_net_sysctl(net, net->nf.nf_log_dir_header = register_net_sysctl(net,
"net/netfilter/nf_log", "net/netfilter/nf_log",
table); table);
......
...@@ -145,7 +145,7 @@ static int nft_limit_pkts_init(const struct nft_ctx *ctx, ...@@ -145,7 +145,7 @@ static int nft_limit_pkts_init(const struct nft_ctx *ctx,
if (err < 0) if (err < 0)
return err; return err;
priv->cost = div_u64(priv->limit.nsecs, priv->limit.rate); priv->cost = div64_u64(priv->limit.nsecs, priv->limit.rate);
return 0; return 0;
} }
...@@ -170,7 +170,7 @@ static void nft_limit_pkt_bytes_eval(const struct nft_expr *expr, ...@@ -170,7 +170,7 @@ static void nft_limit_pkt_bytes_eval(const struct nft_expr *expr,
const struct nft_pktinfo *pkt) const struct nft_pktinfo *pkt)
{ {
struct nft_limit *priv = nft_expr_priv(expr); struct nft_limit *priv = nft_expr_priv(expr);
u64 cost = div_u64(priv->nsecs * pkt->skb->len, priv->rate); u64 cost = div64_u64(priv->nsecs * pkt->skb->len, priv->rate);
if (nft_limit_eval(priv, cost)) if (nft_limit_eval(priv, cost))
regs->verdict.code = NFT_BREAK; regs->verdict.code = NFT_BREAK;
......
...@@ -467,17 +467,18 @@ static u64 user2credits(u64 user, int revision) ...@@ -467,17 +467,18 @@ static u64 user2credits(u64 user, int revision)
/* If multiplying would overflow... */ /* If multiplying would overflow... */
if (user > 0xFFFFFFFF / (HZ*CREDITS_PER_JIFFY_v1)) if (user > 0xFFFFFFFF / (HZ*CREDITS_PER_JIFFY_v1))
/* Divide first. */ /* Divide first. */
return (user / XT_HASHLIMIT_SCALE) *\ return div64_u64(user, XT_HASHLIMIT_SCALE)
HZ * CREDITS_PER_JIFFY_v1; * HZ * CREDITS_PER_JIFFY_v1;
return (user * HZ * CREDITS_PER_JIFFY_v1) \ return div64_u64(user * HZ * CREDITS_PER_JIFFY_v1,
/ XT_HASHLIMIT_SCALE; XT_HASHLIMIT_SCALE);
} else { } else {
if (user > 0xFFFFFFFFFFFFFFFF / (HZ*CREDITS_PER_JIFFY)) if (user > 0xFFFFFFFFFFFFFFFF / (HZ*CREDITS_PER_JIFFY))
return (user / XT_HASHLIMIT_SCALE_v2) *\ return div64_u64(user, XT_HASHLIMIT_SCALE_v2)
HZ * CREDITS_PER_JIFFY; * HZ * CREDITS_PER_JIFFY;
return (user * HZ * CREDITS_PER_JIFFY) / XT_HASHLIMIT_SCALE_v2; return div64_u64(user * HZ * CREDITS_PER_JIFFY,
XT_HASHLIMIT_SCALE_v2);
} }
} }
......
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