diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/xfrm.h | 3 | ||||
-rw-r--r-- | include/net/xfrm.h | 52 |
2 files changed, 52 insertions, 3 deletions
diff --git a/include/linux/xfrm.h b/include/linux/xfrm.h index e31b8c84f2c9..0c82c80b277f 100644 --- a/include/linux/xfrm.h +++ b/include/linux/xfrm.h | |||
@@ -113,7 +113,8 @@ enum | |||
113 | { | 113 | { |
114 | XFRM_POLICY_TYPE_MAIN = 0, | 114 | XFRM_POLICY_TYPE_MAIN = 0, |
115 | XFRM_POLICY_TYPE_SUB = 1, | 115 | XFRM_POLICY_TYPE_SUB = 1, |
116 | XFRM_POLICY_TYPE_MAX = 2 | 116 | XFRM_POLICY_TYPE_MAX = 2, |
117 | XFRM_POLICY_TYPE_ANY = 255 | ||
117 | }; | 118 | }; |
118 | 119 | ||
119 | enum | 120 | enum |
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index eea7785cc757..9b6205665190 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
@@ -121,6 +121,7 @@ extern struct mutex xfrm_cfg_mutex; | |||
121 | struct xfrm_state | 121 | struct xfrm_state |
122 | { | 122 | { |
123 | /* Note: bydst is re-used during gc */ | 123 | /* Note: bydst is re-used during gc */ |
124 | struct list_head all; | ||
124 | struct hlist_node bydst; | 125 | struct hlist_node bydst; |
125 | struct hlist_node bysrc; | 126 | struct hlist_node bysrc; |
126 | struct hlist_node byspi; | 127 | struct hlist_node byspi; |
@@ -424,6 +425,7 @@ struct xfrm_tmpl | |||
424 | struct xfrm_policy | 425 | struct xfrm_policy |
425 | { | 426 | { |
426 | struct xfrm_policy *next; | 427 | struct xfrm_policy *next; |
428 | struct list_head bytype; | ||
427 | struct hlist_node bydst; | 429 | struct hlist_node bydst; |
428 | struct hlist_node byidx; | 430 | struct hlist_node byidx; |
429 | 431 | ||
@@ -1160,6 +1162,18 @@ struct xfrm6_tunnel { | |||
1160 | int priority; | 1162 | int priority; |
1161 | }; | 1163 | }; |
1162 | 1164 | ||
1165 | struct xfrm_state_walk { | ||
1166 | struct xfrm_state *state; | ||
1167 | int count; | ||
1168 | u8 proto; | ||
1169 | }; | ||
1170 | |||
1171 | struct xfrm_policy_walk { | ||
1172 | struct xfrm_policy *policy; | ||
1173 | int count; | ||
1174 | u8 type, cur_type; | ||
1175 | }; | ||
1176 | |||
1163 | extern void xfrm_init(void); | 1177 | extern void xfrm_init(void); |
1164 | extern void xfrm4_init(void); | 1178 | extern void xfrm4_init(void); |
1165 | extern void xfrm_state_init(void); | 1179 | extern void xfrm_state_init(void); |
@@ -1184,7 +1198,23 @@ static inline void xfrm6_fini(void) | |||
1184 | extern int xfrm_proc_init(void); | 1198 | extern int xfrm_proc_init(void); |
1185 | #endif | 1199 | #endif |
1186 | 1200 | ||
1187 | extern int xfrm_state_walk(u8 proto, int (*func)(struct xfrm_state *, int, void*), void *); | 1201 | static inline void xfrm_state_walk_init(struct xfrm_state_walk *walk, u8 proto) |
1202 | { | ||
1203 | walk->proto = proto; | ||
1204 | walk->state = NULL; | ||
1205 | walk->count = 0; | ||
1206 | } | ||
1207 | |||
1208 | static inline void xfrm_state_walk_done(struct xfrm_state_walk *walk) | ||
1209 | { | ||
1210 | if (walk->state != NULL) { | ||
1211 | xfrm_state_put(walk->state); | ||
1212 | walk->state = NULL; | ||
1213 | } | ||
1214 | } | ||
1215 | |||
1216 | extern int xfrm_state_walk(struct xfrm_state_walk *walk, | ||
1217 | int (*func)(struct xfrm_state *, int, void*), void *); | ||
1188 | extern struct xfrm_state *xfrm_state_alloc(void); | 1218 | extern struct xfrm_state *xfrm_state_alloc(void); |
1189 | extern struct xfrm_state *xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr, | 1219 | extern struct xfrm_state *xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr, |
1190 | struct flowi *fl, struct xfrm_tmpl *tmpl, | 1220 | struct flowi *fl, struct xfrm_tmpl *tmpl, |
@@ -1306,7 +1336,25 @@ static inline int xfrm4_udp_encap_rcv(struct sock *sk, struct sk_buff *skb) | |||
1306 | #endif | 1336 | #endif |
1307 | 1337 | ||
1308 | struct xfrm_policy *xfrm_policy_alloc(gfp_t gfp); | 1338 | struct xfrm_policy *xfrm_policy_alloc(gfp_t gfp); |
1309 | extern int xfrm_policy_walk(u8 type, int (*func)(struct xfrm_policy *, int, int, void*), void *); | 1339 | |
1340 | static inline void xfrm_policy_walk_init(struct xfrm_policy_walk *walk, u8 type) | ||
1341 | { | ||
1342 | walk->cur_type = XFRM_POLICY_TYPE_MAIN; | ||
1343 | walk->type = type; | ||
1344 | walk->policy = NULL; | ||
1345 | walk->count = 0; | ||
1346 | } | ||
1347 | |||
1348 | static inline void xfrm_policy_walk_done(struct xfrm_policy_walk *walk) | ||
1349 | { | ||
1350 | if (walk->policy != NULL) { | ||
1351 | xfrm_pol_put(walk->policy); | ||
1352 | walk->policy = NULL; | ||
1353 | } | ||
1354 | } | ||
1355 | |||
1356 | extern int xfrm_policy_walk(struct xfrm_policy_walk *walk, | ||
1357 | int (*func)(struct xfrm_policy *, int, int, void*), void *); | ||
1310 | int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl); | 1358 | int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl); |
1311 | struct xfrm_policy *xfrm_policy_bysel_ctx(u8 type, int dir, | 1359 | struct xfrm_policy *xfrm_policy_bysel_ctx(u8 type, int dir, |
1312 | struct xfrm_selector *sel, | 1360 | struct xfrm_selector *sel, |