Another little reorg; we are quite tightly bound to implementation of CStruct

This commit is contained in:
Brian Candler
2011-05-02 18:17:24 +01:00
parent 14f8a27d2b
commit a6eda43b2e
3 changed files with 35 additions and 7 deletions

25
README
View File

@@ -5,6 +5,29 @@ This library provides an API for using a Linux Netlink socket, for doing
things like manipulating IP interfaces, routes and firewall rules
programmatically.
Code organisation
=================
There are separate classes for each Netlink protocol providing a high-level
API. These all in turn use the NLSocket class, which has methods for adding
the headers to messages and sending them over a socket. The messages
themselves are built using class Message or RtattrMessage, which in turn are
subclasses of CStruct, which performs the low-level packing and unpacking of
the message bodies.
Route Firewall ...etc
| | |
+-------+-------+
|
v
NLSocket
|
v
Message / RtattrMessage
|
v
CStruct
Useful reference material
=========================
@@ -41,6 +64,8 @@ TODO
====
* Exception hierarchy
* Unit tests
* Integration tests
Copyright
=========

View File

@@ -1,10 +1,12 @@
module Netlink
# This class allows defining of C-style structures, and converting
# object instances to and from a packed binary representation.
#
# A new structure is created by subclassing Cstruct, and then using the
# A new structure is created by subclassing CStruct, and then using the
# 'field' metaprogramming macro to define each field:
#
# class Foo < Cstruct
# class Foo < CStruct
# field :bar, :char
# field :baz, :long
#
@@ -25,7 +27,7 @@
# str = msg.to_s # convert to binary
# msg2 = Foo.parse(str) # convert from binary
# msg2 = Foo.new(msg) # copy an existing object
class Cstruct
class CStruct
EMPTY_STRING = "".freeze #:nodoc:
EMPTY_ARRAY = [].freeze #:nodoc:
@@ -183,3 +185,4 @@ class Cstruct
(val + (m-1)) & ~(m-1)
end
end
end # module Netlink

View File

@@ -1,4 +1,4 @@
require 'cstruct'
require 'netlink/c_struct'
require 'netlink/constants'
require 'ipaddr'
@@ -6,8 +6,8 @@ module Netlink
NLMSGHDR_PACK = "LSSLL".freeze # :nodoc:
NLMSGHDR_SIZE = [0,0,0,0,0].pack(NLMSGHDR_PACK).bytesize # :nodoc:
EMPTY_STRING = Cstruct::EMPTY_STRING #:nodoc:
EMPTY_ARRAY = Cstruct::EMPTY_ARRAY #:nodoc:
EMPTY_STRING = "".freeze #:nodoc:
EMPTY_ARRAY = [].freeze #:nodoc:
# This is the base class from which all Netlink messages are derived.
# To define a new Netlink message, make a subclass and then call the
@@ -16,7 +16,7 @@ module Netlink
# types are to be built using this structure.
#
# Use RtattrMessage instead for messages which are followed by variable rtattrs.
class Message < Cstruct
class Message < CStruct
# Map of numeric message type code => message class
CODE_TO_MESSAGE = {}