1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */
2*4dc78e53SAndroid Build Coastguard Worker /*
3*4dc78e53SAndroid Build Coastguard Worker * Copyright (c) 2003-2006 Thomas Graf <[email protected]>
4*4dc78e53SAndroid Build Coastguard Worker */
5*4dc78e53SAndroid Build Coastguard Worker
6*4dc78e53SAndroid Build Coastguard Worker #ifndef NETLINK_LIST_H_
7*4dc78e53SAndroid Build Coastguard Worker #define NETLINK_LIST_H_
8*4dc78e53SAndroid Build Coastguard Worker
9*4dc78e53SAndroid Build Coastguard Worker #include <stddef.h>
10*4dc78e53SAndroid Build Coastguard Worker
11*4dc78e53SAndroid Build Coastguard Worker #ifdef __cplusplus
12*4dc78e53SAndroid Build Coastguard Worker extern "C" {
13*4dc78e53SAndroid Build Coastguard Worker #endif
14*4dc78e53SAndroid Build Coastguard Worker
15*4dc78e53SAndroid Build Coastguard Worker struct nl_list_head
16*4dc78e53SAndroid Build Coastguard Worker {
17*4dc78e53SAndroid Build Coastguard Worker struct nl_list_head * next;
18*4dc78e53SAndroid Build Coastguard Worker struct nl_list_head * prev;
19*4dc78e53SAndroid Build Coastguard Worker };
20*4dc78e53SAndroid Build Coastguard Worker
NL_INIT_LIST_HEAD(struct nl_list_head * list)21*4dc78e53SAndroid Build Coastguard Worker static inline void NL_INIT_LIST_HEAD(struct nl_list_head *list)
22*4dc78e53SAndroid Build Coastguard Worker {
23*4dc78e53SAndroid Build Coastguard Worker list->next = list;
24*4dc78e53SAndroid Build Coastguard Worker list->prev = list;
25*4dc78e53SAndroid Build Coastguard Worker }
26*4dc78e53SAndroid Build Coastguard Worker
__nl_list_add(struct nl_list_head * obj,struct nl_list_head * prev,struct nl_list_head * next)27*4dc78e53SAndroid Build Coastguard Worker static inline void __nl_list_add(struct nl_list_head *obj,
28*4dc78e53SAndroid Build Coastguard Worker struct nl_list_head *prev,
29*4dc78e53SAndroid Build Coastguard Worker struct nl_list_head *next)
30*4dc78e53SAndroid Build Coastguard Worker {
31*4dc78e53SAndroid Build Coastguard Worker prev->next = obj;
32*4dc78e53SAndroid Build Coastguard Worker obj->prev = prev;
33*4dc78e53SAndroid Build Coastguard Worker next->prev = obj;
34*4dc78e53SAndroid Build Coastguard Worker obj->next = next;
35*4dc78e53SAndroid Build Coastguard Worker }
36*4dc78e53SAndroid Build Coastguard Worker
nl_list_add_tail(struct nl_list_head * obj,struct nl_list_head * head)37*4dc78e53SAndroid Build Coastguard Worker static inline void nl_list_add_tail(struct nl_list_head *obj,
38*4dc78e53SAndroid Build Coastguard Worker struct nl_list_head *head)
39*4dc78e53SAndroid Build Coastguard Worker {
40*4dc78e53SAndroid Build Coastguard Worker __nl_list_add(obj, head->prev, head);
41*4dc78e53SAndroid Build Coastguard Worker }
42*4dc78e53SAndroid Build Coastguard Worker
nl_list_add_head(struct nl_list_head * obj,struct nl_list_head * head)43*4dc78e53SAndroid Build Coastguard Worker static inline void nl_list_add_head(struct nl_list_head *obj,
44*4dc78e53SAndroid Build Coastguard Worker struct nl_list_head *head)
45*4dc78e53SAndroid Build Coastguard Worker {
46*4dc78e53SAndroid Build Coastguard Worker __nl_list_add(obj, head, head->next);
47*4dc78e53SAndroid Build Coastguard Worker }
48*4dc78e53SAndroid Build Coastguard Worker
nl_list_del(struct nl_list_head * obj)49*4dc78e53SAndroid Build Coastguard Worker static inline void nl_list_del(struct nl_list_head *obj)
50*4dc78e53SAndroid Build Coastguard Worker {
51*4dc78e53SAndroid Build Coastguard Worker obj->next->prev = obj->prev;
52*4dc78e53SAndroid Build Coastguard Worker obj->prev->next = obj->next;
53*4dc78e53SAndroid Build Coastguard Worker }
54*4dc78e53SAndroid Build Coastguard Worker
nl_list_empty(struct nl_list_head * head)55*4dc78e53SAndroid Build Coastguard Worker static inline int nl_list_empty(struct nl_list_head *head)
56*4dc78e53SAndroid Build Coastguard Worker {
57*4dc78e53SAndroid Build Coastguard Worker return head->next == head;
58*4dc78e53SAndroid Build Coastguard Worker }
59*4dc78e53SAndroid Build Coastguard Worker
60*4dc78e53SAndroid Build Coastguard Worker #define nl_container_of(ptr, type, member) ({ \
61*4dc78e53SAndroid Build Coastguard Worker const __typeof__( ((type *)0)->member ) *__mptr = (ptr);\
62*4dc78e53SAndroid Build Coastguard Worker (type *)( (char *)__mptr - (offsetof(type, member)));})
63*4dc78e53SAndroid Build Coastguard Worker
64*4dc78e53SAndroid Build Coastguard Worker #define nl_list_entry(ptr, type, member) \
65*4dc78e53SAndroid Build Coastguard Worker nl_container_of(ptr, type, member)
66*4dc78e53SAndroid Build Coastguard Worker
67*4dc78e53SAndroid Build Coastguard Worker #define nl_list_at_tail(pos, head, member) \
68*4dc78e53SAndroid Build Coastguard Worker ((pos)->member.next == (head))
69*4dc78e53SAndroid Build Coastguard Worker
70*4dc78e53SAndroid Build Coastguard Worker #define nl_list_at_head(pos, head, member) \
71*4dc78e53SAndroid Build Coastguard Worker ((pos)->member.prev == (head))
72*4dc78e53SAndroid Build Coastguard Worker
73*4dc78e53SAndroid Build Coastguard Worker #define NL_LIST_HEAD(name) \
74*4dc78e53SAndroid Build Coastguard Worker struct nl_list_head name = { &(name), &(name) }
75*4dc78e53SAndroid Build Coastguard Worker
76*4dc78e53SAndroid Build Coastguard Worker #define nl_list_first_entry(head, type, member) \
77*4dc78e53SAndroid Build Coastguard Worker nl_list_entry((head)->next, type, member)
78*4dc78e53SAndroid Build Coastguard Worker
79*4dc78e53SAndroid Build Coastguard Worker #define nl_list_for_each_entry(pos, head, member) \
80*4dc78e53SAndroid Build Coastguard Worker for (pos = nl_list_entry((head)->next, __typeof__(*pos), member); \
81*4dc78e53SAndroid Build Coastguard Worker &(pos)->member != (head); \
82*4dc78e53SAndroid Build Coastguard Worker (pos) = nl_list_entry((pos)->member.next, __typeof__(*(pos)), member))
83*4dc78e53SAndroid Build Coastguard Worker
84*4dc78e53SAndroid Build Coastguard Worker #define nl_list_for_each_entry_safe(pos, n, head, member) \
85*4dc78e53SAndroid Build Coastguard Worker for (pos = nl_list_entry((head)->next, __typeof__(*pos), member), \
86*4dc78e53SAndroid Build Coastguard Worker n = nl_list_entry(pos->member.next, __typeof__(*pos), member); \
87*4dc78e53SAndroid Build Coastguard Worker &(pos)->member != (head); \
88*4dc78e53SAndroid Build Coastguard Worker pos = n, n = nl_list_entry(n->member.next, __typeof__(*n), member))
89*4dc78e53SAndroid Build Coastguard Worker
90*4dc78e53SAndroid Build Coastguard Worker #define nl_init_list_head(head) \
91*4dc78e53SAndroid Build Coastguard Worker do { (head)->next = (head); (head)->prev = (head); } while (0)
92*4dc78e53SAndroid Build Coastguard Worker
93*4dc78e53SAndroid Build Coastguard Worker #ifdef __cplusplus
94*4dc78e53SAndroid Build Coastguard Worker }
95*4dc78e53SAndroid Build Coastguard Worker #endif
96*4dc78e53SAndroid Build Coastguard Worker
97*4dc78e53SAndroid Build Coastguard Worker #endif
98