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
This commit is contained in:
commit
d230ec72c4
|
@ -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)
|
||||||
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)
|
||||||
};
|
};
|
||||||
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,
|
||||||
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,
|
||||||
{
|
{
|
||||||
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)
|
||||||
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 -EOPNOTSUPP;
|
||||||
|
#endif
|
||||||
|
if (reg->hooknum != NF_NETDEV_INGRESS ||
|
||||||
|
!reg->dev || dev_net(reg->dev) != net)
|
||||||
return -EINVAL;
|
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)
|
||||||
|
|
||||||
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,
|
||||||
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)
|
||||||
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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,
|
||||||
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,
|
||||||
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)
|
||||||
/* 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue