adding unit tests for decoder framework
[l2switch.git] / packethandler / implementation / src / main / java / org / opendaylight / l2switch / packethandler / RawPacketHandler.java
1 package org.opendaylight.l2switch.packethandler;
2
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;
18
19 /**
20  * RawPacketHandler subscribes to RawPacket in event. Calls the Ethernet decoder to
21  */
22 public class RawPacketHandler implements PacketProcessingListener {
23   private final static Logger _logger = LoggerFactory.getLogger(RawPacketHandler.class);
24
25   private NotificationProviderService notificationProviderService;
26   private PacketNotificationRegistry packetNotificationRegistry;
27   private DecoderRegistry decoderRegistry;
28
29   public void setDecoderRegistry(DecoderRegistry decoderRegistry) {
30     this.decoderRegistry = decoderRegistry;
31   }
32
33   public void setPacketNotificationRegistry(PacketNotificationRegistry packetNotificationRegistry) {
34     this.packetNotificationRegistry = packetNotificationRegistry;
35   }
36
37
38   public void setNotificationProviderService(NotificationProviderService notificationProviderService) {
39     this.notificationProviderService = notificationProviderService;
40   }
41
42   @Override
43   public void onPacketReceived(PacketReceived packetReceived) {
44
45     if(packetReceived == null) return;
46
47     EthernetPacket ethernetPacket = null;
48     try{
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);
53     }
54
55     if(ethernetPacket==null) {
56       _logger.info("RawPacket could not be decoded as Ethernet Packet.");
57       return;
58     }
59
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);
65     }
66
67     if(!packetNotificationRegistry.isListenerSubscribed(ethernetPacket.getEthertype())) {
68       _logger.info("No Listener is subscribed for {} notification.",ethernetPacket.getEthertype());
69       return;
70     }
71
72     PacketDecoder packetDecoder = decoderRegistry.getDecoder(ethernetPacket.getEthertype());
73
74     if(packetDecoder==null) {
75       _logger.info("No Decode is available for {} packet.",ethernetPacket.getEthertype());
76       return;
77     }
78
79     EthernetPacketGrp decodedEthernetPacket;
80
81     decodedEthernetPacket = packetDecoder.decode(ethernetPacket);
82
83     Notification packetInNotification = packetDecoder.buildPacketNotification(decodedEthernetPacket);
84
85     notificationProviderService.publish(packetInNotification);
86   }
87
88 }