Hi Ricardo,

Try matching on the old IP, then rewrite to the new IP.

Regards
KK

On 20 July 2011 14:50, Ricardo Bennesby <ricardo.benne...@gmail.com> wrote:
> Hi all. I would like to forward packets from one host to another.
> I have the following topology:
>    c0              c0
>     |                 |
>    s3------------- s3
>   /    \            /   \
>  h1  h2        h1   h2
> Each host can ping each other. The two networks are connected by their
> switches (s3).
> In net1 h1 and h2 have IP 10.0.0.1 and 10.0.0.2.
> In net2 h1 and h2 have IP 192.168.47.1 and 192.168.47.2
> I want that everytime I ping from some host in 192.168.47.2 the packets be
> forward to 10.0.0.2.
> I am using the switch.cc component and making some modifications on it.
> I set some actions to achieve this, using flow_mod and changing the
> out_port, destination mac_address and destination IP.
> Using wireshark, listening to the port where h2 (10.0.0.2) is, I saw that it
> got an ARP request from h1. So, looks like the packets arrive in the correct
> ethernet address, but it continue asking for 192.168.47.2. The destination
> IP was not modified. The code follows:
>     if (flow.nw_dst == 36677824){//if destination ip=192.168.47.2
>                uint8_t no_of_actions_len = 56;
>                uint8_t action_length = no_of_actions_len/(sizeof(struct
> ofp_action_header));
>                unsigned char *action_type = (unsigned
> char*)malloc(action_length*sizeof(struct ofp_action_header));
>             ofp_flow_mod* ofm;
>                    size_t size = sizeof *ofm + 7*sizeof(ofp_action_output);
>                    boost::shared_array<char> raw_of(new char[size]);
>                    ofm = (ofp_flow_mod*) raw_of.get();
>                    ofm->header.version = OFP_VERSION;
>                    ofm->header.type = OFPT_FLOW_MOD;
>                    ofm->header.length = htons(size);
>                    //ofm->match.wildcards = htonl(0);
>                    ofm->match.wildcards = htonl(1<<20 | 1<<1);
>                    ofm->match.in_port = htons(flow.in_port);
>                    ofm->match.dl_vlan = flow.dl_vlan;
>                    ofm->match.dl_vlan_pcp = flow.dl_vlan_pcp;
>                    memcpy(ofm->match.dl_src, flow.dl_src.octet, sizeof
> ofm->match.dl_src);
>                    memcpy(ofm->match.dl_dst, new_mac.octet, sizeof
> ofm->match.dl_dst);
>                    ofm->match.dl_type = flow.dl_type;
>                    ofm->match.nw_src = flow.nw_src;
>                    ofm->match.nw_dst = new_ip;
>                    ofm->match.tp_src = flow.tp_src;
>                    ofm->match.tp_dst = flow.tp_dst;
>                    ofm->match.nw_proto = flow.nw_proto;
>                    ofm->match.nw_tos = flow.nw_tos;
>                    ofm->match.tp_src = flow.tp_src;
>                    ofm->cookie = htonl(0);
>                    ofm->command = htons(OFPFC_ADD);
>                    ofm->buffer_id = htonl(buffer_id);
>                    ofm->idle_timeout = htons(5);
>                    ofm->hard_timeout = htons(OFP_FLOW_PERMANENT);
>                    ofm->priority = htons(OFP_DEFAULT_PRIORITY);
>                    ofm->flags = htons(ofd_flow_mod_flags());
>                    ofp_action_dl_addr *dlaction = (ofp_action_dl_addr
> *)malloc(sizeof(ofp_action_dl_addr));
>                    dlaction->type = htons(OFPAT_SET_DL_DST);
>                    dlaction->len = htons(sizeof(ofp_action_dl_addr));
>                    memcpy(dlaction->dl_addr, ofm->match.dl_dst,
> sizeof(ofm->match.dl_dst));
>                   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 = 0;
>                   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(0);
>                    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(0);
>                   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(port);
>                   action->max_len = htons(0);
>                   ofp_action_nw_addr *nwaction = (ofp_action_nw_addr
> *)malloc(sizeof(ofp_action_nw_addr));
>                   nwaction->type = htons(OFPAT_SET_NW_DST);
>                   nwaction->len = htons(sizeof(ofp_action_nw_addr));
>                   nwaction->nw_addr = new_ip;
>                   memcpy(action_type, (unsigned char *)dlaction,
> sizeof(ofp_action_dl_addr));
>                   memcpy(action_type + sizeof(ofp_action_dl_addr), (unsigned
> char *)nw_tos, sizeof(ofp_action_nw_tos));
>                   memcpy(action_type + sizeof(ofp_action_dl_addr)+
> sizeof(ofp_action_nw_tos), (unsigned char *)tp_src,
> sizeof(ofp_action_tp_port));
>                   memcpy(action_type + sizeof(ofp_action_dl_addr) +
> 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_dl_addr) +
> sizeof(ofp_action_nw_tos) + sizeof(ofp_action_tp_port)+
> sizeof(ofp_action_tp_port), (unsigned char *)action,
> sizeof(ofp_action_output));
>                   memcpy(action_type + sizeof(ofp_action_dl_addr) +
> sizeof(ofp_action_nw_tos) + sizeof(ofp_action_tp_port)+
> sizeof(ofp_action_tp_port)+sizeof(ofp_action_output), (unsigned char
> *)nwaction, sizeof(ofp_action_nw_addr));
> \
>                   // Copy action_type to ofm->actions
>                   memcpy(ofm->actions, action_type, no_of_actions_len);
>                     send_openflow_command(pi.datapath_id, &ofm->header,
> true);
>  }
> Sorry if I wasn't clear.
> Best regards.
> --
> Ricardo Bennesby da Silva
> Ciência da Computação - UFAM
> LabCIA - Laboratório de Computação Inteligente e Autonoma
>
>
> _______________________________________________
> nox-dev mailing list
> nox-dev@noxrepo.org
> http://noxrepo.org/mailman/listinfo/nox-dev
>
>
_______________________________________________
nox-dev mailing list
nox-dev@noxrepo.org
http://noxrepo.org/mailman/listinfo/nox-dev

Reply via email to