Skip to content

Commit

Permalink
Merge branch 'ptp-is_sync'
Browse files Browse the repository at this point in the history
Kurt Kanzenbach says:

====================
ptp: Add generic is_sync() function

as multiple PHY drivers such as micrel or TI dp83640 need to inspect whether a
given skb represents a PTP Sync message, provide a generic function for it. This
avoids code duplication and can be reused by future PHY IEEE 1588 implementations.
====================

Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
davem330 committed Mar 7, 2022
2 parents 669b258 + 3914a9c commit cd0b627
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 24 deletions.
13 changes: 1 addition & 12 deletions drivers/net/phy/dp83640.c
Original file line number Diff line number Diff line change
Expand Up @@ -970,17 +970,6 @@ static void decode_status_frame(struct dp83640_private *dp83640,
}
}

static int is_sync(struct sk_buff *skb, int type)
{
struct ptp_header *hdr;

hdr = ptp_parse_header(skb, type);
if (!hdr)
return 0;

return ptp_get_msgtype(hdr, type) == PTP_MSGTYPE_SYNC;
}

static void dp83640_free_clocks(void)
{
struct dp83640_clock *clock;
Expand Down Expand Up @@ -1396,7 +1385,7 @@ static void dp83640_txtstamp(struct mii_timestamper *mii_ts,
switch (dp83640->hwts_tx_en) {

case HWTSTAMP_TX_ONESTEP_SYNC:
if (is_sync(skb, type)) {
if (ptp_msg_is_sync(skb, type)) {
kfree_skb(skb);
return;
}
Expand Down
13 changes: 1 addition & 12 deletions drivers/net/phy/micrel.c
Original file line number Diff line number Diff line change
Expand Up @@ -1976,25 +1976,14 @@ static int lan8814_hwtstamp(struct mii_timestamper *mii_ts, struct ifreq *ifr)
return copy_to_user(ifr->ifr_data, &config, sizeof(config)) ? -EFAULT : 0;
}

static bool is_sync(struct sk_buff *skb, int type)
{
struct ptp_header *hdr;

hdr = ptp_parse_header(skb, type);
if (!hdr)
return false;

return ((ptp_get_msgtype(hdr, type) & 0xf) == 0);
}

static void lan8814_txtstamp(struct mii_timestamper *mii_ts,
struct sk_buff *skb, int type)
{
struct kszphy_ptp_priv *ptp_priv = container_of(mii_ts, struct kszphy_ptp_priv, mii_ts);

switch (ptp_priv->hwts_tx_type) {
case HWTSTAMP_TX_ONESTEP_SYNC:
if (is_sync(skb, type)) {
if (ptp_msg_is_sync(skb, type)) {
kfree_skb(skb);
return;
}
Expand Down
15 changes: 15 additions & 0 deletions include/linux/ptp_classify.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,17 @@ static inline u8 ptp_get_msgtype(const struct ptp_header *hdr,
return msgtype;
}

/**
* ptp_msg_is_sync - Evaluates whether the given skb is a PTP Sync message
* @skb: packet buffer
* @type: type of the packet (see ptp_classify_raw())
*
* This function evaluates whether the given skb is a PTP Sync message.
*
* Return: true if sync message, false otherwise
*/
bool ptp_msg_is_sync(struct sk_buff *skb, unsigned int type);

void __init ptp_classifier_init(void);
#else
static inline void ptp_classifier_init(void)
Expand All @@ -148,5 +159,9 @@ static inline u8 ptp_get_msgtype(const struct ptp_header *hdr,
*/
return PTP_MSGTYPE_SYNC;
}
static inline bool ptp_msg_is_sync(struct sk_buff *skb, unsigned int type)
{
return false;
}
#endif
#endif /* _PTP_CLASSIFY_H_ */
12 changes: 12 additions & 0 deletions net/core/ptp_classifier.c
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,18 @@ struct ptp_header *ptp_parse_header(struct sk_buff *skb, unsigned int type)
}
EXPORT_SYMBOL_GPL(ptp_parse_header);

bool ptp_msg_is_sync(struct sk_buff *skb, unsigned int type)
{
struct ptp_header *hdr;

hdr = ptp_parse_header(skb, type);
if (!hdr)
return false;

return ptp_get_msgtype(hdr, type) == PTP_MSGTYPE_SYNC;
}
EXPORT_SYMBOL_GPL(ptp_msg_is_sync);

void __init ptp_classifier_init(void)
{
static struct sock_filter ptp_filter[] __initdata = {
Expand Down

0 comments on commit cd0b627

Please sign in to comment.