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

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6:
  3c509: Add missing EISA IDs
  MAINTAINERS: take maintainership of the cpmac Ethernet driver
  net/firmare: Ignore .cis files
  ath1e: add new device id for asus hardware
  mlx4_en: Fix a kernel panic when waking tx queue
  rtl8187: add USB ID for Linksys WUSB54GC-EU v2 USB wifi dongle
  at76c50x-usb: avoid mutex deadlock in at76_dwork_hw_scan
  mac8390: fix build with NET_POLL_CONTROLLER
  cxgb3: link fault fixes
  cxgb3: fix dma mapping regression
  netfilter: nfnetlink_log: fix wrong skbuff size	calculation
  netfilter: xt_hashlimit does a wrong SEQ_SKIP
  bfin_mac: fix build error due to net_device_ops convert
  atlx: move modinfo data from atlx.h to atl1.c
  gianfar: fix babbling rx error event bug
  cls_cgroup: read classid atomically in classifier
  netfilter: nf_ct_dccp: add missing DCCP protocol changes in event cache
  netfilter: nf_ct_tcp: fix accepting invalid RST segments
This commit is contained in:
Linus Torvalds 2009-06-01 08:02:05 -07:00
commit 6e42910184
23 changed files with 109 additions and 56 deletions

View file

@ -1542,6 +1542,13 @@ W: http://www.fi.muni.cz/~kas/cosa/
S: Maintained S: Maintained
F: drivers/net/wan/cosa* F: drivers/net/wan/cosa*
CPMAC ETHERNET DRIVER
P: Florian Fainelli
M: florian@openwrt.org
L: netdev@vger.kernel.org
S: Maintained
F: drivers/net/cpmac.c
CPU FREQUENCY DRIVERS CPU FREQUENCY DRIVERS
P: Dave Jones P: Dave Jones
M: davej@redhat.com M: davej@redhat.com

View file

@ -480,9 +480,13 @@ static int pnp_registered;
#ifdef CONFIG_EISA #ifdef CONFIG_EISA
static struct eisa_device_id el3_eisa_ids[] = { static struct eisa_device_id el3_eisa_ids[] = {
{ "TCM5090" },
{ "TCM5091" },
{ "TCM5092" }, { "TCM5092" },
{ "TCM5093" }, { "TCM5093" },
{ "TCM5094" },
{ "TCM5095" }, { "TCM5095" },
{ "TCM5098" },
{ "" } { "" }
}; };
MODULE_DEVICE_TABLE(eisa, el3_eisa_ids); MODULE_DEVICE_TABLE(eisa, el3_eisa_ids);

View file

@ -37,6 +37,7 @@ char atl1e_driver_version[] = DRV_VERSION;
*/ */
static struct pci_device_id atl1e_pci_tbl[] = { static struct pci_device_id atl1e_pci_tbl[] = {
{PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATTANSIC_L1E)}, {PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATTANSIC_L1E)},
{PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, 0x1066)},
/* required last entry */ /* required last entry */
{ 0 } { 0 }
}; };

View file

@ -82,6 +82,12 @@
#include "atl1.h" #include "atl1.h"
#define ATLX_DRIVER_VERSION "2.1.3"
MODULE_AUTHOR("Xiong Huang <xiong.huang@atheros.com>, \
Chris Snook <csnook@redhat.com>, Jay Cliburn <jcliburn@gmail.com>");
MODULE_LICENSE("GPL");
MODULE_VERSION(ATLX_DRIVER_VERSION);
/* Temporary hack for merging atl1 and atl2 */ /* Temporary hack for merging atl1 and atl2 */
#include "atlx.c" #include "atlx.c"

View file

@ -29,12 +29,6 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/types.h> #include <linux/types.h>
#define ATLX_DRIVER_VERSION "2.1.3"
MODULE_AUTHOR("Xiong Huang <xiong.huang@atheros.com>, \
Chris Snook <csnook@redhat.com>, Jay Cliburn <jcliburn@gmail.com>");
MODULE_LICENSE("GPL");
MODULE_VERSION(ATLX_DRIVER_VERSION);
#define ATLX_ERR_PHY 2 #define ATLX_ERR_PHY 2
#define ATLX_ERR_PHY_SPEED 7 #define ATLX_ERR_PHY_SPEED 7
#define ATLX_ERR_PHY_RES 8 #define ATLX_ERR_PHY_RES 8

