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