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

Reply via email to