View file

@ -979,22 +979,7 @@ static int bfin_mac_open(struct net_device *dev)
return 0; return 0;
} }
static const struct net_device_ops bfin_mac_netdev_ops = {
.ndo_open = bfin_mac_open,
.ndo_stop = bfin_mac_close,
.ndo_start_xmit = bfin_mac_hard_start_xmit,
.ndo_set_mac_address = bfin_mac_set_mac_address,
.ndo_tx_timeout = bfin_mac_timeout,
.ndo_set_multicast_list = bfin_mac_set_multicast_list,
.ndo_validate_addr = eth_validate_addr,
.ndo_change_mtu = eth_change_mtu,
#ifdef CONFIG_NET_POLL_CONTROLLER
.ndo_poll_controller = bfin_mac_poll,
#endif
};
/* /*
*
* this makes the board clean up everything that it can * this makes the board clean up everything that it can
* and not talk to the outside world. Caused by * and not talk to the outside world. Caused by
* an 'ifconfig ethX down' * an 'ifconfig ethX down'
@ -1019,6 +1004,20 @@ static int bfin_mac_close(struct net_device *dev)
return 0; return 0;
} }
static const struct net_device_ops bfin_mac_netdev_ops = {
.ndo_open = bfin_mac_open,
.ndo_stop = bfin_mac_close,
.ndo_start_xmit = bfin_mac_hard_start_xmit,
.ndo_set_mac_address = bfin_mac_set_mac_address,
.ndo_tx_timeout = bfin_mac_timeout,
.ndo_set_multicast_list = bfin_mac_set_multicast_list,
.ndo_validate_addr = eth_validate_addr,
.ndo_change_mtu = eth_change_mtu,
#ifdef CONFIG_NET_POLL_CONTROLLER
.ndo_poll_controller = bfin_mac_poll,
#endif
};
static int __devinit bfin_mac_probe(struct platform_device *pdev) static int __devinit bfin_mac_probe(struct platform_device *pdev)
{ {
struct net_device *ndev; struct net_device *ndev;

View file

@ -85,8 +85,8 @@ struct fl_pg_chunk {
struct page *page; struct page *page;
void *va; void *va;
unsigned int offset; unsigned int offset;
u64 *p_cnt; unsigned long *p_cnt;
DECLARE_PCI_UNMAP_ADDR(mapping); dma_addr_t mapping;
}; };
struct rx_desc; struct rx_desc;

View file

@ -2496,14 +2496,16 @@ static void check_link_status(struct adapter *adapter)
for_each_port(adapter, i) { for_each_port(adapter, i) {
struct net_device *dev = adapter->port[i]; struct net_device *dev = adapter->port[i];
struct port_info *p = netdev_priv(dev); struct port_info *p = netdev_priv(dev);
int link_fault;
spin_lock_irq(&adapter->work_lock); spin_lock_irq(&adapter->work_lock);
if (p->link_fault) { link_fault = p->link_fault;
spin_unlock_irq(&adapter->work_lock);
if (link_fault) {
t3_link_fault(adapter, i); t3_link_fault(adapter, i);
spin_unlock_irq(&adapter->work_lock);
continue; continue;
} }
spin_unlock_irq(&adapter->work_lock);
if (!(p->phy.caps & SUPPORTED_IRQ) && netif_running(dev)) { if (!(p->phy.caps & SUPPORTED_IRQ) && netif_running(dev)) {
t3_xgm_intr_disable(adapter, i); t3_xgm_intr_disable(adapter, i);

View file

@ -355,7 +355,7 @@ static void clear_rx_desc(struct pci_dev *pdev, const struct sge_fl *q,
(*d->pg_chunk.p_cnt)--; (*d->pg_chunk.p_cnt)--;
if (!*d->pg_chunk.p_cnt) if (!*d->pg_chunk.p_cnt)
pci_unmap_page(pdev, pci_unmap_page(pdev,
pci_unmap_addr(&d->pg_chunk, mapping), d->pg_chunk.mapping,
q->alloc_size, PCI_DMA_FROMDEVICE); q->alloc_size, PCI_DMA_FROMDEVICE);
put_page(d->pg_chunk.page); put_page(d->pg_chunk.page);
@ -454,7 +454,7 @@ static int alloc_pg_chunk(struct adapter *adapter, struct sge_fl *q,
q->pg_chunk.offset = 0; q->pg_chunk.offset = 0;
mapping = pci_map_page(adapter->pdev, q->pg_chunk.page, mapping = pci_map_page(adapter->pdev, q->pg_chunk.page,
0, q->alloc_size, PCI_DMA_FROMDEVICE); 0, q->alloc_size, PCI_DMA_FROMDEVICE);
pci_unmap_addr_set(&q->pg_chunk, mapping, mapping); q->pg_chunk.mapping = mapping;
} }
sd->pg_chunk = q->pg_chunk; sd->pg_chunk = q->pg_chunk;
@ -511,8 +511,7 @@ static int refill_fl(struct adapter *adap, struct sge_fl *q, int n, gfp_t gfp)
nomem: q->alloc_failed++; nomem: q->alloc_failed++;
break; break;
} }
mapping = pci_unmap_addr(&sd->pg_chunk, mapping) + mapping = sd->pg_chunk.mapping + sd->pg_chunk.offset;
sd->pg_chunk.offset;
pci_unmap_addr_set(sd, dma_addr, mapping); pci_unmap_addr_set(sd, dma_addr, mapping);
add_one_rx_chunk(mapping, d, q->gen); add_one_rx_chunk(mapping, d, q->gen);
@ -881,7 +880,7 @@ recycle:
(*sd->pg_chunk.p_cnt)--; (*sd->pg_chunk.p_cnt)--;
if (!*sd->pg_chunk.p_cnt) if (!*sd->pg_chunk.p_cnt)
pci_unmap_page(adap->pdev, pci_unmap_page(adap->pdev,
pci_unmap_addr(&sd->pg_chunk, mapping), sd->pg_chunk.mapping,
fl->alloc_size, fl->alloc_size,
PCI_DMA_FROMDEVICE); PCI_DMA_FROMDEVICE);
if (!skb) { if (!skb) {
@ -2096,7 +2095,7 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs,
(*sd->pg_chunk.p_cnt)--; (*sd->pg_chunk.p_cnt)--;
if (!*sd->pg_chunk.p_cnt) if (!*sd->pg_chunk.p_cnt)
pci_unmap_page(adap->pdev, pci_unmap_page(adap->pdev,
pci_unmap_addr(&sd->pg_chunk, mapping), sd->pg_chunk.mapping,
fl->alloc_size, fl->alloc_size,
PCI_DMA_FROMDEVICE); PCI_DMA_FROMDEVICE);

View file

@ -1274,6 +1274,11 @@ void t3_link_fault(struct adapter *adapter, int port_id)
A_XGM_INT_STATUS + mac->offset); A_XGM_INT_STATUS + mac->offset);
link_fault &= F_LINKFAULTCHANGE; link_fault &= F_LINKFAULTCHANGE;
link_ok = lc->link_ok;
speed = lc->speed;
duplex = lc->duplex;
fc = lc->fc;
phy->ops->get_link_status(phy, &link_ok, &speed, &duplex, &fc); phy->ops->get_link_status(phy, &link_ok, &speed, &duplex, &fc);
if (link_fault) { if (link_fault) {

View file

@ -259,7 +259,7 @@ extern const char gfar_driver_version[];
(IEVENT_RXC | IEVENT_BSY | IEVENT_EBERR | IEVENT_MSRO | \ (IEVENT_RXC | IEVENT_BSY | IEVENT_EBERR | IEVENT_MSRO | \
IEVENT_BABT | IEVENT_TXC | IEVENT_TXE | IEVENT_LC \ IEVENT_BABT | IEVENT_TXC | IEVENT_TXE | IEVENT_LC \
| IEVENT_CRL | IEVENT_XFUN | IEVENT_DPE | IEVENT_PERR \ | IEVENT_CRL | IEVENT_XFUN | IEVENT_DPE | IEVENT_PERR \
| IEVENT_MAG) | IEVENT_MAG | IEVENT_BABR)
#define IMASK_INIT_CLEAR 0x00000000 #define IMASK_INIT_CLEAR 0x00000000
#define IMASK_BABR 0x80000000 #define IMASK_BABR 0x80000000

View file

@ -489,7 +489,7 @@ static const struct net_device_ops mac8390_netdev_ops = {
.ndo_set_mac_address = eth_mac_addr, .ndo_set_mac_address = eth_mac_addr,
.ndo_change_mtu = eth_change_mtu, .ndo_change_mtu = eth_change_mtu,
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
.ndo_poll_controller = ei_poll, .ndo_poll_controller = __ei_poll,
#endif #endif
}; };

View file

@ -426,7 +426,7 @@ void mlx4_en_poll_tx_cq(unsigned long data)
INC_PERF_COUNTER(priv->pstats.tx_poll); INC_PERF_COUNTER(priv->pstats.tx_poll);
if (!spin_trylock(&ring->comp_lock)) { if (!spin_trylock_irq(&ring->comp_lock)) {
mod_timer(&cq->timer, jiffies + MLX4_EN_TX_POLL_TIMEOUT); mod_timer(&cq->timer, jiffies + MLX4_EN_TX_POLL_TIMEOUT);
return; return;
} }
@ -439,7 +439,7 @@ void mlx4_en_poll_tx_cq(unsigned long data)
if (inflight && priv->port_up) if (inflight && priv->port_up)
mod_timer(&cq->timer, jiffies + MLX4_EN_TX_POLL_TIMEOUT); mod_timer(&cq->timer, jiffies + MLX4_EN_TX_POLL_TIMEOUT);
spin_unlock(&ring->comp_lock); spin_unlock_irq(&ring->comp_lock);
} }
static struct mlx4_en_tx_desc *mlx4_en_bounce_to_desc(struct mlx4_en_priv *priv, static struct mlx4_en_tx_desc *mlx4_en_bounce_to_desc(struct mlx4_en_priv *priv,
@ -482,9 +482,9 @@ static inline void mlx4_en_xmit_poll(struct mlx4_en_priv *priv, int tx_ind)
/* Poll the CQ every mlx4_en_TX_MODER_POLL packets */ /* Poll the CQ every mlx4_en_TX_MODER_POLL packets */
if ((++ring->poll_cnt & (MLX4_EN_TX_POLL_MODER - 1)) == 0) if ((++ring->poll_cnt & (MLX4_EN_TX_POLL_MODER - 1)) == 0)
if (spin_trylock(&ring->comp_lock)) { if (spin_trylock_irq(&ring->comp_lock)) {
mlx4_en_process_tx_cq(priv->dev, cq); mlx4_en_process_tx_cq(priv->dev, cq);
spin_unlock(&ring->comp_lock); spin_unlock_irq(&ring->comp_lock);
} }
} }

