]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - include/linux/ptp_classify.h
percpu: add preemption checks to __this_cpu ops
[karo-tx-linux.git] / include / linux / ptp_classify.h
index 1dc420ba213a52624920184c620441516270c6bf..7dfed71d76a6e9823b75a5b47f353543a234cd36 100644 (file)
 #ifndef _PTP_CLASSIFY_H_
 #define _PTP_CLASSIFY_H_
 
-#include <linux/if_ether.h>
-#include <linux/if_vlan.h>
 #include <linux/ip.h>
-#include <linux/filter.h>
-#ifdef __KERNEL__
-#include <linux/in.h>
-#else
-#include <netinet/in.h>
-#endif
+#include <linux/skbuff.h>
 
 #define PTP_CLASS_NONE  0x00 /* not a PTP event message */
 #define PTP_CLASS_V1    0x01 /* protocol version 1 */
@@ -44,7 +37,7 @@
 #define PTP_CLASS_PMASK 0xf0 /* mask for the packet type field */
 
 #define PTP_CLASS_V1_IPV4 (PTP_CLASS_V1 | PTP_CLASS_IPV4)
-#define PTP_CLASS_V1_IPV6 (PTP_CLASS_V1 | PTP_CLASS_IPV6) /*probably DNE*/
+#define PTP_CLASS_V1_IPV6 (PTP_CLASS_V1 | PTP_CLASS_IPV6) /* probably DNE */
 #define PTP_CLASS_V2_IPV4 (PTP_CLASS_V2 | PTP_CLASS_IPV4)
 #define PTP_CLASS_V2_IPV6 (PTP_CLASS_V2 | PTP_CLASS_IPV6)
 #define PTP_CLASS_V2_L2   (PTP_CLASS_V2 | PTP_CLASS_L2)
 #define PTP_EV_PORT 319
 #define PTP_GEN_BIT 0x08 /* indicates general message, if set in message type */
 
-#define OFF_ETYPE      12
-#define OFF_IHL                14
-#define OFF_FRAG       20
-#define OFF_PROTO4     23
-#define OFF_NEXT       6
-#define OFF_UDP_DST    2
-
 #define OFF_PTP_SOURCE_UUID    22 /* PTPv1 only */
 #define OFF_PTP_SEQUENCE_ID    30
 #define OFF_PTP_CONTROL                32 /* PTPv1 only */
 
-#define IPV4_HLEN(data) (((struct iphdr *)(data + OFF_IHL))->ihl << 2)
-
+/* Below defines should actually be removed at some point in time. */
 #define IP6_HLEN       40
 #define UDP_HLEN       8
-
-#define RELOFF_DST4    (ETH_HLEN + OFF_UDP_DST)
-#define OFF_DST6       (ETH_HLEN + IP6_HLEN + OFF_UDP_DST)
+#define OFF_IHL                14
 #define OFF_PTP6       (ETH_HLEN + IP6_HLEN + UDP_HLEN)
+#define IPV4_HLEN(data) (((struct iphdr *)(data + OFF_IHL))->ihl << 2)
 
-#define OP_AND (BPF_ALU | BPF_AND  | BPF_K)
-#define OP_JEQ (BPF_JMP | BPF_JEQ  | BPF_K)
-#define OP_JSET        (BPF_JMP | BPF_JSET | BPF_K)
-#define OP_LDB (BPF_LD  | BPF_B    | BPF_ABS)
-#define OP_LDH (BPF_LD  | BPF_H    | BPF_ABS)
-#define OP_LDHI        (BPF_LD  | BPF_H    | BPF_IND)
-#define OP_LDX (BPF_LDX | BPF_B    | BPF_MSH)
-#define OP_OR  (BPF_ALU | BPF_OR   | BPF_K)
-#define OP_RETA        (BPF_RET | BPF_A)
-#define OP_RETK        (BPF_RET | BPF_K)
+#if defined(CONFIG_NET_PTP_CLASSIFY)
+/**
+ * ptp_classify_raw - classify a PTP packet
+ * @skb: buffer
+ *
+ * Runs a minimal BPF dissector to classify a network packet to
+ * determine the PTP class. In case the skb does not contain any
+ * PTP protocol data, PTP_CLASS_NONE will be returned, otherwise
+ * PTP_CLASS_V1_IPV{4,6}, PTP_CLASS_V2_IPV{4,6} or
+ * PTP_CLASS_V2_{L2,VLAN}, depending on the packet content.
+ */
+unsigned int ptp_classify_raw(const struct sk_buff *skb);
 
