From: Michael 'Mickey' Lauer Date: Sun, 3 Jan 2010 11:52:34 +0000 (+0100) Subject: libnl-2.0: bind attributes, message headers, callbacks X-Git-Tag: 0.7.10~132 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6a3139ecbd978902ee914a440c6573f8898f60df;p=thirdparty%2Fvala.git libnl-2.0: bind attributes, message headers, callbacks --- diff --git a/vapi/libnl-2.0.vapi b/vapi/libnl-2.0.vapi index 053724018..e1b466f07 100644 --- a/vapi/libnl-2.0.vapi +++ b/vapi/libnl-2.0.vapi @@ -1,6 +1,7 @@ -/* libnl-2.0.vapi +/** + * libnl-2.0.vapi * - * Copyright (C) 2009 Michael 'Mickey' Lauer + * Copyright (C) 2009-2010 Michael 'Mickey' Lauer * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,11 +22,17 @@ [CCode (lower_case_cprefix = "nl_", cheader_filename = "netlink/netlink.h")] namespace Netlink { + [CCode (cname = "nl_geterror", cheader_filename = "netlink/netlink.h")] + public static unowned string strerror( int number ); + [CCode (instance_pos = -1)] - public delegate void Callback (Object obj); + public delegate void CallbackFunc (Object obj); + + [CCode (cname = "nl_recmsg_msg_cb_t", cheader_filename = "netlink/netlink.h", instance_pos = -1)] + public delegate int MessageCallbackFunc (Message msg); [Compact] - [CCode (cprefix = "nl_addr_", cname = "struct nl_addr", free_function = "", cheader_filename = "netlink/addr.h")] + [CCode (cprefix = "nl_addr_", cname = "struct nl_addr", free_function = "", cheader_filename = "netlink/netlink.h")] public class Address : Object { [CCode (cname = "nl_addr_alloc")] public Address(); @@ -60,8 +67,41 @@ namespace Netlink { } } + [CCode (cprefix = "nla_", cname = "struct nlattr", free_function = "", cheader_filename = "netlink/netlink.h")] + public struct Attribute { + } + + [Compact] + [CCode (cname = "struct nla_policy", free_function = "")] + public class AttributePolicy { + [CCode (cname = "")] + public AttributePolicy( AttributeType type = AttributeType.UNSPEC, uint16 minlen = 0, uint16 maxlen = 65535 ) + { + this.type = type; + this.minlen = minlen; + this.maxlen = maxlen; + } + public uint16 type; + public uint16 minlen; + public uint16 maxlen; + } + + [CCode (cprefix = "NLA_", cname = "int", cheader_filename = "netlink/attr.h")] + public enum AttributeType { + UNSPEC, /**< Unspecified type, binary data chunk */ + U8, /**< 8 bit integer */ + U16, /**< 16 bit integer */ + U32, /**< 32 bit integer */ + U64, /**< 64 bit integer */ + STRING, /**< NUL terminated character string */ + FLAG, /**< Flag */ + MSECS, /**< Micro seconds (64bit) */ + NESTED, /**< Nested attributes */ + TYPE_MAX + } + [Compact] - [CCode (cprefix = "rtnl_addr_", cname = "struct rtnl_addr", free_function = "", cheader_filename = "netlink/route/addr.h")] + [CCode (cprefix = "rtnl_addr_", cname = "struct rtnl_addr", free_function = "", cheader_filename = "netlink/route/netlink.h")] public class RouteAddress : Address { [CCode (cname = "rtnl_addr_alloc")] public RouteAddress(); @@ -76,29 +116,106 @@ namespace Netlink { } [Compact] - [CCode (cprefix = "nl_cache_", cname = "struct nl_cache", free_function = "nl_cache_free", cheader_filename = "netlink/cache.h")] + [CCode (cprefix = "nl_cache_", cname = "struct nl_cache", free_function = "nl_cache_free", cheader_filename = "netlink/netlink.h")] public class Cache { public static int alloc_name (string name, out Cache c); - public void @foreach (Callback cb); - public void foreach_filter (Object obj, Callback cb); + public void @foreach (CallbackFunc cb); + public void foreach_filter (Object obj, CallbackFunc cb); } [Compact] - [CCode (cprefix = "nl_link_cache_", cname = "struct nl_cache", free_function = "nl_cache_free", cheader_filename = "netlink/cache.h")] + [CCode (cprefix = "nl_cb_", cname = "struct nl_cb", free_function = "", cheader_filename = "netlink/netlink.h")] + public class Callback { + [CCode (cname = "nl_cb_alloc")] + public Callback (CallbackKind kind = CallbackKind.DEFAULT); + [CCode (cname = "nl_cb_set")] + public int @set (CallbackType type, CallbackKind kind, MessageCallbackFunc func); + [CCode (cname = "nl_cb_set_all")] + public int set_all (CallbackKind kind, MessageCallbackFunc func); + } + + [CCode (cname = "enum nl_cb_action", cprefix = "NL_", cheader_filename = "netlink/netlink.h")] + public enum CallbackAction { + OK, // Proceed with whatever comes next. + SKIP, // Skip this message. + STOP, // Stop parsing altogether and discard remaining messages. + } + + [CCode (cname = "enum nl_cb_kind", cprefix = "NL_CB_", cheader_filename = "netlink/netlink.h")] + public enum CallbackKind { + DEFAULT, // Default handlers (quiet). + VERBOSE, // Verbose default handlers (error messages printed). + DEBUG, // Debug handlers for debugging. + CUSTOM, // Customized handler specified by the user. + } + + [CCode (cname = "enum nl_cb_type", cprefix = "NL_CB_", cheader_filename = "netlink/netlink.h")] + public enum CallbackType { + VALID, // Message is valid. + FINISH, // Last message in a series of multi part messages received. + OVERRUN, // Report received that data was lost. + SKIPPED, // Message wants to be skipped. + ACK, // Message is an acknowledge. + MSG_IN, // Called for every message received. + MSG_OUT, // Called for every message sent out except for nl_sendto(). + INVALID, // Message is malformed and invalid. + SEQ_CHECK, // Called instead of internal sequence number checking. + SEND_ACK, // Sending of an acknowledge message has been requested. + } + + [Compact] + [CCode (cprefix = "nl_link_cache_", cname = "struct nl_cache", free_function = "nl_cache_free", cheader_filename = "netlink/netlink.h")] public class LinkCache : Cache { [CCode (cname = "rtnl_link_name2i")] public int name2i (string name); } [Compact] - [CCode (cprefix = "nl_addr_cache", cname = "struct nl_cache", free_function = "nl_cache_free", cheader_filename = "netlink/cache.h")] + [CCode (cprefix = "nl_addr_cache", cname = "struct nl_cache", free_function = "nl_cache_free", cheader_filename = "netlink/netlink.h")] public class AddrCache : Cache { } [Compact] - [CCode (cname = "struct nl_msg", free_function = "nl_msg_free", cheader_filename = "netlink/msg.h")] + [CCode (cprefix = "nl_msg_", cname = "struct nl_msg", free_function = "nl_msg_free", cheader_filename = "netlink/netlink.h")] public class Message { + public void dump (Posix.FILE file); + public int parse (CallbackFunc func); + [CCode (cname = "nlmsg_hdr")] + public MessageHeader header (); + } + + [Compact] + [CCode (cprefix = "nlmsg_", cname = "struct nlmsghdr", free_function = "", cheader_filename = "netlink/netlink.h")] + public class MessageHeader { + // field access + public uint32 nlmsg_len; + public uint16 nlmsg_type; + public uint16 nlmsg_flags; + public uint32 nlmsg_seq; + public uint32 nlmsg_pid; + + // size calculations + public static int msg_size (int payload); + public static int total_size (int payload); + public static int padlen (int payload); + + // payload access + public void* data (); + public int len (); + public void* tail (); + + // attribute access + public Attribute attrdata (int hdrlen); + public int attrlen (int hdrlen); + + // message parsing + public bool valid_hdr (int hdrlen); + public bool ok (int remaining); + public MessageHeader next (out int remaining); + public int parse (int hdrlen, [CCode (array_length = "false")] out Attribute[] attributes, AttributeType maxtype, AttributePolicy policy); + public Attribute find_attr (int hdrlen, AttributeType type); + public int validate (int hdrlen, AttributeType maxtype, AttributePolicy policy); } [Compact] @@ -108,12 +225,56 @@ namespace Netlink { public Socket(); [CCode (cname = "rtnl_link_alloc_cache")] - public int link_alloc_cache (out LinkCache c); + public int link_alloc_cache (out LinkCache c); [CCode (cname = "rtnl_addr_alloc_cache")] - public int addr_alloc_cache (out AddrCache c); + public int addr_alloc_cache (out AddrCache c); + // connection management + [CCode (cname = "nl_close")] + public int close (); [CCode (cname = "nl_connect")] - public int connect (int family); + public int connect (int family); + + // group management + public int add_memberships (int group, ...); + public int add_membership (int group); + public int drop_memberships (int group, ...); + public int drop_membership (int group); + public uint32 get_peer_port (); + public void set_peer_port (uint32 port); + + // callback management + public Callback get_cb (); + public void set_cb (Callback cb); + public int modify_cb (CallbackType type, CallbackKind kind, MessageCallbackFunc callback); + + // configuration + public int set_buffer_size (int rxbuf, int txbuf); + public int set_passcred (bool on); + public int recv_pktinfo (bool on); + + public void disable_seq_check (); + public uint use_seq (); + public void disable_auto_ack (); + public void enable_auto_ack (); + + public int get_fd (); + public int set_nonblocking (); + public void enable_msg_peek (); + public void disable_msg_peek (); + + // receiving messages + [CCode (cname = "nl_recv")] + public int recv (out Linux.Netlink.SockAddrNl addr, out char[] buf, out Linux.Socket.ucred cred); + + [CCode (cname = "nl_recvmsgs")] + public int recvmsgs (Callback cb); + + [CCode (cname = "nl_recvmsgs_default")] + public int recvmsgs_default (); + + [CCode (cname = "nl_wait_for_ack")] + public int wait_for_ack (); } [Compact]