2 * Copyright IBM Corporation, 2013. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.openflowplugin.openflow.md.core.session;
10 import java.math.BigInteger;
11 import java.net.InetSocketAddress;
12 import java.util.HashMap;
13 import java.util.Iterator;
14 import java.util.List;
16 import java.util.Map.Entry;
18 import java.util.concurrent.Future;
19 import org.junit.Assert;
20 import org.junit.Before;
21 import org.junit.Test;
22 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
23 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionReadyListener;
24 import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueueHandler;
25 import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueueHandlerRegistration;
26 import org.opendaylight.openflowplugin.api.OFConstants;
27 import org.opendaylight.openflowplugin.api.openflow.md.ModelDrivenSwitch;
28 import org.opendaylight.openflowplugin.api.openflow.md.core.ConnectionConductor;
29 import org.opendaylight.openflowplugin.api.openflow.md.core.ErrorHandler;
30 import org.opendaylight.openflowplugin.api.openflow.md.core.NotificationEnqueuer;
31 import org.opendaylight.openflowplugin.api.openflow.md.core.NotificationQueueWrapper;
32 import org.opendaylight.openflowplugin.api.openflow.md.core.SwitchConnectionDistinguisher;
33 import org.opendaylight.openflowplugin.api.openflow.md.core.session.IMessageDispatchService;
34 import org.opendaylight.openflowplugin.api.openflow.md.core.session.SessionContext;
35 import org.opendaylight.openflowplugin.api.openflow.md.core.session.SwitchSessionKeyOF;
36 import org.opendaylight.openflowplugin.api.openflow.md.queue.QueueProcessor;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ControllerRole;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInputBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoInput;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoOutput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoReplyInput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInputBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncInput;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncInputBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutput;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigInput;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigInputBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigOutput;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesInput;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesInputBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigInput;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigInputBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigOutput;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInput;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInputBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortGrouping;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestInput;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestInputBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestOutput;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetConfigInput;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.TableModInput;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.TableModInputBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
78 import org.opendaylight.yangtools.concepts.CompositeObjectRegistration;
79 import org.opendaylight.yangtools.yang.binding.DataObject;
80 import org.opendaylight.yangtools.yang.common.RpcError;
81 import org.opendaylight.yangtools.yang.common.RpcResult;
84 * test for {@link MessageDispatchServiceImpl}
86 public class MessageDispatchServiceImplTest {
88 MockSessionContext session;
91 * @throws java.lang.Exception
94 public void setUp() throws Exception {
95 session = new MockSessionContext(0);
100 * Test barrier message for null cookie
105 public void testBarrierMessageForPrimary() throws Exception {
106 MockConnectionConductor conductor = new MockConnectionConductor(1);
107 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
108 BarrierInputBuilder barrierMsg = new BarrierInputBuilder();
109 session.getMessageDispatchService().barrier(barrierMsg.build(), cookie);
110 Assert.assertEquals(MessageType.BARRIER, session.getPrimaryConductor()
115 * Test experimenter message for null cookie
118 public void testExperimenter() {
119 MockConnectionConductor conductor = new MockConnectionConductor(1);
120 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
121 ExperimenterInputBuilder experimenterInputBuilder = new ExperimenterInputBuilder();
122 session.getMessageDispatchService().experimenter(
123 experimenterInputBuilder.build(), cookie);
124 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor()
129 * Test get async input with null cookie
132 public void testGetAsync() {
133 MockConnectionConductor conductor = new MockConnectionConductor(1);
134 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
135 GetAsyncInputBuilder getAsyncInputBuilder = new GetAsyncInputBuilder();
136 session.getMessageDispatchService().getAsync(
137 getAsyncInputBuilder.build(), cookie);
138 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor()
143 * Test get async output with null cookie
146 public void testGetConfig() {
147 MockConnectionConductor conductor = new MockConnectionConductor(1);
148 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
149 GetConfigInputBuilder getConfigInputBuilder = new GetConfigInputBuilder();
150 session.getMessageDispatchService().getConfig(
151 getConfigInputBuilder.build(), cookie);
152 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor()
157 * Test get features with null cookie
160 public void testGetFeatures() {
161 MockConnectionConductor conductor = new MockConnectionConductor(1);
162 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
163 GetFeaturesInputBuilder getFeaturesInputBuilder = new GetFeaturesInputBuilder();
164 session.getMessageDispatchService().getFeatures(
165 getFeaturesInputBuilder.build(), cookie);
166 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor()
171 * Test get queue config with null cookie
174 public void testGetQueueConfig() {
175 MockConnectionConductor conductor = new MockConnectionConductor(1);
176 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
177 GetQueueConfigInputBuilder getQueueConfigInputBuilder = new GetQueueConfigInputBuilder();
178 session.getMessageDispatchService().getQueueConfig(
179 getQueueConfigInputBuilder.build(), cookie);
180 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor()
185 * Test multipart request with null cookie
188 public void testGetMultipart() {
189 MockConnectionConductor conductor = new MockConnectionConductor(1);
190 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
191 MultipartRequestInputBuilder multipartRequestInputBuilder = new MultipartRequestInputBuilder();
192 session.getMessageDispatchService().multipartRequest(
193 multipartRequestInputBuilder.build(), cookie);
194 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor()
199 * Test role request with null cookie
202 public void testRoleRequest() {
203 MockConnectionConductor conductor = new MockConnectionConductor(1);
204 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
205 RoleRequestInputBuilder roleRequestInputBuilder = new RoleRequestInputBuilder();
206 session.getMessageDispatchService().roleRequest(
207 roleRequestInputBuilder.build(), cookie);
208 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor()
213 * Test table mod with null cookie
216 public void testTableMod() {
217 MockConnectionConductor conductor = new MockConnectionConductor(1);
218 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
219 TableModInputBuilder tableModInputBuilder = new TableModInputBuilder();
220 session.getMessageDispatchService().tableMod(
221 tableModInputBuilder.build(), cookie);
222 Assert.assertEquals(MessageType.TABLEMOD, session.getPrimaryConductor()
227 * Test packet out message for primary connection
232 public void testPacketOutMessageForPrimary() throws Exception {
233 session.getMessageDispatchService().packetOut(null, null);
234 Assert.assertEquals(MessageType.PACKETOUT, session
235 .getPrimaryConductor().getMessageType());
239 * Test packet out message for auxiliary connection
244 public void testPacketOutMessageForAuxiliary() throws Exception {
245 MockConnectionConductor conductor = new MockConnectionConductor(1);
246 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
247 session.addAuxiliaryConductor(cookie, conductor);
248 session.getMessageDispatchService().packetOut(null, cookie);
249 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor()
251 conductor = (MockConnectionConductor) session
252 .getAuxiliaryConductor(cookie);
253 Assert.assertEquals(MessageType.PACKETOUT, conductor.getMessageType());
257 * Test packet out message when multiple auxiliary connection exist
262 public void testPacketOutMessageForMultipleAuxiliary() throws Exception {
263 MockConnectionConductor conductor1 = new MockConnectionConductor(1);
264 SwitchConnectionDistinguisher cookie1 = conductor1.getAuxiliaryKey();
265 session.addAuxiliaryConductor(cookie1, conductor1);
266 MockConnectionConductor conductor2 = new MockConnectionConductor(2);
267 SwitchConnectionDistinguisher cookie2 = conductor2.getAuxiliaryKey();
268 session.addAuxiliaryConductor(cookie2, conductor2);
269 MockConnectionConductor conductor3 = new MockConnectionConductor(3);
270 SwitchConnectionDistinguisher cookie3 = conductor3.getAuxiliaryKey();
271 session.addAuxiliaryConductor(cookie3, conductor3);
272 PacketOutInputBuilder builder = new PacketOutInputBuilder();
274 session.getMessageDispatchService().packetOut(builder.build(), cookie2);
276 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor()
279 conductor3 = (MockConnectionConductor) session
280 .getAuxiliaryConductor(cookie3);
281 Assert.assertEquals(MessageType.NONE, conductor3.getMessageType());
283 conductor2 = (MockConnectionConductor) session
284 .getAuxiliaryConductor(cookie2);
285 Assert.assertEquals(MessageType.PACKETOUT, conductor2.getMessageType());
287 conductor1 = (MockConnectionConductor) session
288 .getAuxiliaryConductor(cookie1);
289 Assert.assertEquals(MessageType.NONE, conductor1.getMessageType());
294 * Test for invalid session
299 public void testInvalidSession() throws Exception {
300 session.setValid(false);
301 Future<RpcResult<Void>> resultFuture = session
302 .getMessageDispatchService().packetOut(null, null);
303 if (resultFuture.isDone()) {
304 RpcResult<Void> rpcResult = resultFuture.get();
305 Assert.assertTrue(!rpcResult.getErrors().isEmpty());
307 Iterator<RpcError> it = rpcResult.getErrors().iterator();
308 RpcError rpcError = it.next();
310 Assert.assertTrue(rpcError.getApplicationTag().equals(
311 OFConstants.APPLICATION_TAG));
312 Assert.assertTrue(rpcError.getTag().equals(
313 OFConstants.ERROR_TAG_TIMEOUT));
314 Assert.assertTrue(rpcError.getErrorType().equals(
315 RpcError.ErrorType.TRANSPORT));
321 class MockSessionContext implements SessionContext {
322 private MockConnectionConductor conductor;
323 private Map<SwitchConnectionDistinguisher, ConnectionConductor> map;
324 private IMessageDispatchService messageService;
325 private boolean isValid = true;
326 private CompositeObjectRegistration<ModelDrivenSwitch> registration;
328 private SwitchSessionKeyOF sessionKey;
330 MockSessionContext(int conductorNum) {
331 conductor = new MockConnectionConductor(conductorNum);
332 map = new HashMap<>();
333 messageService = new MessageDispatchServiceImpl(this);
334 sessionKey = new SwitchSessionKeyOF();
335 sessionKey.setDatapathId(new BigInteger("0"));
339 public MockConnectionConductor getPrimaryConductor() {
340 // TODO Auto-generated method stub
345 public GetFeaturesOutput getFeatures() {
346 // TODO Auto-generated method stub
351 public ConnectionConductor getAuxiliaryConductor(
352 SwitchConnectionDistinguisher auxiliaryKey) {
354 return map.get(auxiliaryKey);
358 public Set<Entry<SwitchConnectionDistinguisher, ConnectionConductor>> getAuxiliaryConductors() {
359 // TODO Auto-generated method stub
364 public void addAuxiliaryConductor(
365 SwitchConnectionDistinguisher auxiliaryKey,
366 ConnectionConductor conductorArg) {
367 map.put(auxiliaryKey, conductorArg);
371 public ConnectionConductor removeAuxiliaryConductor(
372 SwitchConnectionDistinguisher connectionCookie) {
373 return map.remove(connectionCookie);
377 public boolean isValid() {
378 // TODO Auto-generated method stub
383 public void setValid(boolean valid) {
388 public SwitchSessionKeyOF getSessionKey() {
393 public IMessageDispatchService getMessageDispatchService() {
394 // TODO Auto-generated method stub
395 return messageService;
399 public Long getNextXid() {
400 // TODO Auto-generated method stub
405 public Map<Long, PortGrouping> getPhysicalPorts() {
406 // TODO Auto-generated method stub
411 public Set<Long> getPorts() {
412 // TODO Auto-generated method stub
417 public PortGrouping getPhysicalPort(Long portNumber) {
418 // TODO Auto-generated method stub
423 public Boolean getPortBandwidth(Long portNumber) {
424 // TODO Auto-generated method stub
429 public boolean isPortEnabled(long portNumber) {
430 // TODO Auto-generated method stub
435 public boolean isPortEnabled(PortGrouping port) {
436 // TODO Auto-generated method stub
441 public List<PortGrouping> getEnabledPorts() {
442 // TODO Auto-generated method stub
447 public Map<Long, Boolean> getPortsBandwidth() {
448 // TODO Auto-generated method stub
453 public CompositeObjectRegistration<ModelDrivenSwitch> getProviderRegistration() {
458 public void setProviderRegistration(
459 CompositeObjectRegistration<ModelDrivenSwitch> registration) {
460 this.registration = registration;
464 public int getSeed() {
472 public void setSeed(int seed) {
477 public NotificationEnqueuer getNotificationEnqueuer() {
482 public ControllerRole getRoleOnDevice() {
487 public void setRoleOnDevice(ControllerRole roleOnDevice) {
492 class MockConnectionConductor implements ConnectionConductor,
493 NotificationEnqueuer {
495 private int conductorNum;
496 private MockConnectionAdapter adapter;
498 public MockConnectionConductor(int conductorNumber) {
499 conductorNum = conductorNumber;
500 adapter = new MockConnectionAdapter();
505 // TODO Auto-generated method stub
510 public Short getVersion() {
511 // TODO Auto-generated method stub
516 public CONDUCTOR_STATE getConductorState() {
517 // TODO Auto-generated method stub
522 public void setConductorState(CONDUCTOR_STATE conductorState) {
523 // TODO Auto-generated method stub
528 public Future<Boolean> disconnect() {
529 // TODO Auto-generated method stub
534 public void setSessionContext(SessionContext context) {
535 // TODO Auto-generated method stub
540 public void setConnectionCookie(SwitchConnectionDistinguisher auxiliaryKey) {
541 // TODO Auto-generated method stub
546 public SessionContext getSessionContext() {
547 // TODO Auto-generated method stub
552 public SwitchConnectionDistinguisher getAuxiliaryKey() {
553 if (0 != conductorNum) {
554 SwitchConnectionCookieOFImpl key = new SwitchConnectionCookieOFImpl();
555 key.setAuxiliaryId((short) conductorNum);
563 public ConnectionAdapter getConnectionAdapter() {
564 // TODO Auto-generated method stub
568 public MessageType getMessageType() {
569 return adapter.getMessageType();
573 public void setQueueProcessor(
574 QueueProcessor<OfHeader, DataObject> queueKeeper) {
579 public void setErrorHandler(ErrorHandler errorHandler) {
584 public void setId(int conductorId) {
589 public void enqueueNotification(NotificationQueueWrapper notification) {
595 NONE, BARRIER, FLOWMOD, TABLEMOD, PACKETOUT;
598 class MockConnectionAdapter implements ConnectionAdapter {
600 private MessageType messageType;
601 private ConnectionReadyListener connectionReadyListener;
602 private boolean packetInFiltering;
604 public MockConnectionAdapter() {
605 setMessageType(MessageType.NONE);
609 public Future<RpcResult<BarrierOutput>> barrier(BarrierInput input) {
610 setMessageType(MessageType.BARRIER);
615 public Future<RpcResult<EchoOutput>> echo(EchoInput input) {
616 // TODO Auto-generated method stub
621 public Future<RpcResult<Void>> echoReply(EchoReplyInput input) {
622 // TODO Auto-generated method stub
627 public Future<RpcResult<Void>> experimenter(ExperimenterInput input) {
628 // TODO Auto-generated method stub
633 public Future<RpcResult<Void>> flowMod(FlowModInput input) {
634 setMessageType(MessageType.FLOWMOD);
639 public Future<RpcResult<GetAsyncOutput>> getAsync(GetAsyncInput input) {
640 // TODO Auto-generated method stub
645 public Future<RpcResult<GetConfigOutput>> getConfig(GetConfigInput input) {
646 // TODO Auto-generated method stub
651 public Future<RpcResult<GetFeaturesOutput>> getFeatures(
652 GetFeaturesInput input) {
653 // TODO Auto-generated method stub
658 public Future<RpcResult<GetQueueConfigOutput>> getQueueConfig(
659 GetQueueConfigInput input) {
660 // TODO Auto-generated method stub
665 public Future<RpcResult<Void>> groupMod(GroupModInput input) {
666 // TODO Auto-generated method stub
671 public Future<RpcResult<Void>> hello(HelloInput input) {
672 // TODO Auto-generated method stub
677 public Future<RpcResult<Void>> meterMod(MeterModInput input) {
678 // TODO Auto-generated method stub
683 public Future<RpcResult<Void>> packetOut(PacketOutInput input) {
684 setMessageType(MessageType.PACKETOUT);
689 public Future<RpcResult<Void>> portMod(PortModInput input) {
690 // TODO Auto-generated method stub
695 public Future<RpcResult<RoleRequestOutput>> roleRequest(
696 RoleRequestInput input) {
697 // TODO Auto-generated method stub
702 public Future<RpcResult<Void>> setAsync(SetAsyncInput input) {
703 // TODO Auto-generated method stub
708 public Future<RpcResult<Void>> setConfig(SetConfigInput input) {
709 // TODO Auto-generated method stub
714 public Future<RpcResult<Void>> tableMod(TableModInput input) {
715 setMessageType(MessageType.TABLEMOD);
720 public Future<Boolean> disconnect() {
721 // TODO Auto-generated method stub
726 public boolean isAlive() {
727 // TODO Auto-generated method stub
732 public void setMessageListener(OpenflowProtocolListener messageListener) {
733 // TODO Auto-generated method stub
738 public void setSystemListener(SystemNotificationsListener systemListener) {
739 // TODO Auto-generated method stub
744 public void checkListeners() {
745 // TODO Auto-generated method stub
750 * @return the messageType
752 public MessageType getMessageType() {
758 * the messageType to set
760 public void setMessageType(MessageType messageType) {
761 this.messageType = messageType;
765 public void fireConnectionReadyNotification() {
766 connectionReadyListener.onConnectionReady();
770 public void setConnectionReadyListener(
771 ConnectionReadyListener connectionReadyListener) {
772 this.connectionReadyListener = connectionReadyListener;
776 public Future<RpcResult<Void>> multipartRequest(MultipartRequestInput input) {
777 // TODO Auto-generated method stub
785 * org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter
786 * #getRemoteAddress()
789 public InetSocketAddress getRemoteAddress() {
790 // TODO Auto-generated method stub
795 public boolean isAutoRead() {
796 // TODO Auto-generated method stub
801 public <T extends OutboundQueueHandler> OutboundQueueHandlerRegistration<T> registerOutboundQueueHandler(final T t, final int i, final long l) {
806 public void setAutoRead(boolean arg0) {
807 // TODO Auto-generated method stub
812 public void setPacketInFiltering(boolean packetInFiltering) {
813 this.packetInFiltering = packetInFiltering;