[nox-dev] Getting Actions From Events in Python

2011-01-27 Thread Derek Cormier

Hello,

I was looking at pyglue.cc and it looks like actions are never included 
in python events.


A comment says to use Flow_stats, but flow stats contains a vector 
ofp_action_header's. Since actions are variable-length, won't this cut 
off data when the action is longer than the header? (For example, 
ofp_action_dl_addr).


So, is there any way to get actions in events like flow stats in? If 
not, how could we go about implementing this?


Thanks,
Derek

___
nox-dev mailing list
nox-dev@noxrepo.org
http://noxrepo.org/mailman/listinfo/nox-dev_noxrepo.org


Re: [nox-dev] Getting Actions From Events in Python

2011-01-27 Thread James Murphy McCauley
I believe the issue is that with the to_python() for ofp_flow_stats, we
have no idea if the actions actually follow the ofp_flow_stats structure
since, for example, someone could have just made an ofp_flow_stats
struct and tried to pythonize it.  I am not sure if this ever actually
happens, but whatever.  It's not provably a safe thing to do.  However,
the Flow_stats struct actually explicitly has the actions wrapped up
into a vector, so it IS possible to safely pull them out of that.  It
just hasn't been done. 

The to_python() for Flow_stats should: Step one, convert the fields from
the ofp_flow_stats struct itself into dict, which is done by just
calling the to_python() for ofp_flow_stats.  Step two, unpack v_actions
from the Flow_stats struct into a list of dicts and throw it into dict
too.  Except instead of step two, we have /* XXX actions */. :)  You
should be able to just go ahead and implement it there.

-- Murphy

On Fri, 2011-01-28 at 14:50 +0900, Derek Cormier wrote:
 Hello,
 
 I was looking at pyglue.cc and it looks like actions are never included 
 in python events.
 
 A comment says to use Flow_stats, but flow stats contains a vector 
 ofp_action_header's. Since actions are variable-length, won't this cut 
 off data when the action is longer than the header? (For example, 
 ofp_action_dl_addr).
 
 So, is there any way to get actions in events like flow stats in? If 
 not, how could we go about implementing this?
 
 Thanks,
 Derek
 
 ___
 nox-dev mailing list
 nox-dev@noxrepo.org
 http://noxrepo.org/mailman/listinfo/nox-dev_noxrepo.org



___
nox-dev mailing list
nox-dev@noxrepo.org
http://noxrepo.org/mailman/listinfo/nox-dev_noxrepo.org


Re: [nox-dev] Getting Actions From Events in Python

2011-01-27 Thread Derek Cormier
Ok I'll give it a try and submit a patch when I'm finished. Could you 
please tell me if the following is

the right approach?