View file

@ -430,6 +430,7 @@ config RTL8187
ASUS P5B Deluxe ASUS P5B Deluxe
Toshiba Satellite Pro series of laptops Toshiba Satellite Pro series of laptops
Asus Wireless Link Asus Wireless Link
Linksys WUSB54GC-EU
Thanks to Realtek for their support! Thanks to Realtek for their support!

View file

@ -1873,18 +1873,18 @@ static void at76_dwork_hw_scan(struct work_struct *work)
if (ret != CMD_STATUS_COMPLETE) { if (ret != CMD_STATUS_COMPLETE) {
queue_delayed_work(priv->hw->workqueue, &priv->dwork_hw_scan, queue_delayed_work(priv->hw->workqueue, &priv->dwork_hw_scan,
SCAN_POLL_INTERVAL); SCAN_POLL_INTERVAL);
goto exit; mutex_unlock(&priv->mtx);
return;
} }
ieee80211_scan_completed(priv->hw, false);
if (is_valid_ether_addr(priv->bssid)) if (is_valid_ether_addr(priv->bssid))
at76_join(priv); at76_join(priv);
ieee80211_wake_queues(priv->hw);
exit:
mutex_unlock(&priv->mtx); mutex_unlock(&priv->mtx);
ieee80211_scan_completed(priv->hw, false);
ieee80211_wake_queues(priv->hw);
} }
static int at76_hw_scan(struct ieee80211_hw *hw, static int at76_hw_scan(struct ieee80211_hw *hw,

View file

@ -71,6 +71,8 @@ static struct usb_device_id rtl8187_table[] __devinitdata = {
{USB_DEVICE(0x18E8, 0x6232), .driver_info = DEVICE_RTL8187}, {USB_DEVICE(0x18E8, 0x6232), .driver_info = DEVICE_RTL8187},
/* AirLive */ /* AirLive */
{USB_DEVICE(0x1b75, 0x8187), .driver_info = DEVICE_RTL8187}, {USB_DEVICE(0x1b75, 0x8187), .driver_info = DEVICE_RTL8187},
/* Linksys */
{USB_DEVICE(0x1737, 0x0073), .driver_info = DEVICE_RTL8187B},
{} {}
}; };

1
firmware/cis/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
*.cis

View file

@ -35,6 +35,9 @@ enum tcp_conntrack {
/* Has unacknowledged data */ /* Has unacknowledged data */
#define IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED 0x10 #define IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED 0x10
/* The field td_maxack has been set */
#define IP_CT_TCP_FLAG_MAXACK_SET 0x20
struct nf_ct_tcp_flags { struct nf_ct_tcp_flags {
__u8 flags; __u8 flags;
__u8 mask; __u8 mask;
@ -46,6 +49,7 @@ struct ip_ct_tcp_state {
u_int32_t td_end; /* max of seq + len */ u_int32_t td_end; /* max of seq + len */
u_int32_t td_maxend; /* max of ack + max(win, 1) */ u_int32_t td_maxend; /* max of ack + max(win, 1) */
u_int32_t td_maxwin; /* max(win) */ u_int32_t td_maxwin; /* max(win) */
u_int32_t td_maxack; /* max of ack */
u_int8_t td_scale; /* window scale factor */ u_int8_t td_scale; /* window scale factor */
u_int8_t flags; /* per direction options */ u_int8_t flags; /* per direction options */
}; };

View file

@ -22,6 +22,7 @@
#include <linux/netfilter/nfnetlink_conntrack.h> #include <linux/netfilter/nfnetlink_conntrack.h>
#include <net/netfilter/nf_conntrack.h> #include <net/netfilter/nf_conntrack.h>
#include <net/netfilter/nf_conntrack_l4proto.h> #include <net/netfilter/nf_conntrack_l4proto.h>
#include <net/netfilter/nf_conntrack_ecache.h>
#include <net/netfilter/nf_log.h> #include <net/netfilter/nf_log.h>
static DEFINE_RWLOCK(dccp_lock); static DEFINE_RWLOCK(dccp_lock);
@ -553,6 +554,9 @@ static int dccp_packet(struct nf_conn *ct, const struct sk_buff *skb,
ct->proto.dccp.state = new_state; ct->proto.dccp.state = new_state;
write_unlock_bh(&dccp_lock); write_unlock_bh(&dccp_lock);
if (new_state != old_state)
nf_conntrack_event_cache(IPCT_PROTOINFO, ct);
dn = dccp_pernet(net); dn = dccp_pernet(net);
nf_ct_refresh_acct(ct, ctinfo, skb, dn->dccp_timeout[new_state]); nf_ct_refresh_acct(ct, ctinfo, skb, dn->dccp_timeout[new_state]);

View file

@ -634,6 +634,14 @@ static bool tcp_in_window(const struct nf_conn *ct,
sender->td_end = end; sender->td_end = end;
sender->flags |= IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED; sender->flags |= IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED;
} }
if (tcph->ack) {
if (!(sender->flags & IP_CT_TCP_FLAG_MAXACK_SET)) {
sender->td_maxack = ack;
sender->flags |= IP_CT_TCP_FLAG_MAXACK_SET;
} else if (after(ack, sender->td_maxack))
sender->td_maxack = ack;
}
/* /*
* Update receiver data. * Update receiver data.
*/ */
@ -918,6 +926,16 @@ static int tcp_packet(struct nf_conn *ct,
"nf_ct_tcp: invalid state "); "nf_ct_tcp: invalid state ");
return -NF_ACCEPT; return -NF_ACCEPT;
case TCP_CONNTRACK_CLOSE: case TCP_CONNTRACK_CLOSE:
if (index == TCP_RST_SET
&& (ct->proto.tcp.seen[!dir].flags & IP_CT_TCP_FLAG_MAXACK_SET)
&& before(ntohl(th->seq), ct->proto.tcp.seen[!dir].td_maxack)) {
/* Invalid RST */
write_unlock_bh(&tcp_lock);
if (LOG_INVALID(net, IPPROTO_TCP))
nf_log_packet(pf, 0, skb, NULL, NULL, NULL,
"nf_ct_tcp: invalid RST ");
return -NF_ACCEPT;
}
if (index == TCP_RST_SET if (index == TCP_RST_SET
&& ((test_bit(IPS_SEEN_REPLY_BIT, &ct->status) && ((test_bit(IPS_SEEN_REPLY_BIT, &ct->status)
&& ct->proto.tcp.last_index == TCP_SYN_SET) && ct->proto.tcp.last_index == TCP_SYN_SET)

View file

@ -581,6 +581,12 @@ nfulnl_log_packet(u_int8_t pf,
+ nla_total_size(sizeof(struct nfulnl_msg_packet_hw)) + nla_total_size(sizeof(struct nfulnl_msg_packet_hw))
+ nla_total_size(sizeof(struct nfulnl_msg_packet_timestamp)); + nla_total_size(sizeof(struct nfulnl_msg_packet_timestamp));
if (in && skb_mac_header_was_set(skb)) {
size += nla_total_size(skb->dev->hard_header_len)
+ nla_total_size(sizeof(u_int16_t)) /* hwtype */
+ nla_total_size(sizeof(u_int16_t)); /* hwlen */
}
spin_lock_bh(&inst->lock); spin_lock_bh(&inst->lock);
if (inst->flags & NFULNL_CFG_F_SEQ) if (inst->flags & NFULNL_CFG_F_SEQ)

View file

@ -926,7 +926,7 @@ static int dl_seq_show(struct seq_file *s, void *v)
if (!hlist_empty(&htable->hash[*bucket])) { if (!hlist_empty(&htable->hash[*bucket])) {
hlist_for_each_entry(ent, pos, &htable->hash[*bucket], node) hlist_for_each_entry(ent, pos, &htable->hash[*bucket], node)
if (dl_seq_real_show(ent, htable->family, s)) if (dl_seq_real_show(ent, htable->family, s))
return 1; return -1;
} }
return 0; return 0;
} }

View file

@ -104,8 +104,7 @@ static int cls_cgroup_classify(struct sk_buff *skb, struct tcf_proto *tp,
struct tcf_result *res) struct tcf_result *res)
{ {
struct cls_cgroup_head *head = tp->root; struct cls_cgroup_head *head = tp->root;
struct cgroup_cls_state *cs; u32 classid;
int ret = 0;
/* /*
* Due to the nature of the classifier it is required to ignore all * Due to the nature of the classifier it is required to ignore all
@ -121,17 +120,18 @@ static int cls_cgroup_classify(struct sk_buff *skb, struct tcf_proto *tp,
return -1; return -1;
rcu_read_lock(); rcu_read_lock();
cs = task_cls_state(current); classid = task_cls_state(current)->classid;
if (cs->classid && tcf_em_tree_match(skb, &head->ematches, NULL)) {
res->classid = cs->classid;
res->class = 0;
ret = tcf_exts_exec(skb, &head->exts, res);
} else
ret = -1;
rcu_read_unlock(); rcu_read_unlock();
return ret; if (!classid)
return -1;
if (!tcf_em_tree_match(skb, &head->ematches, NULL))
return -1;
res->classid = classid;
res->class = 0;
return tcf_exts_exec(skb, &head->exts, res);
} }
static unsigned long cls_cgroup_get(struct tcf_proto *tp, u32 handle) static unsigned long cls_cgroup_get(struct tcf_proto *tp, u32 handle)