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

Merge in late fixes to prepare for the 6.9 net-next PR.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Jakub Kicinski 2024-03-11 20:37:53 -07:00
commit ed1f164038
14 changed files with 86 additions and 82 deletions

View File

@ -290,7 +290,7 @@ attribute-sets:
enum: eswitch-mode enum: eswitch-mode
- -
name: eswitch-inline-mode name: eswitch-inline-mode
type: u16 type: u8
enum: eswitch-inline-mode enum: eswitch-inline-mode
- -
name: dpipe-tables name: dpipe-tables

View File

@ -131,9 +131,9 @@ static int dpll_xa_ref_pin_del(struct xarray *xa_pins, struct dpll_pin *pin,
reg = dpll_pin_registration_find(ref, ops, priv); reg = dpll_pin_registration_find(ref, ops, priv);
if (WARN_ON(!reg)) if (WARN_ON(!reg))
return -EINVAL; return -EINVAL;
list_del(&reg->list);
kfree(reg);
if (refcount_dec_and_test(&ref->refcount)) { if (refcount_dec_and_test(&ref->refcount)) {
list_del(&reg->list);
kfree(reg);
xa_erase(xa_pins, i); xa_erase(xa_pins, i);
WARN_ON(!list_empty(&ref->registration_list)); WARN_ON(!list_empty(&ref->registration_list));
kfree(ref); kfree(ref);
@ -211,9 +211,9 @@ dpll_xa_ref_dpll_del(struct xarray *xa_dplls, struct dpll_device *dpll,
reg = dpll_pin_registration_find(ref, ops, priv); reg = dpll_pin_registration_find(ref, ops, priv);
if (WARN_ON(!reg)) if (WARN_ON(!reg))
return; return;
list_del(&reg->list);
kfree(reg);
if (refcount_dec_and_test(&ref->refcount)) { if (refcount_dec_and_test(&ref->refcount)) {
list_del(&reg->list);
kfree(reg);
xa_erase(xa_dplls, i); xa_erase(xa_dplls, i);
WARN_ON(!list_empty(&ref->registration_list)); WARN_ON(!list_empty(&ref->registration_list));
kfree(ref); kfree(ref);

View File

@ -2259,6 +2259,8 @@ static int ksz_pirq_setup(struct ksz_device *dev, u8 p)
return ksz_irq_common_setup(dev, pirq); return ksz_irq_common_setup(dev, pirq);
} }
static int ksz_parse_drive_strength(struct ksz_device *dev);
static int ksz_setup(struct dsa_switch *ds) static int ksz_setup(struct dsa_switch *ds)
{ {
struct ksz_device *dev = ds->priv; struct ksz_device *dev = ds->priv;
@ -2280,6 +2282,10 @@ static int ksz_setup(struct dsa_switch *ds)
return ret; return ret;
} }
ret = ksz_parse_drive_strength(dev);
if (ret)
return ret;
/* set broadcast storm protection 10% rate */ /* set broadcast storm protection 10% rate */
regmap_update_bits(ksz_regmap_16(dev), regs[S_BROADCAST_CTRL], regmap_update_bits(ksz_regmap_16(dev), regs[S_BROADCAST_CTRL],
BROADCAST_STORM_RATE, BROADCAST_STORM_RATE,
@ -4328,10 +4334,6 @@ int ksz_switch_register(struct ksz_device *dev)
for (port_num = 0; port_num < dev->info->port_cnt; ++port_num) for (port_num = 0; port_num < dev->info->port_cnt; ++port_num)
dev->ports[port_num].interface = PHY_INTERFACE_MODE_NA; dev->ports[port_num].interface = PHY_INTERFACE_MODE_NA;
if (dev->dev->of_node) { if (dev->dev->of_node) {
ret = ksz_parse_drive_strength(dev);
if (ret)
return ret;
ret = of_get_phy_mode(dev->dev->of_node, &interface); ret = of_get_phy_mode(dev->dev->of_node, &interface);
if (ret == 0) if (ret == 0)
dev->compat_interface = interface; dev->compat_interface = interface;

View File

@ -6678,6 +6678,7 @@ static void ice_update_vsi_ring_stats(struct ice_vsi *vsi)
{ {
struct rtnl_link_stats64 *net_stats, *stats_prev; struct rtnl_link_stats64 *net_stats, *stats_prev;
struct rtnl_link_stats64 *vsi_stats; struct rtnl_link_stats64 *vsi_stats;
struct ice_pf *pf = vsi->back;
u64 pkts, bytes; u64 pkts, bytes;
int i; int i;
@ -6723,21 +6724,18 @@ static void ice_update_vsi_ring_stats(struct ice_vsi *vsi)
net_stats = &vsi->net_stats; net_stats = &vsi->net_stats;
stats_prev = &vsi->net_stats_prev; stats_prev = &vsi->net_stats_prev;
/* clear prev counters after reset */ /* Update netdev counters, but keep in mind that values could start at
if (vsi_stats->tx_packets < stats_prev->tx_packets || * random value after PF reset. And as we increase the reported stat by
vsi_stats->rx_packets < stats_prev->rx_packets) { * diff of Prev-Cur, we need to be sure that Prev is valid. If it's not,
stats_prev->tx_packets = 0; * let's skip this round.
stats_prev->tx_bytes = 0; */
stats_prev->rx_packets = 0; if (likely(pf->stat_prev_loaded)) {
stats_prev->rx_bytes = 0; net_stats->tx_packets += vsi_stats->tx_packets - stats_prev->tx_packets;
net_stats->tx_bytes += vsi_stats->tx_bytes - stats_prev->tx_bytes;
net_stats->rx_packets += vsi_stats->rx_packets - stats_prev->rx_packets;
net_stats->rx_bytes += vsi_stats->rx_bytes - stats_prev->rx_bytes;
} }
/* update netdev counters */
net_stats->tx_packets += vsi_stats->tx_packets - stats_prev->tx_packets;
net_stats->tx_bytes += vsi_stats->tx_bytes - stats_prev->tx_bytes;
net_stats->rx_packets += vsi_stats->rx_packets - stats_prev->rx_packets;
net_stats->rx_bytes += vsi_stats->rx_bytes - stats_prev->rx_bytes;
stats_prev->tx_packets = vsi_stats->tx_packets; stats_prev->tx_packets = vsi_stats->tx_packets;
stats_prev->tx_bytes = vsi_stats->tx_bytes; stats_prev->tx_bytes = vsi_stats->tx_bytes;
stats_prev->rx_packets = vsi_stats->rx_packets; stats_prev->rx_packets = vsi_stats->rx_packets;

View File

@ -6985,44 +6985,31 @@ static void igb_extts(struct igb_adapter *adapter, int tsintr_tt)
static void igb_tsync_interrupt(struct igb_adapter *adapter) static void igb_tsync_interrupt(struct igb_adapter *adapter)
{ {
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
u32 ack = 0, tsicr = rd32(E1000_TSICR); u32 tsicr = rd32(E1000_TSICR);
struct ptp_clock_event event; struct ptp_clock_event event;
if (tsicr & TSINTR_SYS_WRAP) { if (tsicr & TSINTR_SYS_WRAP) {
event.type = PTP_CLOCK_PPS; event.type = PTP_CLOCK_PPS;
if (adapter->ptp_caps.pps) if (adapter->ptp_caps.pps)
ptp_clock_event(adapter->ptp_clock, &event); ptp_clock_event(adapter->ptp_clock, &event);
ack |= TSINTR_SYS_WRAP;
} }
if (tsicr & E1000_TSICR_TXTS) { if (tsicr & E1000_TSICR_TXTS) {
/* retrieve hardware timestamp */ /* retrieve hardware timestamp */
schedule_work(&adapter->ptp_tx_work); schedule_work(&adapter->ptp_tx_work);
ack |= E1000_TSICR_TXTS;
} }
if (tsicr & TSINTR_TT0) { if (tsicr & TSINTR_TT0)
igb_perout(adapter, 0); igb_perout(adapter, 0);
ack |= TSINTR_TT0;
}
if (tsicr & TSINTR_TT1) { if (tsicr & TSINTR_TT1)
igb_perout(adapter, 1); igb_perout(adapter, 1);
ack |= TSINTR_TT1;
}
if (tsicr & TSINTR_AUTT0) { if (tsicr & TSINTR_AUTT0)
igb_extts(adapter, 0); igb_extts(adapter, 0);
ack |= TSINTR_AUTT0;
}
if (tsicr & TSINTR_AUTT1) { if (tsicr & TSINTR_AUTT1)
igb_extts(adapter, 1); igb_extts(adapter, 1);
ack |= TSINTR_AUTT1;
}
/* acknowledge the interrupts */
wr32(E1000_TSICR, ack);
} }
static irqreturn_t igb_msix_other(int irq, void *data) static irqreturn_t igb_msix_other(int irq, void *data)

View File

@ -5303,25 +5303,22 @@ igc_features_check(struct sk_buff *skb, struct net_device *dev,
static void igc_tsync_interrupt(struct igc_adapter *adapter) static void igc_tsync_interrupt(struct igc_adapter *adapter)
{ {
u32 ack, tsauxc, sec, nsec, tsicr;
struct igc_hw *hw = &adapter->hw; struct igc_hw *hw = &adapter->hw;
u32 tsauxc, sec, nsec, tsicr;
struct ptp_clock_event event; struct ptp_clock_event event;
struct timespec64 ts; struct timespec64 ts;
tsicr = rd32(IGC_TSICR); tsicr = rd32(IGC_TSICR);
ack = 0;
if (tsicr & IGC_TSICR_SYS_WRAP) { if (tsicr & IGC_TSICR_SYS_WRAP) {
event.type = PTP_CLOCK_PPS; event.type = PTP_CLOCK_PPS;
if (adapter->ptp_caps.pps) if (adapter->ptp_caps.pps)
ptp_clock_event(adapter->ptp_clock, &event); ptp_clock_event(adapter->ptp_clock, &event);
ack |= IGC_TSICR_SYS_WRAP;
} }
if (tsicr & IGC_TSICR_TXTS) { if (tsicr & IGC_TSICR_TXTS) {
/* retrieve hardware timestamp */ /* retrieve hardware timestamp */
igc_ptp_tx_tstamp_event(adapter); igc_ptp_tx_tstamp_event(adapter);
ack |= IGC_TSICR_TXTS;
} }
if (tsicr & IGC_TSICR_TT0) { if (tsicr & IGC_TSICR_TT0) {
@ -5335,7 +5332,6 @@ static void igc_tsync_interrupt(struct igc_adapter *adapter)
wr32(IGC_TSAUXC, tsauxc); wr32(IGC_TSAUXC, tsauxc);
adapter->perout[0].start = ts; adapter->perout[0].start = ts;
spin_unlock(&adapter->tmreg_lock); spin_unlock(&adapter->tmreg_lock);
ack |= IGC_TSICR_TT0;
} }
if (tsicr & IGC_TSICR_TT1) { if (tsicr & IGC_TSICR_TT1) {
@ -5349,7 +5345,6 @@ static void igc_tsync_interrupt(struct igc_adapter *adapter)
wr32(IGC_TSAUXC, tsauxc); wr32(IGC_TSAUXC, tsauxc);
adapter->perout[1].start = ts; adapter->perout[1].start = ts;
spin_unlock(&adapter->tmreg_lock); spin_unlock(&adapter->tmreg_lock);
ack |= IGC_TSICR_TT1;
} }
if (tsicr & IGC_TSICR_AUTT0) { if (tsicr & IGC_TSICR_AUTT0) {
@ -5359,7 +5354,6 @@ static void igc_tsync_interrupt(struct igc_adapter *adapter)
event.index = 0; event.index = 0;
event.timestamp = sec * NSEC_PER_SEC + nsec; event.timestamp = sec * NSEC_PER_SEC + nsec;
ptp_clock_event(adapter->ptp_clock, &event); ptp_clock_event(adapter->ptp_clock, &event);
ack |= IGC_TSICR_AUTT0;
} }
if (tsicr & IGC_TSICR_AUTT1) { if (tsicr & IGC_TSICR_AUTT1) {
@ -5369,11 +5363,7 @@ static void igc_tsync_interrupt(struct igc_adapter *adapter)
event.index = 1; event.index = 1;
event.timestamp = sec * NSEC_PER_SEC + nsec; event.timestamp = sec * NSEC_PER_SEC + nsec;
ptp_clock_event(adapter->ptp_clock, &event); ptp_clock_event(adapter->ptp_clock, &event);
ack |= IGC_TSICR_AUTT1;
} }
/* acknowledge the interrupts */
wr32(IGC_TSICR, ack);
} }
/** /**

View File

@ -1235,8 +1235,8 @@ static int rvu_af_dl_dwrr_mtu_get(struct devlink *devlink, u32 id,
enum rvu_af_dl_param_id { enum rvu_af_dl_param_id {
RVU_AF_DEVLINK_PARAM_ID_BASE = DEVLINK_PARAM_GENERIC_ID_MAX, RVU_AF_DEVLINK_PARAM_ID_BASE = DEVLINK_PARAM_GENERIC_ID_MAX,
RVU_AF_DEVLINK_PARAM_ID_DWRR_MTU, RVU_AF_DEVLINK_PARAM_ID_DWRR_MTU,
RVU_AF_DEVLINK_PARAM_ID_NPC_EXACT_FEATURE_DISABLE,
RVU_AF_DEVLINK_PARAM_ID_NPC_MCAM_ZONE_PERCENT, RVU_AF_DEVLINK_PARAM_ID_NPC_MCAM_ZONE_PERCENT,
RVU_AF_DEVLINK_PARAM_ID_NPC_EXACT_FEATURE_DISABLE,
RVU_AF_DEVLINK_PARAM_ID_NIX_MAXLF, RVU_AF_DEVLINK_PARAM_ID_NIX_MAXLF,
}; };
@ -1434,15 +1434,6 @@ static const struct devlink_param rvu_af_dl_params[] = {
BIT(DEVLINK_PARAM_CMODE_RUNTIME), BIT(DEVLINK_PARAM_CMODE_RUNTIME),
rvu_af_dl_dwrr_mtu_get, rvu_af_dl_dwrr_mtu_set, rvu_af_dl_dwrr_mtu_get, rvu_af_dl_dwrr_mtu_set,
rvu_af_dl_dwrr_mtu_validate), rvu_af_dl_dwrr_mtu_validate),
};
static const struct devlink_param rvu_af_dl_param_exact_match[] = {
DEVLINK_PARAM_DRIVER(RVU_AF_DEVLINK_PARAM_ID_NPC_EXACT_FEATURE_DISABLE,
"npc_exact_feature_disable", DEVLINK_PARAM_TYPE_STRING,
BIT(DEVLINK_PARAM_CMODE_RUNTIME),
rvu_af_npc_exact_feature_get,
rvu_af_npc_exact_feature_disable,
rvu_af_npc_exact_feature_validate),
DEVLINK_PARAM_DRIVER(RVU_AF_DEVLINK_PARAM_ID_NPC_MCAM_ZONE_PERCENT, DEVLINK_PARAM_DRIVER(RVU_AF_DEVLINK_PARAM_ID_NPC_MCAM_ZONE_PERCENT,
"npc_mcam_high_zone_percent", DEVLINK_PARAM_TYPE_U8, "npc_mcam_high_zone_percent", DEVLINK_PARAM_TYPE_U8,
BIT(DEVLINK_PARAM_CMODE_RUNTIME), BIT(DEVLINK_PARAM_CMODE_RUNTIME),
@ -1457,6 +1448,15 @@ static const struct devlink_param rvu_af_dl_param_exact_match[] = {
rvu_af_dl_nix_maxlf_validate), rvu_af_dl_nix_maxlf_validate),
}; };
static const struct devlink_param rvu_af_dl_param_exact_match[] = {
DEVLINK_PARAM_DRIVER(RVU_AF_DEVLINK_PARAM_ID_NPC_EXACT_FEATURE_DISABLE,
"npc_exact_feature_disable", DEVLINK_PARAM_TYPE_STRING,
BIT(DEVLINK_PARAM_CMODE_RUNTIME),
rvu_af_npc_exact_feature_get,
rvu_af_npc_exact_feature_disable,
rvu_af_npc_exact_feature_validate),
};
/* Devlink switch mode */ /* Devlink switch mode */
static int rvu_devlink_eswitch_mode_get(struct devlink *devlink, u16 *mode) static int rvu_devlink_eswitch_mode_get(struct devlink *devlink, u16 *mode)
{ {

View File

@ -337,6 +337,11 @@ static void nfp_fl_lag_do_work(struct work_struct *work)
acti_netdevs = kmalloc_array(entry->slave_cnt, acti_netdevs = kmalloc_array(entry->slave_cnt,
sizeof(*acti_netdevs), GFP_KERNEL); sizeof(*acti_netdevs), GFP_KERNEL);
if (!acti_netdevs) {
schedule_delayed_work(&lag->work,
NFP_FL_LAG_DELAY);
continue;
}
/* Include sanity check in the loop. It may be that a bond has /* Include sanity check in the loop. It may be that a bond has
* changed between processing the last notification and the * changed between processing the last notification and the

View File

@ -402,7 +402,7 @@ static int dp83822_config_init(struct phy_device *phydev)
{ {
struct dp83822_private *dp83822 = phydev->priv; struct dp83822_private *dp83822 = phydev->priv;
struct device *dev = &phydev->mdio.dev; struct device *dev = &phydev->mdio.dev;
int rgmii_delay; int rgmii_delay = 0;
s32 rx_int_delay; s32 rx_int_delay;
s32 tx_int_delay; s32 tx_int_delay;
int err = 0; int err = 0;
@ -412,30 +412,33 @@ static int dp83822_config_init(struct phy_device *phydev)
rx_int_delay = phy_get_internal_delay(phydev, dev, NULL, 0, rx_int_delay = phy_get_internal_delay(phydev, dev, NULL, 0,
true); true);
if (rx_int_delay <= 0) /* Set DP83822_RX_CLK_SHIFT to enable rx clk internal delay */
rgmii_delay = 0; if (rx_int_delay > 0)
else rgmii_delay |= DP83822_RX_CLK_SHIFT;
rgmii_delay = DP83822_RX_CLK_SHIFT;
tx_int_delay = phy_get_internal_delay(phydev, dev, NULL, 0, tx_int_delay = phy_get_internal_delay(phydev, dev, NULL, 0,
false); false);
/* Set DP83822_TX_CLK_SHIFT to disable tx clk internal delay */
if (tx_int_delay <= 0) if (tx_int_delay <= 0)
rgmii_delay &= ~DP83822_TX_CLK_SHIFT;
else
rgmii_delay |= DP83822_TX_CLK_SHIFT; rgmii_delay |= DP83822_TX_CLK_SHIFT;
if (rgmii_delay) { err = phy_modify_mmd(phydev, DP83822_DEVADDR, MII_DP83822_RCSR,
err = phy_set_bits_mmd(phydev, DP83822_DEVADDR, DP83822_RX_CLK_SHIFT | DP83822_TX_CLK_SHIFT, rgmii_delay);
MII_DP83822_RCSR, rgmii_delay); if (err)
if (err) return err;
return err;
}
phy_set_bits_mmd(phydev, DP83822_DEVADDR, err = phy_set_bits_mmd(phydev, DP83822_DEVADDR,
MII_DP83822_RCSR, DP83822_RGMII_MODE_EN); MII_DP83822_RCSR, DP83822_RGMII_MODE_EN);
if (err)
return err;
} else { } else {
phy_clear_bits_mmd(phydev, DP83822_DEVADDR, err = phy_clear_bits_mmd(phydev, DP83822_DEVADDR,
MII_DP83822_RCSR, DP83822_RGMII_MODE_EN); MII_DP83822_RCSR, DP83822_RGMII_MODE_EN);
if (err)
return err;
} }
if (dp83822->fx_enabled) { if (dp83822->fx_enabled) {

View File

@ -3128,7 +3128,7 @@ s32 phy_get_internal_delay(struct phy_device *phydev, struct device *dev,
if (delay < 0) if (delay < 0)
return delay; return delay;
if (delay && size == 0) if (size == 0)
return delay; return delay;
if (delay < delay_values[0] || delay > delay_values[size - 1]) { if (delay < delay_values[0] || delay > delay_values[size - 1]) {

View File

@ -10077,7 +10077,7 @@ static int rtl8152_cfgselector_choose_configuration(struct usb_device *udev)
* driver supports it. * driver supports it.
*/ */
if (__rtl_get_hw_ver(udev) == RTL_VER_UNKNOWN) if (__rtl_get_hw_ver(udev) == RTL_VER_UNKNOWN)
return 0; return -ENODEV;
/* The vendor mode is not always config #1, so to find it out. */ /* The vendor mode is not always config #1, so to find it out. */
c = udev->config; c = udev->config;

View File

@ -198,7 +198,7 @@ static const struct nla_policy devlink_eswitch_set_nl_policy[DEVLINK_ATTR_ESWITC
[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, }, [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, }, [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
[DEVLINK_ATTR_ESWITCH_MODE] = NLA_POLICY_MAX(NLA_U16, 1), [DEVLINK_ATTR_ESWITCH_MODE] = NLA_POLICY_MAX(NLA_U16, 1),
[DEVLINK_ATTR_ESWITCH_INLINE_MODE] = NLA_POLICY_MAX(NLA_U16, 3), [DEVLINK_ATTR_ESWITCH_INLINE_MODE] = NLA_POLICY_MAX(NLA_U8, 3),
[DEVLINK_ATTR_ESWITCH_ENCAP_MODE] = NLA_POLICY_MAX(NLA_U8, 1), [DEVLINK_ATTR_ESWITCH_ENCAP_MODE] = NLA_POLICY_MAX(NLA_U8, 1),
}; };

View File

@ -377,7 +377,7 @@ int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb,
bool log_ecn_error) bool log_ecn_error)
{ {
const struct iphdr *iph = ip_hdr(skb); const struct iphdr *iph = ip_hdr(skb);
int err; int nh, err;
#ifdef CONFIG_NET_IPGRE_BROADCAST #ifdef CONFIG_NET_IPGRE_BROADCAST
if (ipv4_is_multicast(iph->daddr)) { if (ipv4_is_multicast(iph->daddr)) {
@ -403,8 +403,21 @@ int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb,
tunnel->i_seqno = ntohl(tpi->seq) + 1; tunnel->i_seqno = ntohl(tpi->seq) + 1;
} }
/* Save offset of outer header relative to skb->head,
* because we are going to reset the network header to the inner header
* and might change skb->head.
*/
nh = skb_network_header(skb) - skb->head;
skb_set_network_header(skb, (tunnel->dev->type == ARPHRD_ETHER) ? ETH_HLEN : 0); skb_set_network_header(skb, (tunnel->dev->type == ARPHRD_ETHER) ? ETH_HLEN : 0);
if (!pskb_inet_may_pull(skb)) {
DEV_STATS_INC(tunnel->dev, rx_length_errors);
DEV_STATS_INC(tunnel->dev, rx_errors);
goto drop;
}
iph = (struct iphdr *)(skb->head + nh);
err = IP_ECN_decapsulate(iph, skb); err = IP_ECN_decapsulate(iph, skb);
if (unlikely(err)) { if (unlikely(err)) {
if (log_ecn_error) if (log_ecn_error)

View File

@ -449,6 +449,11 @@ static size_t fib6_rule_nlmsg_payload(struct fib_rule *rule)
+ nla_total_size(16); /* src */ + nla_total_size(16); /* src */
} }
static void fib6_rule_flush_cache(struct fib_rules_ops *ops)
{
rt_genid_bump_ipv6(ops->fro_net);
}
static const struct fib_rules_ops __net_initconst fib6_rules_ops_template = { static const struct fib_rules_ops __net_initconst fib6_rules_ops_template = {
.family = AF_INET6, .family = AF_INET6,
.rule_size = sizeof(struct fib6_rule), .rule_size = sizeof(struct fib6_rule),
@ -461,6 +466,7 @@ static const struct fib_rules_ops __net_initconst fib6_rules_ops_template = {
.compare = fib6_rule_compare, .compare = fib6_rule_compare,
.fill = fib6_rule_fill, .fill = fib6_rule_fill,
.nlmsg_payload = fib6_rule_nlmsg_payload, .nlmsg_payload = fib6_rule_nlmsg_payload,
.flush_cache = fib6_rule_flush_cache,
.nlgroup = RTNLGRP_IPV6_RULE, .nlgroup = RTNLGRP_IPV6_RULE,
.owner = THIS_MODULE, .owner = THIS_MODULE,
.fro_net = &init_net, .fro_net = &init_net,