Archived
14
0
Fork 0

Merge git://github.com/davem330/net

* git://github.com/davem330/net:
  ipv6-multicast: Fix memory leak in IPv6 multicast.
  ipv6: check return value for dst_alloc
  net: check return value for dst_alloc
  ipv6-multicast: Fix memory leak in input path.
  bnx2x: add missing break in bnx2x_dcbnl_get_cap
  bnx2x: fix WOL by enablement PME in config space
  bnx2x: fix hw attention handling
  net: fix a typo in Documentation/networking/scaling.txt
  ath9k: Fix a dma warning/memory leak
  rtlwifi: rtl8192cu: Fix unitialized struct
  iwlagn: fix dangling scan request
  batman-adv: do_bcast has to be true for broadcast packets only
  cfg80211: Fix validation of AKM suites
  iwlegacy: do not use interruptible waits
  iwlegacy: fix command queue timeout
  ath9k_hw: Fix Rx DMA stuck for AR9003 chips
This commit is contained in:
Linus Torvalds 2011-09-28 08:39:05 -07:00
commit 2ef7b45a59
18 changed files with 93 additions and 46 deletions

View file

@ -243,7 +243,7 @@ configured. The number of entries in the global flow table is set through:
The number of entries in the per-queue flow table are set through: The number of entries in the per-queue flow table are set through:
/sys/class/net/<dev>/queues/tx-<n>/rps_flow_cnt /sys/class/net/<dev>/queues/rx-<n>/rps_flow_cnt
== Suggested Configuration == Suggested Configuration

View file

@ -2120,6 +2120,7 @@ static u8 bnx2x_dcbnl_get_cap(struct net_device *netdev, int capid, u8 *cap)
break; break;
case DCB_CAP_ATTR_DCBX: case DCB_CAP_ATTR_DCBX:
*cap = BNX2X_DCBX_CAPS; *cap = BNX2X_DCBX_CAPS;
break;
default: default:
rval = -EINVAL; rval = -EINVAL;
break; break;

View file

@ -4943,7 +4943,7 @@ static void bnx2x_init_def_sb(struct bnx2x *bp)
int igu_seg_id; int igu_seg_id;
int port = BP_PORT(bp); int port = BP_PORT(bp);
int func = BP_FUNC(bp); int func = BP_FUNC(bp);
int reg_offset; int reg_offset, reg_offset_en5;
u64 section; u64 section;
int index; int index;
struct hc_sp_status_block_data sp_sb_data; struct hc_sp_status_block_data sp_sb_data;
@ -4966,6 +4966,8 @@ static void bnx2x_init_def_sb(struct bnx2x *bp)
reg_offset = (port ? MISC_REG_AEU_ENABLE1_FUNC_1_OUT_0 : reg_offset = (port ? MISC_REG_AEU_ENABLE1_FUNC_1_OUT_0 :
MISC_REG_AEU_ENABLE1_FUNC_0_OUT_0); MISC_REG_AEU_ENABLE1_FUNC_0_OUT_0);
reg_offset_en5 = (port ? MISC_REG_AEU_ENABLE5_FUNC_1_OUT_0 :
MISC_REG_AEU_ENABLE5_FUNC_0_OUT_0);
for (index = 0; index < MAX_DYNAMIC_ATTN_GRPS; index++) { for (index = 0; index < MAX_DYNAMIC_ATTN_GRPS; index++) {
int sindex; int sindex;
/* take care of sig[0]..sig[4] */ /* take care of sig[0]..sig[4] */
@ -4980,7 +4982,7 @@ static void bnx2x_init_def_sb(struct bnx2x *bp)
* and not 16 between the different groups * and not 16 between the different groups
*/ */
bp->attn_group[index].sig[4] = REG_RD(bp, bp->attn_group[index].sig[4] = REG_RD(bp,
reg_offset + 0x10 + 0x4*index); reg_offset_en5 + 0x4*index);
else else
bp->attn_group[index].sig[4] = 0; bp->attn_group[index].sig[4] = 0;
} }
@ -7625,8 +7627,11 @@ u32 bnx2x_send_unload_req(struct bnx2x *bp, int unload_mode)
u32 emac_base = port ? GRCBASE_EMAC1 : GRCBASE_EMAC0; u32 emac_base = port ? GRCBASE_EMAC1 : GRCBASE_EMAC0;
u8 *mac_addr = bp->dev->dev_addr; u8 *mac_addr = bp->dev->dev_addr;
u32 val; u32 val;
u16 pmc;
/* The mac address is written to entries 1-4 to /* The mac address is written to entries 1-4 to
preserve entry 0 which is used by the PMF */ * preserve entry 0 which is used by the PMF
*/
u8 entry = (BP_VN(bp) + 1)*8; u8 entry = (BP_VN(bp) + 1)*8;
val = (mac_addr[0] << 8) | mac_addr[1]; val = (mac_addr[0] << 8) | mac_addr[1];
@ -7636,6 +7641,11 @@ u32 bnx2x_send_unload_req(struct bnx2x *bp, int unload_mode)
(mac_addr[4] << 8) | mac_addr[5]; (mac_addr[4] << 8) | mac_addr[5];
EMAC_WR(bp, EMAC_REG_EMAC_MAC_MATCH + entry + 4, val); EMAC_WR(bp, EMAC_REG_EMAC_MAC_MATCH + entry + 4, val);
/* Enable the PME and clear the status */
pci_read_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL, &pmc);
pmc |= PCI_PM_CTRL_PME_ENABLE | PCI_PM_CTRL_PME_STATUS;
pci_write_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL, pmc);
reset_code = DRV_MSG_CODE_UNLOAD_REQ_WOL_EN; reset_code = DRV_MSG_CODE_UNLOAD_REQ_WOL_EN;
} else } else

