46
46
#include "netlabel_mgmt.h"
47
47
#include "netlabel_domainhash.h"
48
48
49
+ /* Argument struct for calipso_doi_walk() */
50
+ struct netlbl_calipso_doiwalk_arg {
51
+ struct netlink_callback * nl_cb ;
52
+ struct sk_buff * skb ;
53
+ u32 seq ;
54
+ };
55
+
49
56
/* NetLabel Generic NETLINK CALIPSO family */
50
57
static struct genl_family netlbl_calipso_gnl_family = {
51
58
.id = GENL_ID_GENERATE ,
@@ -183,6 +190,73 @@ static int netlbl_calipso_list(struct sk_buff *skb, struct genl_info *info)
183
190
return ret_val ;
184
191
}
185
192
193
+ /**
194
+ * netlbl_calipso_listall_cb - calipso_doi_walk() callback for LISTALL
195
+ * @doi_def: the CALIPSO DOI definition
196
+ * @arg: the netlbl_calipso_doiwalk_arg structure
197
+ *
198
+ * Description:
199
+ * This function is designed to be used as a callback to the
200
+ * calipso_doi_walk() function for use in generating a response for a LISTALL
201
+ * message. Returns the size of the message on success, negative values on
202
+ * failure.
203
+ *
204
+ */
205
+ static int netlbl_calipso_listall_cb (struct calipso_doi * doi_def , void * arg )
206
+ {
207
+ int ret_val = - ENOMEM ;
208
+ struct netlbl_calipso_doiwalk_arg * cb_arg = arg ;
209
+ void * data ;
210
+
211
+ data = genlmsg_put (cb_arg -> skb , NETLINK_CB (cb_arg -> nl_cb -> skb ).portid ,
212
+ cb_arg -> seq , & netlbl_calipso_gnl_family ,
213
+ NLM_F_MULTI , NLBL_CALIPSO_C_LISTALL );
214
+ if (!data )
215
+ goto listall_cb_failure ;
216
+
217
+ ret_val = nla_put_u32 (cb_arg -> skb , NLBL_CALIPSO_A_DOI , doi_def -> doi );
218
+ if (ret_val != 0 )
219
+ goto listall_cb_failure ;
220
+ ret_val = nla_put_u32 (cb_arg -> skb ,
221
+ NLBL_CALIPSO_A_MTYPE ,
222
+ doi_def -> type );
223
+ if (ret_val != 0 )
224
+ goto listall_cb_failure ;
225
+
226
+ genlmsg_end (cb_arg -> skb , data );
227
+ return 0 ;
228
+
229
+ listall_cb_failure :
230
+ genlmsg_cancel (cb_arg -> skb , data );
231
+ return ret_val ;
232
+ }
233
+
234
+ /**
235
+ * netlbl_calipso_listall - Handle a LISTALL message
236
+ * @skb: the NETLINK buffer
237
+ * @cb: the NETLINK callback
238
+ *
239
+ * Description:
240
+ * Process a user generated LISTALL message and respond accordingly. Returns
241
+ * zero on success and negative values on error.
242
+ *
243
+ */
244
+ static int netlbl_calipso_listall (struct sk_buff * skb ,
245
+ struct netlink_callback * cb )
246
+ {
247
+ struct netlbl_calipso_doiwalk_arg cb_arg ;
248
+ u32 doi_skip = cb -> args [0 ];
249
+
250
+ cb_arg .nl_cb = cb ;
251
+ cb_arg .skb = skb ;
252
+ cb_arg .seq = cb -> nlh -> nlmsg_seq ;
253
+
254
+ calipso_doi_walk (& doi_skip , netlbl_calipso_listall_cb , & cb_arg );
255
+
256
+ cb -> args [0 ] = doi_skip ;
257
+ return skb -> len ;
258
+ }
259
+
186
260
/* NetLabel Generic NETLINK Command Definitions
187
261
*/
188
262
@@ -201,6 +275,13 @@ static const struct genl_ops netlbl_calipso_ops[] = {
201
275
.doit = netlbl_calipso_list ,
202
276
.dumpit = NULL ,
203
277
},
278
+ {
279
+ .cmd = NLBL_CALIPSO_C_LISTALL ,
280
+ .flags = 0 ,
281
+ .policy = calipso_genl_policy ,
282
+ .doit = NULL ,
283
+ .dumpit = netlbl_calipso_listall ,
284
+ },
204
285
};
205
286
206
287
/* NetLabel Generic NETLINK Protocol Functions
@@ -316,3 +397,28 @@ void calipso_doi_putdef(struct calipso_doi *doi_def)
316
397
if (ops )
317
398
ops -> doi_putdef (doi_def );
318
399
}
400
+
401
+ /**
402
+ * calipso_doi_walk - Iterate through the DOI definitions
403
+ * @skip_cnt: skip past this number of DOI definitions, updated
404
+ * @callback: callback for each DOI definition
405
+ * @cb_arg: argument for the callback function
406
+ *
407
+ * Description:
408
+ * Iterate over the DOI definition list, skipping the first @skip_cnt entries.
409
+ * For each entry call @callback, if @callback returns a negative value stop
410
+ * 'walking' through the list and return. Updates the value in @skip_cnt upon
411
+ * return. Returns zero on success, negative values on failure.
412
+ *
413
+ */
414
+ int calipso_doi_walk (u32 * skip_cnt ,
415
+ int (* callback )(struct calipso_doi * doi_def , void * arg ),
416
+ void * cb_arg )
417
+ {
418
+ int ret_val = - ENOMSG ;
419
+ const struct netlbl_calipso_ops * ops = netlbl_calipso_ops_get ();
420
+
421
+ if (ops )
422
+ ret_val = ops -> doi_walk (skip_cnt , callback , cb_arg );
423
+ return ret_val ;
424
+ }
0 commit comments