-static inline int ptp_filter_init(struct sock_filter *f, int len)
+void __init ptp_classifier_init(void);
+#else
+static inline void ptp_classifier_init(void)
 {
-       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   */ \
-       {OP_LDB,        0,   0, OFF_PROTO4              }, /*              */ \
-       {OP_JEQ,        0,   9, IPPROTO_UDP             }, /* f goto L10   */ \
-       {OP_LDH,        0,   0, OFF_FRAG                }, /*              */ \
-       {OP_JSET,       7,   0, 0x1fff                  }, /* t goto L11   */ \
-       {OP_LDX,        0,   0, OFF_IHL                 }, /*              */ \
-       {OP_LDHI,       0,   0, RELOFF_DST4             }, /*              */ \
-       {OP_JEQ,        0,   4, PTP_EV_PORT             }, /* f goto L12   */ \
-       {OP_LDHI,       0,   0, ETH_HLEN + UDP_HLEN     }, /*              */ \
-       {OP_AND,        0,   0, PTP_CLASS_VMASK         }, /*              */ \
-       {OP_OR,         0,   0, PTP_CLASS_IPV4          }, /*              */ \
-       {OP_RETA,       0,   0, 0                       }, /*              */ \
-/*L1x*/        {OP_RETK,       0,   0, PTP_CLASS_NONE          }, /*              */ \
-/*L20*/        {OP_JEQ,        0,   9, ETH_P_IPV6              }, /* f goto L40   */ \
-       {OP_LDB,        0,   0, ETH_HLEN + OFF_NEXT     }, /*              */ \
-       {OP_JEQ,        0,   6, IPPROTO_UDP             }, /* f goto L30   */ \
-       {OP_LDH,        0,   0, OFF_DST6                }, /*              */ \
-       {OP_JEQ,        0,   4, PTP_EV_PORT             }, /* f goto L31   */ \
-       {OP_LDH,        0,   0, OFF_PTP6                }, /*              */ \
-       {OP_AND,        0,   0, PTP_CLASS_VMASK         }, /*              */ \
-       {OP_OR,         0,   0, PTP_CLASS_IPV6          }, /*              */ \
-       {OP_RETA,       0,   0, 0                       }, /*              */ \
-/*L3x*/        {OP_RETK,       0,   0, PTP_CLASS_NONE          }, /*              */ \
-/*L40*/        {OP_JEQ,        0,   9, ETH_P_8021Q             }, /* f goto L50   */ \
-       {OP_LDH,        0,   0, OFF_ETYPE + 4           }, /*              */ \
-       {OP_JEQ,        0,  15, ETH_P_1588              }, /* f goto L60   */ \
-       {OP_LDB,        0,   0, ETH_HLEN + VLAN_HLEN    }, /*              */ \
-       {OP_AND,        0,   0, PTP_GEN_BIT             }, /*              */ \
-       {OP_JEQ,        0,  12, 0                       }, /* f goto L6x   */ \
-       {OP_LDH,        0,   0, ETH_HLEN + VLAN_HLEN    }, /*              */ \
-       {OP_AND,        0,   0, PTP_CLASS_VMASK         }, /*              */ \
-       {OP_OR,         0,   0, PTP_CLASS_VLAN          }, /*              */ \
-       {OP_RETA,       0,   0, 0                       }, /*              */ \
-/*L50*/        {OP_JEQ,        0,   7, ETH_P_1588              }, /* f goto L61   */ \
-       {OP_LDB,        0,   0, ETH_HLEN                }, /*              */ \
-       {OP_AND,        0,   0, PTP_GEN_BIT             }, /*              */ \
-       {OP_JEQ,        0,   4, 0                       }, /* f goto L6x   */ \
-       {OP_LDH,        0,   0, ETH_HLEN                }, /*              */ \
-       {OP_AND,        0,   0, PTP_CLASS_VMASK         }, /*              */ \
-       {OP_OR,         0,   0, PTP_CLASS_L2            }, /*              */ \
-       {OP_RETA,       0,   0, 0                       }, /*              */ \
-/*L6x*/        {OP_RETK,       0,   0, PTP_CLASS_NONE          },
-
 #endif
+#endif /* _PTP_CLASSIFY_H_ */