Niky, Thanks, That worked. I forgot about the reverse path.
Thanks Sriram On Sun, Feb 13, 2011 at 11:40 PM, Niky Riga <[email protected]> wrote: > 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 >
_______________________________________________ nox-dev mailing list [email protected] http://noxrepo.org/mailman/listinfo/nox-dev_noxrepo.org
