def _control_plane_icmpv6_handler(self, pkt_meta, ipv6_pkt, icmpv6_pkt): vlan = pkt_meta.vlan src_ip = ipaddr.IPv6Address(ipv6_pkt.src) dst_ip = ipaddr.IPv6Address(ipv6_pkt.dst) icmpv6_type = icmpv6_pkt.type_ ofmsgs = [] if vlan.ip_in_vip_subnet(src_ip): in_port = pkt_meta.port.number vid = self._vlan_vid(vlan, in_port) eth_src = pkt_meta.eth_src if icmpv6_type == icmpv6.ND_NEIGHBOR_SOLICIT: solicited_ip = icmpv6_pkt.data.dst if vlan.is_faucet_vip(ipaddr.IPAddress(solicited_ip)): ofmsgs.extend(self._add_host_fib_route(vlan, src_ip)) nd_reply = valve_packet.nd_reply(self.faucet_mac, eth_src, vid, solicited_ip, src_ip, ipv6_pkt.hop_limit) ofmsgs.append(valve_of.packetout(in_port, nd_reply.data)) self.logger.info( 'Responded to ND solicit for %s to %s (%s)', solicited_ip, src_ip, eth_src) elif icmpv6_type == icmpv6.ND_NEIGHBOR_ADVERT: ofmsgs.extend( self._update_nexthop(vlan, in_port, eth_src, src_ip)) self.logger.info('ND advert %s (%s)', src_ip, eth_src) elif vlan.from_connected_to_vip(src_ip, dst_ip): if (icmpv6_type == icmpv6.ICMPV6_ECHO_REQUEST and pkt_meta.eth_dst == self.faucet_mac): icmpv6_echo_reply = valve_packet.icmpv6_echo_reply( self.faucet_mac, eth_src, vid, dst_ip, src_ip, ipv6_pkt.hop_limit, icmpv6_pkt.data.id, icmpv6_pkt.data.seq, icmpv6_pkt.data.data) ofmsgs.append( valve_of.packetout(in_port, icmpv6_echo_reply.data)) return ofmsgs
def control_plane_icmpv6_handler(self, in_port, vlan, eth_src, ipv6_pkt, icmpv6_pkt): vid = self._vlan_vid(vlan, in_port) src_ip = ipaddr.IPv6Address(ipv6_pkt.src) dst_ip = ipaddr.IPv6Address(ipv6_pkt.dst) icmpv6_type = icmpv6_pkt.type_ ofmsgs = [] if (icmpv6_type == icmpv6.ND_NEIGHBOR_SOLICIT and vlan.ip_in_controller_subnet(src_ip)): nd_reply = valve_packet.nd_reply(self.faucet_mac, eth_src, vid, icmpv6_pkt.data.dst, src_ip, ipv6_pkt.hop_limit) ofmsgs.extend([valve_of.packetout(in_port, nd_reply.data)]) ofmsgs.extend(self._add_host_fib_route(vlan, src_ip)) elif (icmpv6_type == icmpv6.ND_NEIGHBOR_ADVERT and vlan.ip_in_controller_subnet(src_ip)): resolved_ip_gw = ipaddr.IPv6Address(icmpv6_pkt.data.dst) self.logger.info('ND response %s for %s', eth_src, resolved_ip_gw) ofmsgs.extend(self._update_nexthop(vlan, eth_src, resolved_ip_gw)) elif icmpv6_type == icmpv6.ICMPV6_ECHO_REQUEST: icmpv6_echo_reply = valve_packet.icmpv6_echo_reply( self.faucet_mac, eth_src, vid, dst_ip, src_ip, ipv6_pkt.hop_limit, icmpv6_pkt.data.id, icmpv6_pkt.data.seq, icmpv6_pkt.data.data) ofmsgs.extend( [valve_of.packetout(in_port, icmpv6_echo_reply.data)]) return ofmsgs
def control_plane_icmpv6_handler(self, in_port, vlan, eth_src, ipv6_pkt, icmpv6_pkt): vid = self._vlan_vid(vlan, in_port) src_ip = ipaddr.IPv6Address(ipv6_pkt.src) dst_ip = ipaddr.IPv6Address(ipv6_pkt.dst) icmpv6_type = icmpv6_pkt.type_ ofmsgs = [] if (icmpv6_type == icmpv6.ND_NEIGHBOR_SOLICIT and vlan.ip_in_controller_subnet(src_ip)): nd_reply = valve_packet.nd_reply( self.faucet_mac, eth_src, vid, icmpv6_pkt.data.dst, src_ip, ipv6_pkt.hop_limit) ofmsgs.extend([valve_of.packetout(in_port, nd_reply.data)]) ofmsgs.extend(self._add_host_fib_route(vlan, src_ip)) elif (icmpv6_type == icmpv6.ND_NEIGHBOR_ADVERT and vlan.ip_in_controller_subnet(src_ip)): resolved_ip_gw = ipaddr.IPv6Address(icmpv6_pkt.data.dst) self.logger.info('ND response %s for %s', eth_src, resolved_ip_gw) ofmsgs.extend(self._update_nexthop(vlan, eth_src, resolved_ip_gw)) elif icmpv6_type == icmpv6.ICMPV6_ECHO_REQUEST: icmpv6_echo_reply = valve_packet.icmpv6_echo_reply( self.faucet_mac, eth_src, vid, dst_ip, src_ip, ipv6_pkt.hop_limit, icmpv6_pkt.data.id, icmpv6_pkt.data.seq, icmpv6_pkt.data.data) ofmsgs.extend([valve_of.packetout(in_port, icmpv6_echo_reply.data)]) return ofmsgs
def _control_plane_icmpv6_handler(self, pkt_meta, ipv6_pkt, icmpv6_pkt): vlan = pkt_meta.vlan src_ip = ipaddr.IPv6Address(ipv6_pkt.src) dst_ip = ipaddr.IPv6Address(ipv6_pkt.dst) icmpv6_type = icmpv6_pkt.type_ ofmsgs = [] if vlan.ip_in_vip_subnet(src_ip): in_port = pkt_meta.port.number vid = self._vlan_vid(vlan, in_port) eth_src = pkt_meta.eth_src if icmpv6_type == icmpv6.ND_NEIGHBOR_SOLICIT: solicited_ip = icmpv6_pkt.data.dst if vlan.is_faucet_vip(ipaddr.IPAddress(solicited_ip)): nd_reply = valve_packet.nd_reply( self.faucet_mac, eth_src, vid, solicited_ip, src_ip, ipv6_pkt.hop_limit) ofmsgs.extend( self._add_host_fib_route(vlan, src_ip)) ofmsgs.append( valve_of.packetout(in_port, nd_reply.data)) self.logger.info( 'Responded to ND solicit for %s to %s (%s)', solicited_ip, src_ip, eth_src) elif icmpv6_type == icmpv6.ND_NEIGHBOR_ADVERT: ofmsgs.extend(self._update_nexthop( vlan, in_port, eth_src, src_ip)) self.logger.info( 'ND advert %s (%s)', src_ip, eth_src) elif vlan.from_connected_to_vip(src_ip, dst_ip): if (icmpv6_type == icmpv6.ICMPV6_ECHO_REQUEST and pkt_meta.eth_dst == self.faucet_mac): icmpv6_echo_reply = valve_packet.icmpv6_echo_reply( self.faucet_mac, eth_src, vid, dst_ip, src_ip, ipv6_pkt.hop_limit, icmpv6_pkt.data.id, icmpv6_pkt.data.seq, icmpv6_pkt.data.data) ofmsgs.append( valve_of.packetout(in_port, icmpv6_echo_reply.data)) return ofmsgs