• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 %{
py_genlmsg_parse(struct nlmsghdr * nlh,int uhl,int max,PyObject * p)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