View file

@ -1384,6 +1384,18 @@
Latched ump_tx_parity; [31] MCP Latched scpad_parity; */ Latched ump_tx_parity; [31] MCP Latched scpad_parity; */
#define MISC_REG_AEU_ENABLE4_PXP_0 0xa108 #define MISC_REG_AEU_ENABLE4_PXP_0 0xa108
#define MISC_REG_AEU_ENABLE4_PXP_1 0xa1a8 #define MISC_REG_AEU_ENABLE4_PXP_1 0xa1a8
/* [RW 32] fifth 32b for enabling the output for function 0 output0. Mapped
* as follows: [0] PGLUE config_space; [1] PGLUE misc_flr; [2] PGLUE B RBC
* attention [3] PGLUE B RBC parity; [4] ATC attention; [5] ATC parity; [6]
* mstat0 attention; [7] mstat0 parity; [8] mstat1 attention; [9] mstat1
* parity; [31-10] Reserved; */
#define MISC_REG_AEU_ENABLE5_FUNC_0_OUT_0 0xa688
/* [RW 32] Fifth 32b for enabling the output for function 1 output0. Mapped
* as follows: [0] PGLUE config_space; [1] PGLUE misc_flr; [2] PGLUE B RBC
* attention [3] PGLUE B RBC parity; [4] ATC attention; [5] ATC parity; [6]
* mstat0 attention; [7] mstat0 parity; [8] mstat1 attention; [9] mstat1
* parity; [31-10] Reserved; */
#define MISC_REG_AEU_ENABLE5_FUNC_1_OUT_0 0xa6b0
/* [RW 1] set/clr general attention 0; this will set/clr bit 94 in the aeu /* [RW 1] set/clr general attention 0; this will set/clr bit 94 in the aeu
128 bit vector */ 128 bit vector */
#define MISC_REG_AEU_GENERAL_ATTN_0 0xa000 #define MISC_REG_AEU_GENERAL_ATTN_0 0xa000

View file

