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

Reply via email to