blob: adef8acd85d33993d7797b17989a9419d5b5c64f [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001#ifndef __FP_DEVICE_H__
2#define __FP_DEVICE_H__
3
4#define FP_DEV_MASK_GB6_SET 0
5#define FP_DEV_MASK_LL6_SET 1
6#define FP_DEV_MASK_MTU_SET 2
7
8struct fp_dev_list {
9 struct list_head devices_list;
10 spinlock_t list_lock;
11 wait_queue_head_t wq;
12 atomic_t dev_count;
13 struct workqueue_struct *dev_put_wq;
14};
15
16struct fp_dev_work {
17 struct list_head list;
18 struct fp_dev_list *fpdl;
19 struct delayed_work work;
20 struct fp_net_device *fpdev;
21};
22
23struct fp_net_device_stats {
24 unsigned long rx_packets;
25 unsigned long tx_packets;
26 unsigned long rx_bytes;
27 unsigned long tx_bytes;
28 unsigned long rx_errors;
29 unsigned long tx_errors;
30 unsigned long rx_dropped;
31 unsigned long tx_dropped;
32 unsigned long queue_stopped;
33};
34
35struct fp_net_device {
36 struct kobject kobj;
37 struct rcu_head rcu;
38 struct list_head list;
39 struct work_struct free_work;
40 struct net_device *dev; /* associated net_device */
41 struct net_device *br; /* bridge to which this device is attached */
42 atomic_t refcnt;
43 unsigned long flags;
44 bool forward; /* fastpath forwarding enabled/disabled */
45 struct fp_net_device_stats stats;
46 struct in6_addr ll6addr;
47 struct in6_addr gb6addr;
48 u8 prefixlen;
49 u32 mtu;
50};
51
52int fpdev_add_if(struct net_device *dev);
53int fpdev_del_if(struct net_device *dev);
54struct fp_net_device *fpdev_get_if(struct net_device *dev);
55struct fp_net_device *fpdev_get_ccinet(void);
56void destroy_fpdev_rcu(struct rcu_head *rcu);
57
58static inline int fpdev_cmp_if(struct fp_net_device *fdev, struct net_device *dev)
59{
60 return (fdev->dev == dev);
61}
62
63/* increment reference to a fastpath device */
64static inline struct fp_net_device *fpdev_hold(struct fp_net_device *fpdev)
65{
66 if (fpdev && !atomic_inc_not_zero(&fpdev->refcnt))
67 return NULL;
68 return fpdev;
69}
70
71/* decrement reference to a fastpath device */
72static inline void fpdev_put(struct fp_net_device *fpdev)
73{
74 if (fpdev && atomic_dec_and_test(&fpdev->refcnt))
75 call_rcu(&fpdev->rcu, destroy_fpdev_rcu);
76}
77
78static inline void fpdev_set_gb6(struct fp_net_device *fpdev)
79{
80 set_bit(FP_DEV_MASK_GB6_SET, &fpdev->flags);
81}
82
83static inline int fpdev_is_gb6_set(struct fp_net_device *fpdev)
84{
85 return test_bit(FP_DEV_MASK_GB6_SET, &fpdev->flags);
86}
87
88static inline void fpdev_clear_gb6(struct fp_net_device *fpdev)
89{
90 clear_bit(FP_DEV_MASK_GB6_SET, &fpdev->flags);
91}
92
93static inline void fpdev_set_ll6(struct fp_net_device *fpdev)
94{
95 set_bit(FP_DEV_MASK_LL6_SET, &fpdev->flags);
96}
97
98static inline int fpdev_is_ll6_set(struct fp_net_device *fpdev)
99{
100 return test_bit(FP_DEV_MASK_LL6_SET, &fpdev->flags);
101}
102
103static inline void fpdev_clear_mtu(struct fp_net_device *fpdev)
104{
105 clear_bit(FP_DEV_MASK_MTU_SET, &fpdev->flags);
106}
107
108static inline void fpdev_set_mtu(struct fp_net_device *fpdev)
109{
110 set_bit(FP_DEV_MASK_MTU_SET, &fpdev->flags);
111}
112
113static inline int fpdev_is_mtu_set(struct fp_net_device *fpdev)
114{
115 return test_bit(FP_DEV_MASK_MTU_SET, &fpdev->flags);
116}
117
118static inline void fpdev_clear_ll6(struct fp_net_device *fpdev)
119{
120 clear_bit(FP_DEV_MASK_LL6_SET, &fpdev->flags);
121}
122
123#endif