[linux-yocto] [PATCH 2/2] net: ptp: do not reimplement PTP/BPF classifier
Darren Hart
dvhart at linux.intel.com
Fri Sep 26 10:14:30 PDT 2014
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" <dvhart at linux.intel.com> wrote:
>From: Daniel Borkmann <dborkman at 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 <dborkman at redhat.com>
>Signed-off-by: Alexei Starovoitov <ast at plumgrid.com>
>Cc: Richard Cochran <richard.cochran at omicron.at>
>Cc: Jiri Benc <jbenc at redhat.com>
>Signed-off-by: David S. Miller <davem at 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 at yoctoproject.org
>https://lists.yoctoproject.org/listinfo/linux-yocto
>
--
Darren Hart Open Source Technology Center
darren.hart at intel.com Intel Corporation
More information about the linux-yocto
mailing list