ASR_BASE

Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/package/kernel/mfp/files/fp_device.h b/package/kernel/mfp/files/fp_device.h
new file mode 100644
index 0000000..adef8ac
--- /dev/null
+++ b/package/kernel/mfp/files/fp_device.h
@@ -0,0 +1,123 @@
+#ifndef __FP_DEVICE_H__
+#define __FP_DEVICE_H__
+
+#define FP_DEV_MASK_GB6_SET		0
+#define FP_DEV_MASK_LL6_SET		1
+#define FP_DEV_MASK_MTU_SET		2
+
+struct fp_dev_list {
+	struct list_head devices_list;
+	spinlock_t list_lock;
+	wait_queue_head_t wq;
+	atomic_t dev_count;
+	struct workqueue_struct *dev_put_wq;
+};
+
+struct fp_dev_work {
+	struct list_head list;
+	struct fp_dev_list *fpdl;
+	struct delayed_work work;
+	struct fp_net_device *fpdev;
+};
+
+struct fp_net_device_stats {
+	unsigned long	rx_packets;
+	unsigned long	tx_packets;
+	unsigned long	rx_bytes;
+	unsigned long	tx_bytes;
+	unsigned long	rx_errors;
+	unsigned long	tx_errors;
+	unsigned long	rx_dropped;
+	unsigned long	tx_dropped;
+	unsigned long	queue_stopped;
+};
+
+struct fp_net_device {
+	struct kobject kobj;
+	struct rcu_head rcu;
+	struct list_head list;
+	struct work_struct free_work;
+	struct net_device *dev; /* associated net_device */
+	struct net_device *br; /* bridge to which this device is attached */
+	atomic_t refcnt;
+	unsigned long flags;
+	bool forward;	/* fastpath forwarding enabled/disabled */
+	struct fp_net_device_stats stats;
+	struct in6_addr ll6addr;
+	struct in6_addr gb6addr;
+	u8 prefixlen;
+	u32 mtu;
+};
+
+int fpdev_add_if(struct net_device *dev);
+int fpdev_del_if(struct net_device *dev);
+struct fp_net_device *fpdev_get_if(struct net_device *dev);
+struct fp_net_device *fpdev_get_ccinet(void);
+void destroy_fpdev_rcu(struct rcu_head *rcu);
+
+static inline int fpdev_cmp_if(struct fp_net_device *fdev, struct net_device *dev)
+{
+	return (fdev->dev == dev);
+}
+
+/* increment reference to a fastpath device */
+static inline struct fp_net_device *fpdev_hold(struct fp_net_device *fpdev)
+{
+	if (fpdev && !atomic_inc_not_zero(&fpdev->refcnt))
+		return NULL;
+	return fpdev;
+}
+
+/* decrement reference to a fastpath device */
+static inline void fpdev_put(struct fp_net_device *fpdev)
+{
+	if (fpdev && atomic_dec_and_test(&fpdev->refcnt))
+		call_rcu(&fpdev->rcu, destroy_fpdev_rcu);
+}
+
+static inline void fpdev_set_gb6(struct fp_net_device *fpdev)
+{
+	set_bit(FP_DEV_MASK_GB6_SET, &fpdev->flags);
+}
+
+static inline int fpdev_is_gb6_set(struct fp_net_device *fpdev)
+{
+	return test_bit(FP_DEV_MASK_GB6_SET, &fpdev->flags);
+}
+
+static inline void fpdev_clear_gb6(struct fp_net_device *fpdev)
+{
+	clear_bit(FP_DEV_MASK_GB6_SET, &fpdev->flags);
+}
+
+static inline void fpdev_set_ll6(struct fp_net_device *fpdev)
+{
+	set_bit(FP_DEV_MASK_LL6_SET, &fpdev->flags);
+}
+
+static inline int fpdev_is_ll6_set(struct fp_net_device *fpdev)
+{
+	return test_bit(FP_DEV_MASK_LL6_SET, &fpdev->flags);
+}
+
+static inline void fpdev_clear_mtu(struct fp_net_device *fpdev)
+{
+	clear_bit(FP_DEV_MASK_MTU_SET, &fpdev->flags);
+}
+
+static inline void fpdev_set_mtu(struct fp_net_device *fpdev)
+{
+	set_bit(FP_DEV_MASK_MTU_SET, &fpdev->flags);
+}
+
+static inline int fpdev_is_mtu_set(struct fp_net_device *fpdev)
+{
+	return test_bit(FP_DEV_MASK_MTU_SET, &fpdev->flags);
+}
+
+static inline void fpdev_clear_ll6(struct fp_net_device *fpdev)
+{
+	clear_bit(FP_DEV_MASK_LL6_SET, &fpdev->flags);
+}
+
+#endif