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