1 package org.opendaylight.l2switch.packethandler;
3 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
4 import org.opendaylight.controller.sal.packet.BufferException;
5 import org.opendaylight.l2switch.packethandler.decoders.DecoderRegistry;
6 import org.opendaylight.l2switch.packethandler.decoders.EthernetDecoder;
7 import org.opendaylight.l2switch.packethandler.decoders.PacketDecoder;
8 import org.opendaylight.l2switch.packethandler.decoders.PacketNotificationRegistry;
9 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.ethernet.rev140528.EthernetPacket;
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.ethernet.rev140528.EthernetPacketGrp;
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.ethernet.rev140528.EthernetPacketReceived;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.ethernet.rev140528.EthernetPacketReceivedBuilder;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingListener;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketReceived;
15 import org.opendaylight.yangtools.yang.binding.Notification;
16 import org.slf4j.Logger;
17 import org.slf4j.LoggerFactory;
20 * RawPacketHandler subscribes to RawPacket in event. Calls the Ethernet decoder to
22 public class RawPacketHandler implements PacketProcessingListener {
23 private final static Logger _logger = LoggerFactory.getLogger(RawPacketHandler.class);
25 private NotificationProviderService notificationProviderService;
26 private PacketNotificationRegistry packetNotificationRegistry;
27 private DecoderRegistry decoderRegistry;
29 public void setDecoderRegistry(DecoderRegistry decoderRegistry) {
30 this.decoderRegistry = decoderRegistry;
33 public void setPacketNotificationRegistry(PacketNotificationRegistry packetNotificationRegistry) {
34 this.packetNotificationRegistry = packetNotificationRegistry;
38 public void setNotificationProviderService(NotificationProviderService notificationProviderService) {
39 this.notificationProviderService = notificationProviderService;
43 public void onPacketReceived(PacketReceived packetReceived) {
45 if(packetReceived == null) return;
47 EthernetPacket ethernetPacket = null;
49 ethernetPacket = EthernetDecoder.decode(packetReceived);
50 }catch(BufferException be){
51 _logger.info("EthernetDecoder Failed on {} packet received.",packetReceived);
52 throw new RuntimeException("EthernetDecode Failed.",be);
55 if(ethernetPacket==null) {
56 _logger.info("RawPacket could not be decoded as Ethernet Packet.");
60 // publish ethernet notification if listener is subscribed
61 if(packetNotificationRegistry.isListenerSubscribed(EthernetPacketReceived.class)) {
62 EthernetPacketReceivedBuilder ethernetPacketReceivedBuilder = new EthernetPacketReceivedBuilder(ethernetPacket);
63 EthernetPacketReceived ethernetNotification = ethernetPacketReceivedBuilder.build();
64 notificationProviderService.publish(ethernetNotification);
67 if(!packetNotificationRegistry.isListenerSubscribed(ethernetPacket.getEthertype())) {
68 _logger.info("No Listener is subscribed for {} notification.",ethernetPacket.getEthertype());
72 PacketDecoder packetDecoder = decoderRegistry.getDecoder(ethernetPacket.getEthertype());
74 if(packetDecoder==null) {
75 _logger.info("No Decode is available for {} packet.",ethernetPacket.getEthertype());
79 EthernetPacketGrp decodedEthernetPacket;
81 decodedEthernetPacket = packetDecoder.decode(ethernetPacket);
83 Notification packetInNotification = packetDecoder.buildPacketNotification(decodedEthernetPacket);
85 notificationProviderService.publish(packetInNotification);