[Ns-developers] debugging ns-3 bindings problems

Gustavo Carneiro gjcarneiro at gmail.com
Thu May 28 03:50:25 PDT 2009


2009/5/28 Tom Henderson <tomh at tomh.org>

> Gustavo,
>
> I'm having the following problem with bindings in ~tomh/ns-3-ip-routing
> directory and am wondering how you would suggest to debug it or deal with
> it.
>
> Consider the class hierarchy:
>
> class A : public Object
> {
> public:
>  static TypeId GetTypeId (void);
>
>  virtual void AMethod (void) = 0;
>
> };
> class B : public A
> {
> public:
>  static TypeId GetTypeId (void);
>
>  virtual void BMethod (void) = 0;
> };
> class BImpl : public B
> {
> public:
>  static TypeId GetTypeId (void);
>
>  void AMethod (void);
>  void BMethod (void);
> };
>
>
> this generates, after the binding generation process, the following class
> (among other classes):
>
> class PyNs3B__PythonHelper : public ns3::B
> {
> public:
>  ...
>    virtual void BMethod();
>
>    virtual void AMethod();
>  ...
> }
>
> so, objects of type PyNs3B__PythonHelper can be instantiated even though
> ns3::B is an abstract base class, and everything builds fine.
>
> However, the test case above is analogous to real classes in
> ns-3-ip-routing, where class A is really class Ipv4RoutingProtocol, and
> class B is really class Ipv4StaticRouting : public class Ipv4RoutingProtocol
> (and there is also a corresponding Impl class).
>
> In this case, the bindings code is not generating the equivalent
> PyNs3B__PythonHelper::AMethod(), which in this case is
> PyNs3Ipv4StaticRouting__PythonHelper::RouteOutput().  What follows is a
> compilation error such as:
>
> debug/bindings/python/ns3module.h: In function ‘ns3::Ptr<T>
> ns3::CreateObjectPython(PyObject*, const ns3::AttributeList&) [with T =
> PyNs3Ipv4StaticRouting__PythonHelper]’:
> debug/bindings/python/ns3_module_node.cc:29253:   instantiated from here
> debug/bindings/python/ns3module.h:16342: error: cannot allocate an object
> of abstract type ‘PyNs3Ipv4StaticRouting__PythonHelper’
> debug/bindings/python/ns3module.h:5647: note:   because the following
> virtual functions are pure within ‘PyNs3Ipv4StaticRouting__PythonHelper’:
> debug/ns3/ipv4-routing-protocol.h:66: note:     virtual
> ns3::Ptr<ns3::Ipv4Route> ns3::Ipv4RoutingProtocol::RouteOutput(const
> ns3::Ipv4Header&, uint32_t, ns3::Socket::SocketErrno&)
> ...
>
> Nothing in ns3modulegen.log seems to suggest what may be going wrong, and
> the python bindings seem to properly reflect that these methods are virtual:
>
>    cls.add_method('RouteOutput',
>                   'ns3::Ptr< ns3::Ipv4Route >',
>                   [param('ns3::Ipv4Header const &', 'header'),
> param('uint32_t', 'oif'), param('ns3::Socket::SocketErrno &', 'sockerr')],
>                   is_pure_virtual=True, is_virtual=True)
>
>
> so I was wondering what you might recommend next for debugging a code
> generation problem like this.


True, the method is declared virtual, but is being ignored by pybindgen:

   ../bindings/python/ns3_module_node.py:2852:
TypeLookupError(['ns3::Socket::SocketErrno &'],)

Why this "ns3::Socket::SocketErrno &" type is being rejected by pybindgen I
do not know.  Sounds like a bug.  I am looking into it.  Sorry about that...

-- 
Gustavo J. A. M. Carneiro
INESC Porto, Telecommunications and Multimedia Unit
"The universe is always one step beyond logic." -- Frank Herbert


More information about the Ns-developers mailing list