Hi,

I very quickly read your email, but the first thing that popped to mind is that your source host might be rejecting the packets because the destination mac and ip addresses of the packets don't match the ones of the host receiving the packets. Maybe you want to try modifying those fields as well to match the host that you want to receive the packets
and try again.

Niky

Sriram wrote:
Hi All

I have been trying to add a flow entry to the switch when I receive a datapath_join_event using switch.cc component. My set of actions include (set_nw_tos,set_tp_port and output). When a packet arrives, I modify the ToS bit, Src/Dst port using set of actions and want to send the packet back to the same host using OFPP_IN_PORT. However, I am not receiving the packet back in my input port (source host). When I replace the OFPP_IN_PORT with OFPP_FLOOD and check in the destination host, I can see that the ToS, Src and Dst Port getting modified.
I use the following code to install the flow:

struct ofp_flow_mod *ofm = (struct ofp_flow_mod *)malloc(sizeof(struct ofp_flow_mod)+(4*sizeof(struct ofp_action_header));

ofm->header.version = OFP_VERSION;

ofm->header.type = OFPT_FLOW_MOD;

ofm->header.length = htons(sizeof(struct ofp_flow_mod)+ action_length*sizeof(struct ofp_action_header));

ofm->match.wildcards = htonl(1<<20 | 1<<1);

ofm->match.in_port = htons(1);

ofm->match.dl_src[0] = 0x08;

ofm->match.dl_src[1] = 0x00;

ofm->match.dl_src[2] = 0x27;

ofm->match.dl_src[3] = 0x7c;

ofm->match.dl_src[4] = 0xe5;

ofm->match.dl_src[5] = 0xb8;

ofm->match.dl_dst[0] = 0x08;

ofm->match.dl_dst[1] = 0x00;

ofm->match.dl_dst[2] = 0x27;

ofm->match.dl_dst[3] = 0x86;

ofm->match.dl_dst[4] = 0xfb;

ofm->match.dl_dst[5] = 0x92;

ofm->match.dl_type = htons(0x800);

ofm->match.nw_proto = 6;

ofm->match.pad1[0] = (uint8_t)0;

ofm->match.nw_tos = 0x10;

ofm->match.nw_src = (inet_addr(SRC_IP));

ofm->match.nw_dst = (inet_addr(DST_IP));

ofm->match.tp_src = htons(SRC_PORT);

ofm->match.tp_dst = htons(DST_PORT);

ofm->match.pad2[0] = 0;

ofm->match.pad2[1] = 0;

ofm->cookie = htonl(0);

ofm->command = htons(OFPFC_ADD);

ofm->buffer_id = htonl(UINT32_MAX);

ofm->idle_timeout = htons(OFP_FLOW_PERMANENT);

ofm->hard_timeout = htons(OFP_FLOW_PERMANENT);

ofm->priority = htons(OFP_DEFAULT_PRIORITY);

ofm->flags = htons(ofd_flow_mod_flags());

ofm->out_port = htons(OFPP_NONE);

/* Handling Set of Actions */


// SET NW TOS

ofp_action_nw_tos *nw_tos = (ofp_action_nw_tos *)malloc(sizeof(ofp_action_nw_tos));

nw_tos->type = htons(OFPAT_SET_NW_TOS);

nw_tos->len = htons(sizeof(ofp_action_nw_tos));

nw_tos->nw_tos = 0x11;

// SET NW TP SRC

ofp_action_tp_port *tp_src = (ofp_action_tp_port *)malloc(sizeof(ofp_action_tp_port));

tp_src->type = htons(OFPAT_SET_TP_SRC);

tp_src->len = htons(sizeof(ofp_action_tp_port));

tp_src->tp_port = htons(1234);


// SET NW TP DST

ofp_action_tp_port *tp_dst = (ofp_action_tp_port *)malloc(sizeof(ofp_action_tp_port));

tp_dst->type = htons(OFPAT_SET_TP_DST);

tp_dst->len = htons(sizeof(ofp_action_tp_port));

tp_dst->tp_port = htons(4100);


// OUTPUT ACTION

ofp_action_output *action = (ofp_action_output *)malloc(sizeof(ofp_action_output));

action->type = htons(OFPAT_OUTPUT);

action->len = htons(sizeof(ofp_action_output));

action->port = htons(OFPP_IN_PORT); ///WHEN I REPLACE WITH OFPP_FLOOD, i receive the packet in the destination host with the above actions getting modified. However, I want to set the above actions and send it back to the source host./

action->max_len = htons(0);


memcpy(action_type, (unsigned char *)nw_tos, sizeof(ofp_action_nw_tos));

memcpy(action_type + sizeof(ofp_action_nw_tos), (unsigned char *)tp_src, sizeof(ofp_action_tp_port));

memcpy(action_type + sizeof(ofp_action_nw_tos) + sizeof(ofp_action_tp_port), (unsigned char *)tp_dst, sizeof(ofp_action_tp_port));

memcpy(action_type + sizeof(ofp_action_nw_tos) + sizeof(ofp_action_tp_port)+ sizeof(ofp_action_tp_port), (unsigned char *)action, sizeof(ofp_action_output));

memcpy(ofm->actions, action_type, no_of_actions_len);

send_openflow_command(dje.datapath_id, &ofm->header, true);


I checked in wireshark to verify the flow mod and it seems to work correctly. I am running my host machines in VirtualBox VMs and the switch (OpenFlow 1.0) is running in my host system. Is there something that I am missing?
Thanks
Sriram
------------------------------------------------------------------------

_______________________________________________
nox-dev mailing list
[email protected]
http://noxrepo.org/mailman/listinfo/nox-dev_noxrepo.org


_______________________________________________
nox-dev mailing list
[email protected]
http://noxrepo.org/mailman/listinfo/nox-dev_noxrepo.org

Reply via email to