@ -1514,7 +1514,7 @@ static const u32 ar9300_2p2_mac_core[][2] = {
{0x00008258, 0x00000000}, {0x00008258, 0x00000000},
{0x0000825c, 0x40000000}, {0x0000825c, 0x40000000},
{0x00008260, 0x00080922}, {0x00008260, 0x00080922},
{0x00008264, 0x9bc00010}, {0x00008264, 0x9d400010},
{0x00008268, 0xffffffff}, {0x00008268, 0xffffffff},
{0x0000826c, 0x0000ffff}, {0x0000826c, 0x0000ffff},
{0x00008270, 0x00000000}, {0x00008270, 0x00000000},

View file

@ -205,14 +205,22 @@ static void ath_rx_remove_buffer(struct ath_softc *sc,
static void ath_rx_edma_cleanup(struct ath_softc *sc) static void ath_rx_edma_cleanup(struct ath_softc *sc)
{ {
struct ath_hw *ah = sc->sc_ah;
struct ath_common *common = ath9k_hw_common(ah);
struct ath_buf *bf; struct ath_buf *bf;
ath_rx_remove_buffer(sc, ATH9K_RX_QUEUE_LP); ath_rx_remove_buffer(sc, ATH9K_RX_QUEUE_LP);
ath_rx_remove_buffer(sc, ATH9K_RX_QUEUE_HP); ath_rx_remove_buffer(sc, ATH9K_RX_QUEUE_HP);
list_for_each_entry(bf, &sc->rx.rxbuf, list) { list_for_each_entry(bf, &sc->rx.rxbuf, list) {
if (bf->bf_mpdu) if (bf->bf_mpdu) {
dma_unmap_single(sc->dev, bf->bf_buf_addr,
common->rx_bufsize,
DMA_BIDIRECTIONAL);
dev_kfree_skb_any(bf->bf_mpdu); dev_kfree_skb_any(bf->bf_mpdu);
bf->bf_buf_addr = 0;
bf->bf_mpdu = NULL;
}
} }
INIT_LIST_HEAD(&sc->rx.rxbuf); INIT_LIST_HEAD(&sc->rx.rxbuf);

View file

@ -937,7 +937,7 @@ void iwl_legacy_irq_handle_error(struct iwl_priv *priv)
&priv->contexts[IWL_RXON_CTX_BSS]); &priv->contexts[IWL_RXON_CTX_BSS]);
#endif #endif
wake_up_interruptible(&priv->wait_command_queue); wake_up(&priv->wait_command_queue);
/* Keep the restart process from trying to send host /* Keep the restart process from trying to send host
* commands by clearing the INIT status bit */ * commands by clearing the INIT status bit */
@ -1746,7 +1746,7 @@ int iwl_legacy_force_reset(struct iwl_priv *priv, bool external)
/* Set the FW error flag -- cleared on iwl_down */ /* Set the FW error flag -- cleared on iwl_down */
set_bit(STATUS_FW_ERROR, &priv->status); set_bit(STATUS_FW_ERROR, &priv->status);
wake_up_interruptible(&priv->wait_command_queue); wake_up(&priv->wait_command_queue);
/* /*
* Keep the restart process from trying to send host * Keep the restart process from trying to send host
* commands by clearing the INIT status bit * commands by clearing the INIT status bit

View file

@ -167,7 +167,7 @@ int iwl_legacy_send_cmd_sync(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
goto out; goto out;
} }
ret = wait_event_interruptible_timeout(priv->wait_command_queue, ret = wait_event_timeout(priv->wait_command_queue,
!test_bit(STATUS_HCMD_ACTIVE, &priv->status), !test_bit(STATUS_HCMD_ACTIVE, &priv->status),
HOST_COMPLETE_TIMEOUT); HOST_COMPLETE_TIMEOUT);
if (!ret) { if (!ret) {

View file

@ -625,6 +625,8 @@ iwl_legacy_tx_cmd_complete(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb)
cmd = txq->cmd[cmd_index]; cmd = txq->cmd[cmd_index];
meta = &txq->meta[cmd_index]; meta = &txq->meta[cmd_index];
txq->time_stamp = jiffies;
pci_unmap_single(priv->pci_dev, pci_unmap_single(priv->pci_dev,
dma_unmap_addr(meta, mapping), dma_unmap_addr(meta, mapping),
dma_unmap_len(meta, len), dma_unmap_len(meta, len),
@ -645,7 +647,7 @@ iwl_legacy_tx_cmd_complete(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb)
clear_bit(STATUS_HCMD_ACTIVE, &priv->status); clear_bit(STATUS_HCMD_ACTIVE, &priv->status);
IWL_DEBUG_INFO(priv, "Clearing HCMD_ACTIVE for command %s\n", IWL_DEBUG_INFO(priv, "Clearing HCMD_ACTIVE for command %s\n",
iwl_legacy_get_cmd_string(cmd->hdr.cmd)); iwl_legacy_get_cmd_string(cmd->hdr.cmd));
wake_up_interruptible(&priv->wait_command_queue); wake_up(&priv->wait_command_queue);
} }
/* Mark as unmapped */ /* Mark as unmapped */

View file

@ -841,7 +841,7 @@ static void iwl3945_rx_card_state_notif(struct iwl_priv *priv,
wiphy_rfkill_set_hw_state(priv->hw->wiphy, wiphy_rfkill_set_hw_state(priv->hw->wiphy,
test_bit(STATUS_RF_KILL_HW, &priv->status)); test_bit(STATUS_RF_KILL_HW, &priv->status));
else else
wake_up_interruptible(&priv->wait_command_queue); wake_up(&priv->wait_command_queue);
} }
/** /**
@ -2269,7 +2269,7 @@ static void iwl3945_alive_start(struct iwl_priv *priv)
iwl3945_reg_txpower_periodic(priv); iwl3945_reg_txpower_periodic(priv);
IWL_DEBUG_INFO(priv, "ALIVE processing complete.\n"); IWL_DEBUG_INFO(priv, "ALIVE processing complete.\n");
wake_up_interruptible(&priv->wait_command_queue); wake_up(&priv->wait_command_queue);
return; return;
@ -2300,7 +2300,7 @@ static void __iwl3945_down(struct iwl_priv *priv)
iwl_legacy_clear_driver_stations(priv); iwl_legacy_clear_driver_stations(priv);
/* Unblock any waiting calls */ /* Unblock any waiting calls */
wake_up_interruptible_all(&priv->wait_command_queue); wake_up_all(&priv->wait_command_queue);
/* Wipe out the EXIT_PENDING status bit if we are not actually /* Wipe out the EXIT_PENDING status bit if we are not actually
* exiting the module */ * exiting the module */
@ -2853,7 +2853,7 @@ static int iwl3945_mac_start(struct ieee80211_hw *hw)
/* Wait for START_ALIVE from ucode. Otherwise callbacks from /* Wait for START_ALIVE from ucode. Otherwise callbacks from
* mac80211 will not be run successfully. */ * mac80211 will not be run successfully. */
ret = wait_event_interruptible_timeout(priv->wait_command_queue, ret = wait_event_timeout(priv->wait_command_queue,
test_bit(STATUS_READY, &priv->status), test_bit(STATUS_READY, &priv->status),
UCODE_READY_TIMEOUT); UCODE_READY_TIMEOUT);
if (!ret) { if (!ret) {

View file

@ -576,7 +576,7 @@ static void iwl4965_rx_card_state_notif(struct iwl_priv *priv,
wiphy_rfkill_set_hw_state(priv->hw->wiphy, wiphy_rfkill_set_hw_state(priv->hw->wiphy,
test_bit(STATUS_RF_KILL_HW, &priv->status)); test_bit(STATUS_RF_KILL_HW, &priv->status));
else else
wake_up_interruptible(&priv->wait_command_queue); wake_up(&priv->wait_command_queue);
} }
/** /**
@ -926,7 +926,7 @@ static void iwl4965_irq_tasklet(struct iwl_priv *priv)
handled |= CSR_INT_BIT_FH_TX; handled |= CSR_INT_BIT_FH_TX;
/* Wake up uCode load routine, now that load is complete */ /* Wake up uCode load routine, now that load is complete */
priv->ucode_write_complete = 1; priv->ucode_write_complete = 1;
wake_up_interruptible(&priv->wait_command_queue); wake_up(&priv->wait_command_queue);
} }
if (inta & ~handled) { if (inta & ~handled) {
@ -1795,7 +1795,7 @@ static void iwl4965_alive_start(struct iwl_priv *priv)
iwl4965_rf_kill_ct_config(priv); iwl4965_rf_kill_ct_config(priv);
IWL_DEBUG_INFO(priv, "ALIVE processing complete.\n"); IWL_DEBUG_INFO(priv, "ALIVE processing complete.\n");
wake_up_interruptible(&priv->wait_command_queue); wake_up(&priv->wait_command_queue);
iwl_legacy_power_update_mode(priv, true); iwl_legacy_power_update_mode(priv, true);
IWL_DEBUG_INFO(priv, "Updated power mode\n"); IWL_DEBUG_INFO(priv, "Updated power mode\n");
@ -1828,7 +1828,7 @@ static void __iwl4965_down(struct iwl_priv *priv)
iwl_legacy_clear_driver_stations(priv); iwl_legacy_clear_driver_stations(priv);
/* Unblock any waiting calls */ /* Unblock any waiting calls */
wake_up_interruptible_all(&priv->wait_command_queue); wake_up_all(&priv->wait_command_queue);
/* Wipe out the EXIT_PENDING status bit if we are not actually /* Wipe out the EXIT_PENDING status bit if we are not actually
* exiting the module */ * exiting the module */
@ -2266,7 +2266,7 @@ int iwl4965_mac_start(struct ieee80211_hw *hw)
/* Wait for START_ALIVE from Run Time ucode. Otherwise callbacks from /* Wait for START_ALIVE from Run Time ucode. Otherwise callbacks from
* mac80211 will not be run successfully. */ * mac80211 will not be run successfully. */
ret = wait_event_interruptible_timeout(priv->wait_command_queue, ret = wait_event_timeout(priv->wait_command_queue,
test_bit(STATUS_READY, &priv->status), test_bit(STATUS_READY, &priv->status),
UCODE_READY_TIMEOUT); UCODE_READY_TIMEOUT);
if (!ret) { if (!ret) {

View file

@ -405,31 +405,33 @@ int iwl_mac_hw_scan(struct ieee80211_hw *hw,
mutex_lock(&priv->mutex); mutex_lock(&priv->mutex);
if (test_bit(STATUS_SCANNING, &priv->status) &&
priv->scan_type != IWL_SCAN_NORMAL) {
IWL_DEBUG_SCAN(priv, "Scan already in progress.\n");
ret = -EAGAIN;
goto out_unlock;
}
/* mac80211 will only ask for one band at a time */
priv->scan_request = req;
priv->scan_vif = vif;
/* /*
* If an internal scan is in progress, just set * If an internal scan is in progress, just set
* up the scan_request as per above. * up the scan_request as per above.
*/ */
if (priv->scan_type != IWL_SCAN_NORMAL) { if (priv->scan_type != IWL_SCAN_NORMAL) {
IWL_DEBUG_SCAN(priv, "SCAN request during internal scan\n"); IWL_DEBUG_SCAN(priv,
"SCAN request during internal scan - defer\n");
priv->scan_request = req;
priv->scan_vif = vif;
ret = 0; ret = 0;
} else } else {
priv->scan_request = req;
priv->scan_vif = vif;
/*
* mac80211 will only ask for one band at a time
* so using channels[0] here is ok
*/
ret = iwl_scan_initiate(priv, vif, IWL_SCAN_NORMAL, ret = iwl_scan_initiate(priv, vif, IWL_SCAN_NORMAL,
req->channels[0]->band); req->channels[0]->band);
if (ret) {
priv->scan_request = NULL;
priv->scan_vif = NULL;
}
}
IWL_DEBUG_MAC80211(priv, "leave\n"); IWL_DEBUG_MAC80211(priv, "leave\n");
out_unlock:
mutex_unlock(&priv->mutex); mutex_unlock(&priv->mutex);
return ret; return ret;

View file

@ -863,6 +863,7 @@ static void _rtl_usb_tx_preprocess(struct ieee80211_hw *hw, struct sk_buff *skb,
u8 tid = 0; u8 tid = 0;
u16 seq_number = 0; u16 seq_number = 0;
memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc));
if (ieee80211_is_auth(fc)) { if (ieee80211_is_auth(fc)) {
RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, ("MAC80211_LINKING\n")); RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, ("MAC80211_LINKING\n"));
rtl_ips_nic_on(hw); rtl_ips_nic_on(hw);

View file

@ -565,7 +565,7 @@ static int interface_tx(struct sk_buff *skb, struct net_device *soft_iface)
struct orig_node *orig_node = NULL; struct orig_node *orig_node = NULL;
int data_len = skb->len, ret; int data_len = skb->len, ret;
short vid = -1; short vid = -1;
bool do_bcast = false; bool do_bcast;
if (atomic_read(&bat_priv->mesh_state) != MESH_ACTIVE) if (atomic_read(&bat_priv->mesh_state) != MESH_ACTIVE)
goto dropped; goto dropped;
@ -598,15 +598,15 @@ static int interface_tx(struct sk_buff *skb, struct net_device *soft_iface)
tt_local_add(soft_iface, ethhdr->h_source); tt_local_add(soft_iface, ethhdr->h_source);
orig_node = transtable_search(bat_priv, ethhdr->h_dest); orig_node = transtable_search(bat_priv, ethhdr->h_dest);
if (is_multicast_ether_addr(ethhdr->h_dest) || do_bcast = is_multicast_ether_addr(ethhdr->h_dest);
(orig_node && orig_node->gw_flags)) { if (do_bcast || (orig_node && orig_node->gw_flags)) {
ret = gw_is_target(bat_priv, skb, orig_node); ret = gw_is_target(bat_priv, skb, orig_node);
if (ret < 0) if (ret < 0)
goto dropped; goto dropped;
if (ret == 0) if (ret)
do_bcast = true; do_bcast = false;
} }
/* ethernet packet should be broadcasted */ /* ethernet packet should be broadcasted */

View file

@ -696,8 +696,10 @@ static netdev_tx_t reg_vif_xmit(struct sk_buff *skb,
int err; int err;
err = ip6mr_fib_lookup(net, &fl6, &mrt); err = ip6mr_fib_lookup(net, &fl6, &mrt);
if (err < 0) if (err < 0) {
kfree_skb(skb);
return err; return err;
}
read_lock(&mrt_lock); read_lock(&mrt_lock);
dev->stats.tx_bytes += skb->len; dev->stats.tx_bytes += skb->len;
@ -2052,8 +2054,10 @@ int ip6_mr_input(struct sk_buff *skb)
int err; int err;
err = ip6mr_fib_lookup(net, &fl6, &mrt); err = ip6mr_fib_lookup(net, &fl6, &mrt);
if (err < 0) if (err < 0) {
kfree_skb(skb);
return err; return err;
}
read_lock(&mrt_lock); read_lock(&mrt_lock);
cache = ip6mr_cache_find(mrt, cache = ip6mr_cache_find(mrt,

View file

@ -244,7 +244,9 @@ static inline struct rt6_info *ip6_dst_alloc(struct dst_ops *ops,
{ {
struct rt6_info *rt = dst_alloc(ops, dev, 0, 0, flags); struct rt6_info *rt = dst_alloc(ops, dev, 0, 0, flags);
memset(&rt->rt6i_table, 0, sizeof(*rt) - sizeof(struct dst_entry)); if (rt != NULL)
memset(&rt->rt6i_table, 0,
sizeof(*rt) - sizeof(struct dst_entry));
return rt; return rt;
} }

View file

@ -4113,9 +4113,12 @@ static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
if (len % sizeof(u32)) if (len % sizeof(u32))
return -EINVAL; return -EINVAL;
if (settings->n_akm_suites > NL80211_MAX_NR_AKM_SUITES)
return -EINVAL;
memcpy(settings->akm_suites, data, len); memcpy(settings->akm_suites, data, len);
for (i = 0; i < settings->n_ciphers_pairwise; i++) for (i = 0; i < settings->n_akm_suites; i++)
if (!nl80211_valid_akm_suite(settings->akm_suites[i])) if (!nl80211_valid_akm_suite(settings->akm_suites[i]))
return -EINVAL; return -EINVAL;
} }

View file

@ -1349,14 +1349,16 @@ static inline struct xfrm_dst *xfrm_alloc_dst(struct net *net, int family)
BUG(); BUG();
} }
xdst = dst_alloc(dst_ops, NULL, 0, 0, 0); xdst = dst_alloc(dst_ops, NULL, 0, 0, 0);
memset(&xdst->u.rt6.rt6i_table, 0, sizeof(*xdst) - sizeof(struct dst_entry));
xfrm_policy_put_afinfo(afinfo);
if (likely(xdst)) if (likely(xdst)) {
memset(&xdst->u.rt6.rt6i_table, 0,
sizeof(*xdst) - sizeof(struct dst_entry));
xdst->flo.ops = &xfrm_bundle_fc_ops; xdst->flo.ops = &xfrm_bundle_fc_ops;
else } else
xdst = ERR_PTR(-ENOBUFS); xdst = ERR_PTR(-ENOBUFS);
xfrm_policy_put_afinfo(afinfo);
return xdst; return xdst;
} }