template 
PyObject*
to_python(const ofp_action_header a)
{
PyObject* dict = PyDict_New();
if (!dict) {
return 0;
}

uint16_t type = ntohs(a.type);
pyglue_setdict_string(dict, type, to_python(type));
pyglue_setdict_string(dict, length, to_python(ntohs(a.len));

/* depending on the action type, cast to the appropriate
 * action struct to get its fields. */
if (type == OFPAT_OUTPUT) {
const ofp_action_output ao = 
reinterpret_castofp_action_output(a);

uint16_t port = ntohs(ao.port);

pyglue_setdict_string(dict, port, to_python(port));

/* max_len only has meaning when the destination port is the 
controller */

if (port == OFPP_CONTROLLER) {
pyglue_setdict_string(dict, max_len, 
to_python(ntohs(ao.max_len)));

}
}
else if (type == OFPAT_STRIP_VLAN) {
/* nothing to set, no struct beyond the header */
}
else if (type == OFPAT_SET_VLAN_VID) {
const ofp_action_vlan_vid av = 
reinterpret_castofp_action_output(a);

  

Is this the proper use of reinterpret cast? I've never had to use it 
before...


-Derek

On 01/28/2011 03:20 PM, James Murphy McCauley wrote:

I believe the issue is that with the to_python() for ofp_flow_stats, we
have no idea if the actions actually follow the ofp_flow_stats structure
since, for example, someone could have just made an ofp_flow_stats
struct and tried to pythonize it.  I am not sure if this ever actually
happens, but whatever.  It's not provably a safe thing to do.  However,
the Flow_stats struct actually explicitly has the actions wrapped up
into a vector, so it IS possible to safely pull them out of that.  It
just hasn't been done.

The to_python() for Flow_stats should: Step one, convert the fields from
the ofp_flow_stats struct itself into dict, which is done by just
calling the to_python() for ofp_flow_stats.  Step two, unpack v_actions
from the Flow_stats struct into a list of dicts and throw it into dict
too.  Except instead of step two, we have /* XXX actions */. :)  You
should be able to just go ahead and implement it there.

-- Murphy

On Fri, 2011-01-28 at 14:50 +0900, Derek Cormier wrote:

Hello,

I was looking at pyglue.cc and it looks like actions are never included
in python events.

A comment says to use Flow_stats, but flow stats contains a vector
ofp_action_header's. Since actions are variable-length, won't this cut
off data when the action is longer than the header? (For example,
ofp_action_dl_addr).

So, is there any way to get actions in events like flow stats in? If
not, how could we go about implementing this?

Thanks,
Derek

___
nox-dev mailing list
nox-dev@noxrepo.org
http://noxrepo.org/mailman/listinfo/nox-dev_noxrepo.org






___
nox-dev mailing list
nox-dev@noxrepo.org
http://noxrepo.org/mailman/listinfo/nox-dev_noxrepo.org


Re: [nox-dev] Getting Actions From Events in Python

2011-01-27 Thread Derek Cormier

Without minding the typos, that is...

On 01/28/2011 04:46 PM, Derek Cormier wrote:
Ok I'll give it a try and submit a patch when I'm finished. Could you 
please tell me if the following is

the right approach?

template 
PyObject*
to_python(const ofp_action_header a)
{
PyObject* dict = PyDict_New();
if (!dict) {
return 0;
}

uint16_t type = ntohs(a.type);
pyglue_setdict_string(dict, type, to_python(type));
pyglue_setdict_string(dict, length, to_python(ntohs(a.len));

/* depending on the action type, cast to the appropriate
 * action struct to get its fields. */
if (type == OFPAT_OUTPUT) {
const ofp_action_output ao = 
reinterpret_castofp_action_output(a);

uint16_t port = ntohs(ao.port);

pyglue_setdict_string(dict, port, to_python(port));

/* max_len only has meaning when the destination port is the 
controller */

if (port == OFPP_CONTROLLER) {
pyglue_setdict_string(dict, max_len, 
to_python(ntohs(ao.max_len)));

}
}
else if (type == OFPAT_STRIP_VLAN) {
/* nothing to set, no struct beyond the header */
}
else if (type == OFPAT_SET_VLAN_VID) {
const ofp_action_vlan_vid av = 
reinterpret_castofp_action_output(a);

  

Is this the proper use of reinterpret cast? I've never had to use it 
before...


-Derek

On 01/28/2011 03:20 PM, James Murphy McCauley wrote:

I believe the issue is that with the to_python() for ofp_flow_stats, we
have no idea if the actions actually follow the ofp_flow_stats structure
since, for example, someone could have just made an ofp_flow_stats
struct and tried to pythonize it.  I am not sure if this ever actually
happens, but whatever.  It's not provably a safe thing to do.  However,
the Flow_stats struct actually explicitly has the actions wrapped up
into a vector, so it IS possible to safely pull them out of that.  It
just hasn't been done.

The to_python() for Flow_stats should: Step one, convert the fields from
the ofp_flow_stats struct itself into dict, which is done by just
calling the to_python() for ofp_flow_stats.  Step two, unpack v_actions
from the Flow_stats struct into a list of dicts and throw it into dict
too.  Except instead of step two, we have /* XXX actions */. :)  You
should be able to just go ahead and implement it there.

-- Murphy

On Fri, 2011-01-28 at 14:50 +0900, Derek Cormier wrote:

Hello,

I was looking at pyglue.cc and it looks like actions are never included
in python events.

A comment says to use Flow_stats, but flow stats contains a vector
ofp_action_header's. Since actions are variable-length, won't this cut
off data when the action is longer than the header? (For example,
ofp_action_dl_addr).

So, is there any way to get actions in events like flow stats in? If
not, how could we go about implementing this?

Thanks,
Derek

___
nox-dev mailing list
nox-dev@noxrepo.org
http://noxrepo.org/mailman/listinfo/nox-dev_noxrepo.org








___
nox-dev mailing list
nox-dev@noxrepo.org
http://noxrepo.org/mailman/listinfo/nox-dev_noxrepo.org