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 = ipaddress.IPv6Address(btos(ipv6_pkt.src)) dst_ip = ipaddress.IPv6Address(btos(ipv6_pkt.dst)) icmpv6_type = icmpv6_pkt.type_ ofmsgs = [] if vlan.ip_in_vip_subnet(src_ip): port = pkt_meta.port vid = self._vlan_vid(vlan, port) eth_src = pkt_meta.eth_src if icmpv6_type == icmpv6.ND_NEIGHBOR_SOLICIT: solicited_ip = btos(icmpv6_pkt.data.dst) if vlan.is_faucet_vip(ipaddress.ip_address(solicited_ip)): ofmsgs.extend( self._add_host_fib_route(vlan, src_ip)) ofmsgs.extend(self._update_nexthop( vlan, port, eth_src, src_ip)) nd_reply = valve_packet.nd_advert( vid, self.faucet_mac, eth_src, solicited_ip, src_ip, ipv6_pkt.hop_limit) ofmsgs.append( valve_of.packetout(port.number, 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, port, eth_src, src_ip)) self.logger.info( 'ND advert %s (%s)', src_ip, eth_src) elif icmpv6_type == icmpv6.ND_ROUTER_SOLICIT: link_local_vips, other_vips = self._link_and_other_vips(vlan) for vip in link_local_vips: if src_ip in vip.network: ra_advert = valve_packet.router_advert( vid, self.faucet_mac, eth_src, vip.ip, src_ip, other_vips) ofmsgs.append( valve_of.packetout(port.number, ra_advert.data)) self.logger.info( 'Responded to RS solicit from %s (%s) to VIP %s', src_ip, eth_src, vip) break 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( vid, self.faucet_mac, eth_src, 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(port.number, icmpv6_echo_reply.data)) return ofmsgs
def _control_plane_arp_handler(self, pkt_meta): ofmsgs = [] pkt_meta.reparse_ip(ether.ETH_TYPE_ARP) arp_pkt = pkt_meta.pkt.get_protocol(arp.arp) if arp_pkt is None: return ofmsgs src_ip = ipaddress.IPv4Address(btos(arp_pkt.src_ip)) dst_ip = ipaddress.IPv4Address(btos(arp_pkt.dst_ip)) vlan = pkt_meta.vlan if vlan.from_connected_to_vip(src_ip, dst_ip): opcode = arp_pkt.opcode port = pkt_meta.port eth_src = pkt_meta.eth_src vid = self._vlan_vid(vlan, port) if opcode == arp.ARP_REQUEST: ofmsgs.extend( self._add_host_fib_route(vlan, src_ip)) ofmsgs.extend(self._update_nexthop( vlan, port, eth_src, src_ip)) arp_reply = valve_packet.arp_reply( vid, vlan.faucet_mac, eth_src, dst_ip, src_ip) ofmsgs.append( valve_of.packetout(port.number, arp_reply.data)) self.logger.info( 'Responded to ARP request for %s from %s (%s) on VLAN %u' % ( dst_ip, src_ip, eth_src, vlan.vid)) elif (opcode == arp.ARP_REPLY and pkt_meta.eth_dst == vlan.faucet_mac): ofmsgs.extend( self._update_nexthop(vlan, port, eth_src, src_ip)) self.logger.info( 'ARP response %s (%s) on VLAN %u' % ( src_ip, eth_src, vlan.vid)) return ofmsgs
def _control_plane_arp_handler(self, pkt_meta, arp_pkt): src_ip = ipaddr.IPv4Address(arp_pkt.src_ip) dst_ip = ipaddr.IPv4Address(arp_pkt.dst_ip) vlan = pkt_meta.vlan opcode = arp_pkt.opcode ofmsgs = [] if vlan.from_connected_to_vip(src_ip, dst_ip): in_port = pkt_meta.port.number vid = self._vlan_vid(vlan, in_port) eth_src = pkt_meta.eth_src if opcode == arp.ARP_REQUEST: arp_reply = valve_packet.arp_reply( self.faucet_mac, eth_src, vid, dst_ip, src_ip) ofmsgs.extend( self._add_host_fib_route(vlan, src_ip)) ofmsgs.append( valve_of.packetout(in_port, arp_reply.data)) self.logger.info( 'Responded to ARP request for %s from %s (%s)', dst_ip, src_ip, eth_src) elif (opcode == arp.ARP_REPLY and pkt_meta.eth_dst == self.faucet_mac): ofmsgs.extend( self._update_nexthop(vlan, in_port, eth_src, src_ip)) self.logger.info( 'ARP response %s (%s)', src_ip, eth_src) return ofmsgs
def _control_plane_arp_handler(self, pkt_meta, arp_pkt): src_ip = ipaddress.IPv4Address(btos(arp_pkt.src_ip)) dst_ip = ipaddress.IPv4Address(btos(arp_pkt.dst_ip)) vlan = pkt_meta.vlan opcode = arp_pkt.opcode ofmsgs = [] if vlan.from_connected_to_vip(src_ip, dst_ip): port = pkt_meta.port eth_src = pkt_meta.eth_src if opcode == arp.ARP_REQUEST: ofmsgs.extend(self._add_host_fib_route(vlan, src_ip)) ofmsgs.extend(self._update_nexthop(vlan, port, eth_src, src_ip)) vid = self._vlan_vid(vlan, port) arp_reply = valve_packet.arp_reply(vid, self.faucet_mac, eth_src, dst_ip, src_ip) ofmsgs.append(valve_of.packetout(port.number, arp_reply.data)) self.logger.info( 'Responded to ARP request for %s from %s (%s)', dst_ip, src_ip, eth_src) elif (opcode == arp.ARP_REPLY and pkt_meta.eth_dst == self.faucet_mac): ofmsgs.extend(self._update_nexthop(vlan, port, eth_src, src_ip)) self.logger.info('ARP response %s (%s)', src_ip, eth_src) return ofmsgs
def flood_pkt(self, packet_builder, *args): ofmsgs = [] for vid, ports in ((self.vid, self.tagged_flood_ports(False)), (None, self.untagged_flood_ports(False))): if ports: pkt = packet_builder(vid, *args) for port in ports: ofmsgs.append(valve_of.packetout(port.number, pkt.data)) return ofmsgs
def _neighbor_resolver(self, ip_gw, faucet_vip, vlan, ports): ofmsgs = [] if ports: port_num = ports[0].number vid = self._vlan_vid(vlan, port_num) resolver_pkt = self._neighbor_resolver_pkt(vid, faucet_vip, ip_gw) for port in ports: ofmsgs.append( valve_of.packetout(port.number, resolver_pkt.data)) return ofmsgs
def _neighbor_resolver(self, ip_gw, faucet_vip, vlan, ports): ofmsgs = [] if ports: self.logger.info('Resolving %s', ip_gw) port_num = ports[0].number vid = self._vlan_vid(vlan, port_num) resolver_pkt = self._neighbor_resolver_pkt( vid, faucet_vip, ip_gw) for port in ports: ofmsgs.append(valve_of.packetout( port.number, resolver_pkt.data)) return ofmsgs
def _neighbor_resolver(self, ip_gw, controller_ip, vlan, ports): ofmsgs = [] if ports: self.logger.info('Resolving %s', ip_gw) port_num = ports[0].number vid = self._vlan_vid(vlan, port_num) resolver_pkt = self._neighbor_resolver_pkt(vid, controller_ip, ip_gw) for port in ports: ofmsgs.append( valve_of.packetout(port.number, resolver_pkt.data)) return ofmsgs
def control_plane_icmp_handler(self, in_port, vlan, eth_src, ipv4_pkt, icmp_pkt): ofmsgs = [] src_ip = ipaddr.IPv4Address(ipv4_pkt.src) dst_ip = ipaddr.IPv4Address(ipv4_pkt.dst) if (icmp_pkt is not None and vlan.ip_in_controller_subnet(src_ip) and vlan.ip_in_controller_subnet(dst_ip)): vid = self._vlan_vid(vlan, in_port) echo_reply = valve_packet.echo_reply(self.faucet_mac, eth_src, vid, dst_ip, src_ip, icmp_pkt.data) ofmsgs.append(valve_of.packetout(in_port, 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
def control_plane_icmp_handler(self, in_port, vlan, eth_src, ipv4_pkt, icmp_pkt): ofmsgs = [] src_ip = ipaddr.IPv4Address(ipv4_pkt.src) dst_ip = ipaddr.IPv4Address(ipv4_pkt.dst) if (icmp_pkt is not None and vlan.ip_in_controller_subnet(src_ip) and vlan.ip_in_controller_subnet(dst_ip)): vid = self._vlan_vid(vlan, in_port) echo_reply = valve_packet.echo_reply( self.faucet_mac, eth_src, vid, dst_ip, src_ip, icmp_pkt.data) ofmsgs.append(valve_of.packetout(in_port, echo_reply.data)) return ofmsgs
def _control_plane_icmp_handler(self, pkt_meta, ipv4_pkt, icmp_pkt): src_ip = ipaddress.IPv4Address(btos(ipv4_pkt.src)) dst_ip = ipaddress.IPv4Address(btos(ipv4_pkt.dst)) vlan = pkt_meta.vlan icmpv4_type = icmp_pkt.type ofmsgs = [] if vlan.from_connected_to_vip(src_ip, dst_ip): if (icmpv4_type == icmp.ICMP_ECHO_REQUEST and pkt_meta.eth_dst == self.faucet_mac): port = pkt_meta.port vid = self._vlan_vid(vlan, port) echo_reply = valve_packet.echo_reply(vid, self.faucet_mac, pkt_meta.eth_src, dst_ip, src_ip, icmp_pkt.data) ofmsgs.append(valve_of.packetout(port.number, echo_reply.data)) return ofmsgs
def _control_plane_icmp_handler(self, pkt_meta, ipv4_pkt, icmp_pkt): src_ip = ipaddr.IPv4Address(ipv4_pkt.src) dst_ip = ipaddr.IPv4Address(ipv4_pkt.dst) vlan = pkt_meta.vlan icmpv4_type = icmp_pkt.type ofmsgs = [] if vlan.from_connected_to_vip(src_ip, dst_ip): if (icmpv4_type == icmp.ICMP_ECHO_REQUEST and pkt_meta.eth_dst == self.faucet_mac): in_port = pkt_meta.port.number vid = self._vlan_vid(vlan, in_port) echo_reply = valve_packet.echo_reply( self.faucet_mac, pkt_meta.eth_src, vid, dst_ip, src_ip, icmp_pkt.data) ofmsgs.append( valve_of.packetout(in_port, echo_reply.data)) return ofmsgs
def control_plane_arp_handler(self, in_port, vlan, eth_src, eth_dst, arp_pkt): ofmsgs = [] opcode = arp_pkt.opcode src_ip = ipaddr.IPv4Address(arp_pkt.src_ip) dst_ip = ipaddr.IPv4Address(arp_pkt.dst_ip) if (opcode == arp.ARP_REQUEST and vlan.ip_in_controller_subnet(src_ip) and vlan.ip_in_controller_subnet(dst_ip)): vid = self._vlan_vid(vlan, in_port) arp_reply = valve_packet.arp_reply( self.faucet_mac, eth_src, vid, dst_ip, src_ip) ofmsgs.append(valve_of.packetout(in_port, arp_reply.data)) self.logger.info( 'Responded to ARP request for %s from %s', src_ip, dst_ip) elif (opcode == arp.ARP_REPLY and eth_dst == self.faucet_mac and vlan.ip_in_controller_subnet(src_ip) and vlan.ip_in_controller_subnet(dst_ip)): self.logger.info('ARP response %s for %s', eth_src, src_ip) ofmsgs.extend(self._update_nexthop(vlan, eth_src, src_ip)) return ofmsgs
def control_plane_arp_handler(self, in_port, vlan, eth_src, eth_dst, arp_pkt): ofmsgs = [] opcode = arp_pkt.opcode src_ip = ipaddr.IPv4Address(arp_pkt.src_ip) dst_ip = ipaddr.IPv4Address(arp_pkt.dst_ip) if (opcode == arp.ARP_REQUEST and vlan.ip_in_controller_subnet(src_ip) and vlan.ip_in_controller_subnet(dst_ip)): vid = self._vlan_vid(vlan, in_port) arp_reply = valve_packet.arp_reply(self.faucet_mac, eth_src, vid, dst_ip, src_ip) ofmsgs.append(valve_of.packetout(in_port, arp_reply.data)) ofmsgs.extend(self._add_host_fib_route(vlan, src_ip)) self.logger.info('Responded to ARP request for %s from %s', src_ip, dst_ip) elif (opcode == arp.ARP_REPLY and eth_dst == self.faucet_mac and vlan.ip_in_controller_subnet(src_ip) and vlan.ip_in_controller_subnet(dst_ip)): self.logger.info('ARP response %s for %s', eth_src, src_ip) ofmsgs.extend(self._update_nexthop(vlan, eth_src, src_ip)) return ofmsgs
def _control_plane_icmp_handler(self, pkt_meta, ipv4_pkt): ofmsgs = [] src_ip = ipaddress.IPv4Address(btos(ipv4_pkt.src)) dst_ip = ipaddress.IPv4Address(btos(ipv4_pkt.dst)) vlan = pkt_meta.vlan if vlan.from_connected_to_vip(src_ip, dst_ip): if pkt_meta.eth_dst != vlan.faucet_mac: return ofmsgs if ipv4_pkt.proto != inet.IPPROTO_ICMP: return ofmsgs pkt_meta.reparse_all() icmp_pkt = pkt_meta.pkt.get_protocol(icmp.icmp) if icmp_pkt is None: return ofmsgs if icmp_pkt.type == icmp.ICMP_ECHO_REQUEST: port = pkt_meta.port vid = self._vlan_vid(vlan, port) echo_reply = valve_packet.echo_reply(vid, vlan.faucet_mac, pkt_meta.eth_src, dst_ip, src_ip, icmp_pkt.data) ofmsgs.append(valve_of.packetout(port.number, echo_reply.data)) return ofmsgs
def _control_plane_icmpv6_handler(self, pkt_meta, ipv6_pkt): ofmsgs = [] src_ip = ipaddress.IPv6Address(btos(ipv6_pkt.src)) dst_ip = ipaddress.IPv6Address(btos(ipv6_pkt.dst)) vlan = pkt_meta.vlan if vlan.ip_in_vip_subnet(src_ip): # Must be ICMPv6 and have no extended headers. if ipv6_pkt.nxt != inet.IPPROTO_ICMPV6: return ofmsgs if ipv6_pkt.ext_hdrs: return ofmsgs # Explicitly ignore messages to all notes. if dst_ip == valve_packet.IPV6_ALL_NODES: return ofmsgs pkt_meta.reparse_ip(self.ETH_TYPE, payload=32) icmpv6_pkt = pkt_meta.pkt.get_protocol(icmpv6.icmpv6) if icmpv6_pkt is None: return ofmsgs icmpv6_type = icmpv6_pkt.type_ if (ipv6_pkt.hop_limit != valve_packet.IPV6_MAX_HOP_LIM and icmpv6_type != icmpv6.ICMPV6_ECHO_REQUEST): return ofmsgs port = pkt_meta.port vid = self._vlan_vid(vlan, port) eth_src = pkt_meta.eth_src if icmpv6_type == icmpv6.ND_NEIGHBOR_SOLICIT: solicited_ip = btos(icmpv6_pkt.data.dst) if vlan.is_faucet_vip(ipaddress.ip_address(solicited_ip)): ofmsgs.extend( self._add_host_fib_route(vlan, src_ip)) ofmsgs.extend(self._update_nexthop( vlan, port, eth_src, src_ip)) nd_reply = valve_packet.nd_advert( vid, vlan.faucet_mac, eth_src, solicited_ip, src_ip) ofmsgs.append( valve_of.packetout(port.number, nd_reply.data)) self.logger.info( 'Responded to ND solicit for %s to %s (%s) on VLAN %u' % ( solicited_ip, src_ip, eth_src, vlan.vid)) elif icmpv6_type == icmpv6.ND_NEIGHBOR_ADVERT: ofmsgs.extend(self._update_nexthop( vlan, port, eth_src, src_ip)) self.logger.info( 'ND advert %s (%s) on VLAN %u' % ( src_ip, eth_src, vlan.vid)) elif icmpv6_type == icmpv6.ND_ROUTER_SOLICIT: link_local_vips, other_vips = self._link_and_other_vips(vlan) for vip in link_local_vips: if src_ip in vip.network: ofmsgs.extend( self._add_host_fib_route(vlan, src_ip)) ofmsgs.extend(self._update_nexthop( vlan, port, eth_src, src_ip)) ra_advert = valve_packet.router_advert( vlan, vid, vlan.faucet_mac, eth_src, vip.ip, src_ip, other_vips) ofmsgs.append( valve_of.packetout(port.number, ra_advert.data)) self.logger.info( 'Responded to RS solicit from %s (%s) to VIP %s on VLAN %u' % ( src_ip, eth_src, vip, vlan.vid)) break elif icmpv6_type == icmpv6.ICMPV6_ECHO_REQUEST: if (vlan.from_connected_to_vip(src_ip, dst_ip) and pkt_meta.eth_dst == vlan.faucet_mac): icmpv6_echo_reply = valve_packet.icmpv6_echo_reply( vid, vlan.faucet_mac, eth_src, 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(port.number, icmpv6_echo_reply.data)) return ofmsgs