Home | History | Annotate | Download | only in genl
      1 %module capi
      2 %{
      3 #include <netlink/genl/ctrl.h>
      4 #include <netlink/genl/family.h>
      5 #include <netlink/genl/genl.h>
      6 #include <netlink/genl/mngt.h>
      7 %}
      8 
      9 %include <stdint.i>
     10 %include <cstring.i>
     11 
     12 /* #include <netlink/genl/ctrl.h> */
     13 extern int genl_ctrl_alloc_cache(struct nl_sock *, struct nl_cache **o_cache);
     14 extern struct genl_family *genl_ctrl_search(struct nl_cache *, int);
     15 extern struct genl_family *genl_ctrl_search_by_name(struct nl_cache *,
     16 						    const char *);
     17 extern int genl_ctrl_resolve(struct nl_sock *, const char *);
     18 extern int genl_ctrl_resolve_grp(struct nl_sock *sk, const char *family,
     19 				 const char *grp);
     20 
     21 /* #include <netlink/genl/family.h> */
     22 extern struct genl_family *genl_family_alloc(void);
     23 extern void genl_family_put(struct genl_family *);
     24 
     25 extern unsigned int genl_family_get_id(struct genl_family *);
     26 extern void genl_family_set_id(struct genl_family *, unsigned int);
     27 extern char *genl_family_get_name(struct genl_family *);
     28 extern void genl_family_set_name(struct genl_family *, const char *name);
     29 extern uint8_t genl_family_get_version(struct genl_family *);
     30 extern void genl_family_set_version(struct genl_family *, uint8_t);
     31 extern uint32_t genl_family_get_hdrsize(struct genl_family *);
     32 extern void genl_family_set_hdrsize(struct genl_family *, uint32_t);
     33 extern uint32_t genl_family_get_maxattr(struct genl_family *);
     34 extern void genl_family_set_maxattr(struct genl_family *, uint32_t);
     35 
     36 extern int genl_family_add_op(struct genl_family *, int, int);
     37 extern int genl_family_add_grp(struct genl_family *, uint32_t , const char *);
     38 
     39 /* #include <netlink/genl/genl.h> */
     40 extern int genl_connect(struct nl_sock *);
     41 
     42 extern void *genlmsg_put(struct nl_msg *, uint32_t, uint32_t,
     43 			 int, int, int, uint8_t, uint8_t);
     44 
     45 struct nlattr {
     46 };
     47 
     48 struct nla_policy {
     49 	/** Type of attribute or NLA_UNSPEC */
     50 	uint16_t	type;
     51 
     52 	/** Minimal length of payload required */
     53 	uint16_t	minlen;
     54 
     55 	/** Maximal length of payload allowed */
     56 	uint16_t	maxlen;
     57 };
     58 
     59 %inline %{
     60 PyObject *py_genlmsg_parse(struct nlmsghdr *nlh, int uhl, int max,
     61 			   PyObject *p)
     62 {
     63 	struct nlattr *tb_msg[max + 1];
     64 	struct nla_policy *policy = NULL;
     65 	void *pol;
     66 	PyObject *attrs = Py_None;
     67 	PyObject *k;
     68 	PyObject *v;
     69 	PyObject *resobj;
     70 	int err;
     71 	int i;
     72 
     73 	if (p != Py_None) {
     74 		PyObject *pobj;
     75 
     76 		if (!PyList_Check(p)) {
     77 			fprintf(stderr, "expected list object\n");
     78 			err = -1;
     79 			goto fail;
     80 		}
     81 		pobj = PyList_GetItem(p, 0);
     82 		err = SWIG_ConvertPtr(pobj, &pol, SWIGTYPE_p_nla_policy, 0 |  0 );
     83 		if (!SWIG_IsOK(err))
     84 			goto fail;
     85 		policy = pol;
     86 	}
     87 	err = genlmsg_parse(nlh, uhl, tb_msg, max, policy);
     88 	if (err < 0) {
     89 		fprintf(stderr, "Failed to parse response message\n");
     90 	} else {
     91 		attrs = PyDict_New();
     92 		for (i = 0; i <= max; i++)
     93 			if (tb_msg[i]) {
     94 				k = PyInt_FromLong((long)i);
     95 				v = SWIG_NewPointerObj(SWIG_as_voidptr(tb_msg[i]), SWIGTYPE_p_nlattr, 0 |  0 );
     96 				PyDict_SetItem(attrs, k, v);
     97 			}
     98 	}
     99 fail:
    100 	if (attrs == Py_None)
    101 		Py_INCREF(Py_None);
    102 	resobj = Py_BuildValue("(iO)", err, attrs);
    103 	return resobj;
    104 }
    105 
    106 %}
    107 /* #include <netlink/genl/mngt.h> */
    108 /* nothing yet */
    109