I accidentally included the original CC'd people, please do not reply to this with them on Cc. Use this message to reply-all. Apologies. Git sendmail screw up.
On 9/26/14, 10:07, "Darren Hart" <dvh...@linux.intel.com> wrote: >From: Daniel Borkmann <dbork...@redhat.com> > >There are currently pch_gbe, cpts, and ixp4xx_eth drivers that open-code >and reimplement a BPF classifier for the PTP protocol. Since all of them >effectively do the very same thing and load the very same PTP/BPF filter, >we can just consolidate that code by introducing ptp_classify_raw() in >the time-stamping core framework which can be used in drivers. > >As drivers get initialized after bootstrapping the core networking >subsystem, they can make use of ptp_insns wrapped through >ptp_classify_raw(), which allows to simplify and remove PTP classifier >setup code in drivers. > >Joint work with Alexei Starovoitov. > >Signed-off-by: Daniel Borkmann <dbork...@redhat.com> >Signed-off-by: Alexei Starovoitov <a...@plumgrid.com> >Cc: Richard Cochran <richard.coch...@omicron.at> >Cc: Jiri Benc <jb...@redhat.com> >Signed-off-by: David S. Miller <da...@davemloft.net> >(cherry picked from commit 164d8c6665213c931645578310256da7b1259331) >--- > drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c | 11 +---------- > drivers/net/ethernet/ti/cpts.c | 10 +--------- > drivers/net/ethernet/xscale/ixp4xx_eth.c | 11 +---------- > include/linux/ptp_classify.h | 10 ++-------- > net/core/timestamping.c | 8 +++++++- > 5 files changed, 12 insertions(+), 38 deletions(-) > >diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c >b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c >index 464e910..73e6683 100644 >--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c >+++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c >@@ -120,10 +120,6 @@ static void pch_gbe_mdio_write(struct net_device >*netdev, int addr, int reg, > int data); > static void pch_gbe_set_multi(struct net_device *netdev); > >-static struct sock_filter ptp_filter[] = { >- PTP_FILTER >-}; >- > static int pch_ptp_match(struct sk_buff *skb, u16 uid_hi, u32 uid_lo, >u16 seqid) > { > u8 *data = skb->data; >@@ -131,7 +127,7 @@ static int pch_ptp_match(struct sk_buff *skb, u16 >uid_hi, u32 uid_lo, u16 seqid) > u16 *hi, *id; > u32 lo; > >- if (sk_run_filter(skb, ptp_filter) == PTP_CLASS_NONE) >+ if (ptp_classify_raw(skb) == PTP_CLASS_NONE) > return 0; > > offset = ETH_HLEN + IPV4_HLEN(data) + UDP_HLEN; >@@ -2635,11 +2631,6 @@ static int pch_gbe_probe(struct pci_dev *pdev, > > adapter->ptp_pdev = pci_get_bus_and_slot(adapter->pdev->bus->number, > PCI_DEVFN(12, 4)); >- if (ptp_filter_init(ptp_filter, ARRAY_SIZE(ptp_filter))) { >- dev_err(&pdev->dev, "Bad ptp filter\n"); >- ret = -EINVAL; >- goto err_free_netdev; >- } > > netdev->netdev_ops = &pch_gbe_netdev_ops; > netdev->watchdog_timeo = PCH_GBE_WATCHDOG_PERIOD; >diff --git a/drivers/net/ethernet/ti/cpts.c >b/drivers/net/ethernet/ti/cpts.c >index 8c351f1..fd31546 100644 >--- a/drivers/net/ethernet/ti/cpts.c >+++ b/drivers/net/ethernet/ti/cpts.c >@@ -31,10 +31,6 @@ > > #ifdef CONFIG_TI_CPTS > >-static struct sock_filter ptp_filter[] = { >- PTP_FILTER >-}; >- > #define cpts_read32(c, r) __raw_readl(&c->reg->r) > #define cpts_write32(c, v, r) __raw_writel(v, &c->reg->r) > >@@ -300,7 +296,7 @@ static u64 cpts_find_ts(struct cpts *cpts, struct >sk_buff *skb, int ev_type) > u64 ns = 0; > struct cpts_event *event; > struct list_head *this, *next; >- unsigned int class = sk_run_filter(skb, ptp_filter); >+ unsigned int class = ptp_classify_raw(skb); > unsigned long flags; > u16 seqid; > u8 mtype; >@@ -371,10 +367,6 @@ int cpts_register(struct device *dev, struct cpts >*cpts, > int err, i; > unsigned long flags; > >- if (ptp_filter_init(ptp_filter, ARRAY_SIZE(ptp_filter))) { >- pr_err("cpts: bad ptp filter\n"); >- return -EINVAL; >- } > cpts->info = cpts_info; > cpts->clock = ptp_clock_register(&cpts->info, dev); > if (IS_ERR(cpts->clock)) { >diff --git a/drivers/net/ethernet/xscale/ixp4xx_eth.c >b/drivers/net/ethernet/xscale/ixp4xx_eth.c >index 25283f1..f7e0f0f 100644 >--- a/drivers/net/ethernet/xscale/ixp4xx_eth.c >+++ b/drivers/net/ethernet/xscale/ixp4xx_eth.c >@@ -256,10 +256,6 @@ static int ports_open; > static struct port *npe_port_tab[MAX_NPES]; > static struct dma_pool *dma_pool; > >-static struct sock_filter ptp_filter[] = { >- PTP_FILTER >-}; >- > static int ixp_ptp_match(struct sk_buff *skb, u16 uid_hi, u32 uid_lo, >u16 seqid) > { > u8 *data = skb->data; >@@ -267,7 +263,7 @@ static int ixp_ptp_match(struct sk_buff *skb, u16 >uid_hi, u32 uid_lo, u16 seqid) > u16 *hi, *id; > u32 lo; > >- if (sk_run_filter(skb, ptp_filter) != PTP_CLASS_V1_IPV4) >+ if (ptp_classify_raw(skb) != PTP_CLASS_V1_IPV4) > return 0; > > offset = ETH_HLEN + IPV4_HLEN(data) + UDP_HLEN; >@@ -1413,11 +1409,6 @@ static int eth_init_one(struct platform_device >*pdev) > char phy_id[MII_BUS_ID_SIZE + 3]; > int err; > >- if (ptp_filter_init(ptp_filter, ARRAY_SIZE(ptp_filter))) { >- pr_err("ixp4xx_eth: bad ptp filter\n"); >- return -EINVAL; >- } >- > if (!(dev = alloc_etherdev(sizeof(struct port)))) > return -ENOMEM; > >diff --git a/include/linux/ptp_classify.h b/include/linux/ptp_classify.h >index 3decfa4..6d3b0a2 100644 >--- a/include/linux/ptp_classify.h >+++ b/include/linux/ptp_classify.h >@@ -80,14 +80,6 @@ > #define OP_RETA (BPF_RET | BPF_A) > #define OP_RETK (BPF_RET | BPF_K) > >-static inline int ptp_filter_init(struct sock_filter *f, int len) >-{ >- if (OP_LDH == f[0].code) >- return sk_chk_filter(f, len); >- else >- return 0; >-} >- > #define PTP_FILTER \ > {OP_LDH, 0, 0, OFF_ETYPE }, /* */ \ > {OP_JEQ, 0, 12, ETH_P_IP }, /* f goto L20 */ \ >@@ -133,4 +125,6 @@ static inline int ptp_filter_init(struct sock_filter >*f, int len) > {OP_RETA, 0, 0, 0 }, /* */ \ > /*L6x*/ {OP_RETK, 0, 0, PTP_CLASS_NONE }, > >+unsigned int ptp_classify_raw(const struct sk_buff *skb); >+ > #endif >diff --git a/net/core/timestamping.c b/net/core/timestamping.c >index e43d56a..9ff26b3 100644 >--- a/net/core/timestamping.c >+++ b/net/core/timestamping.c >@@ -25,11 +25,17 @@ > > static struct sk_filter *ptp_insns __read_mostly; > >+unsigned int ptp_classify_raw(const struct sk_buff *skb) >+{ >+ return SK_RUN_FILTER(ptp_insns, skb); >+} >+EXPORT_SYMBOL_GPL(ptp_classify_raw); >+ > static unsigned int classify(const struct sk_buff *skb) > { > if (likely(skb->dev && skb->dev->phydev && > skb->dev->phydev->drv)) >- return SK_RUN_FILTER(ptp_insns, skb); >+ return ptp_classify_raw(skb); > else > return PTP_CLASS_NONE; > } >-- >2.1.0 > >-- >_______________________________________________ >linux-yocto mailing list >linux-yocto@yoctoproject.org >https://lists.yoctoproject.org/listinfo/linux-yocto > -- Darren Hart Open Source Technology Center darren.h...@intel.com Intel Corporation -- _______________________________________________ linux-yocto mailing list linux-yocto@yoctoproject.org https://lists.yoctoproject.org/listinfo/linux-yocto