*/
package org.opendaylight.controller.config.yang.bgp.rib.impl;
+import java.util.HashMap;
+import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionPreferences;
import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionProposal;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateSubsequentAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
/**
*
*/
-public final class BGPSessionProposalImplModule
- extends
+public final class BGPSessionProposalImplModule extends
org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPSessionProposalImplModule {
- public BGPSessionProposalImplModule(
- org.opendaylight.controller.config.api.ModuleIdentifier name,
- org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+ public BGPSessionProposalImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier name,
+ final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
super(name, dependencyResolver);
}
- public BGPSessionProposalImplModule(
- org.opendaylight.controller.config.api.ModuleIdentifier name,
- org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
- BGPSessionProposalImplModule oldModule,
- java.lang.AutoCloseable oldInstance) {
+ public BGPSessionProposalImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier name,
+ final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
+ final BGPSessionProposalImplModule oldModule, final java.lang.AutoCloseable oldInstance) {
super(name, dependencyResolver, oldModule, oldInstance);
}
@Override
public void validate() {
super.validate();
- JmxAttributeValidationException.checkNotNull(getBgpId(),
- "value is not set.", bgpIdJmxAttribute);
- JmxAttributeValidationException.checkCondition(
- isValidIPv4Address(getBgpId()), "value " + getBgpId()
- + " is not valid IPv4 address", bgpIdJmxAttribute);
-
- JmxAttributeValidationException.checkNotNull(getAsNumber(),
- "value is not set.", asNumberJmxAttribute);
- JmxAttributeValidationException.checkCondition(getAsNumber() >= 0,
- "value must be greather than 0", asNumberJmxAttribute);
-
- JmxAttributeValidationException.checkNotNull(getHoldtimer(),
- "value is not set.", holdtimerJmxAttribute);
- JmxAttributeValidationException.checkCondition((getHoldtimer() == 0) || (getHoldtimer() >= 3),
- "value must be 0 or 3 and more", holdtimerJmxAttribute);
+ JmxAttributeValidationException.checkNotNull(getBgpId(), "value is not set.", this.bgpIdJmxAttribute);
+ JmxAttributeValidationException.checkCondition(isValidIPv4Address(getBgpId()),
+ "value " + getBgpId() + " is not valid IPv4 address", this.bgpIdJmxAttribute);
+
+ JmxAttributeValidationException.checkNotNull(getAsNumber(), "value is not set.", this.asNumberJmxAttribute);
+ JmxAttributeValidationException.checkCondition(getAsNumber() >= 0, "value must be greather than 0", this.asNumberJmxAttribute);
+
+ JmxAttributeValidationException.checkNotNull(getHoldtimer(), "value is not set.", this.holdtimerJmxAttribute);
+ JmxAttributeValidationException.checkCondition((getHoldtimer() == 0) || (getHoldtimer() >= 3), "value must be 0 or 3 and more",
+ this.holdtimerJmxAttribute);
}
@Override
public java.lang.AutoCloseable createInstance() {
final Ipv4Address bgpId = new Ipv4Address(getBgpId());
- final BGPSessionProposalImpl bgpSessionProposal = new BGPSessionProposalImpl(
- getHoldtimer(), getAsNumber(), bgpId);
+ final Map<Class<? extends AddressFamily>, Class<? extends SubsequentAddressFamily>> tables = new HashMap<>();
+ tables.put(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class);
+ tables.put(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
+ final BGPSessionProposalImpl bgpSessionProposal = new BGPSessionProposalImpl(getHoldtimer(), getAsNumber(), bgpId, tables);
return new BgpSessionProposalCloseable(bgpSessionProposal);
}
- private static final class BgpSessionProposalCloseable implements
- BGPSessionProposal, AutoCloseable {
+ private static final class BgpSessionProposalCloseable implements BGPSessionProposal, AutoCloseable {
private final BGPSessionProposalImpl inner;
- public BgpSessionProposalCloseable(
- BGPSessionProposalImpl bgpSessionProposal) {
+ public BgpSessionProposalCloseable(final BGPSessionProposalImpl bgpSessionProposal) {
this.inner = bgpSessionProposal;
}
@Override
public BGPSessionPreferences getProposal() {
- return inner.getProposal();
+ return this.inner.getProposal();
}
}
private boolean isValidIPv4Address(final String address) {
- Pattern pattern = Pattern.compile(Ipv4Address.PATTERN_CONSTANTS.get(0));
- Matcher matcher = pattern.matcher(address);
+ final Pattern pattern = Pattern.compile(Ipv4Address.PATTERN_CONSTANTS.get(0));
+ final Matcher matcher = pattern.matcher(address);
return matcher.matches();
}
}
import org.opendaylight.protocol.bgp.parser.BGPSessionListener;
import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionPreferences;
import org.opendaylight.protocol.framework.AbstractSessionNegotiator;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateAddressFamily;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateSubsequentAddressFamily;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.Keepalive;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.KeepaliveBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.Notify;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.Open;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.OpenBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.BgpParameters;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.CParameters;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.c.parameters.MultiprotocolCase;
import org.opendaylight.yangtools.yang.binding.Notification;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public void run(final Timeout timeout) throws Exception {
synchronized (lock) {
if (BGPSessionNegotiator.this.state != State.Finished) {
- BGPSessionNegotiator.this.writeMessage(new NotifyBuilder().setErrorCode(
- BGPError.HOLD_TIMER_EXPIRED.getCode()).setErrorSubcode(BGPError.HOLD_TIMER_EXPIRED.getSubcode()).build());
+ BGPSessionNegotiator.this.writeMessage(new NotifyBuilder().setErrorCode(BGPError.HOLD_TIMER_EXPIRED.getCode()).setErrorSubcode(
+ BGPError.HOLD_TIMER_EXPIRED.getSubcode()).build());
negotiationFailed(new BGPDocumentedException("HoldTimer expired", BGPError.FSM_ERROR));
BGPSessionNegotiator.this.state = State.Finished;
}
// Catch-all for unexpected message
LOG.warn("Channel {} state {} unexpected message {}", this.channel, this.state, msg);
- this.writeMessage(new NotifyBuilder().setErrorCode(BGPError.FSM_ERROR.getCode()).setErrorSubcode(
- BGPError.FSM_ERROR.getSubcode()).build());
+ this.writeMessage(new NotifyBuilder().setErrorCode(BGPError.FSM_ERROR.getCode()).setErrorSubcode(BGPError.FSM_ERROR.getSubcode()).build());
negotiationFailed(new BGPDocumentedException("Unexpected message", BGPError.FSM_ERROR));
this.state = State.Finished;
}
private void handleOpen(final Open openObj) {
final List<BgpParameters> prefs = openObj.getBgpParameters();
if (prefs != null && !prefs.isEmpty()) {
- for (final BgpParameters param : openObj.getBgpParameters()) {
- final CParameters cap = param.getCParameters();
- // FIXME: BUG-199: the reference to linkstate should be moved to config subsystem!
-
- if (cap instanceof MultiprotocolCase
- && ((MultiprotocolCase) cap).getMultiprotocolCapability().getAfi() == LinkstateAddressFamily.class
- && ((MultiprotocolCase) cap).getMultiprotocolCapability().getSafi() == LinkstateSubsequentAddressFamily.class) {
- this.remotePref = openObj;
- this.writeMessage(new KeepaliveBuilder().build());
- this.session = new BGPSessionImpl(this.timer, this.listener, this.channel, this.remotePref);
- this.state = State.OpenConfirm;
- LOG.debug("Channel {} moved to OpenConfirm state with remote proposal {}", this.channel, this.remotePref);
- return;
- }
+ if (prefs.containsAll(this.localPref.getParams())) {
+ this.remotePref = openObj;
+ this.writeMessage(new KeepaliveBuilder().build());
+ this.session = new BGPSessionImpl(this.timer, this.listener, this.channel, this.remotePref);
+ this.state = State.OpenConfirm;
+ LOG.debug("Channel {} moved to OpenConfirm state with remote proposal {}", this.channel, this.remotePref);
+ return;
}
}
final Notify ntf = new NotifyBuilder().setErrorCode(BGPError.UNSPECIFIC_OPEN_ERROR.getCode()).setErrorSubcode(
BGPError.UNSPECIFIC_OPEN_ERROR.getSubcode()).build();
this.writeMessage(ntf);
- negotiationFailed(new BGPDocumentedException("Linkstate capability is not configured on router. Check the configuration of BGP speaker.", BGPError.forValue(
+ negotiationFailed(new BGPDocumentedException("Open message unacceptable. Check the configuration of BGP speaker.", BGPError.forValue(
ntf.getErrorCode(), ntf.getErrorSubcode())));
this.state = State.Finished;
}
package org.opendaylight.protocol.bgp.rib.impl;
import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionPreferences;
import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionProposal;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateAddressFamily;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateSubsequentAddressFamily;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.BgpParameters;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.BgpParametersBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.c.parameters.As4BytesCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.c.parameters.as4.bytes._case.As4BytesCapabilityBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.c.parameters.MultiprotocolCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.c.parameters.multiprotocol._case.MultiprotocolCapabilityBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily;
import com.google.common.collect.Lists;
private final BGPSessionPreferences prefs;
- public BGPSessionProposalImpl(final short holdTimer, final int as, final Ipv4Address bgpId) {
+ public BGPSessionProposalImpl(final short holdTimer, final int as, final Ipv4Address bgpId,
+ final Map<Class<? extends AddressFamily>, Class<? extends SubsequentAddressFamily>> tables) {
this.holdTimer = holdTimer;
this.as = as;
this.bgpId = bgpId;
- // FIXME: BUG-199: the reference to linkstate should be moved to config subsystem!
final List<BgpParameters> tlvs = Lists.newArrayList();
- tlvs.add(new BgpParametersBuilder().setCParameters(
- new MultiprotocolCaseBuilder().setMultiprotocolCapability(
- new MultiprotocolCapabilityBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build()).build()).build());
- tlvs.add(new BgpParametersBuilder().setCParameters(
- new MultiprotocolCaseBuilder().setMultiprotocolCapability(
- new MultiprotocolCapabilityBuilder().setAfi(LinkstateAddressFamily.class).setSafi(
- LinkstateSubsequentAddressFamily.class).build()).build()).build());
+ for (final Entry<Class<? extends AddressFamily>, Class<? extends SubsequentAddressFamily>> e : tables.entrySet()) {
+ tlvs.add(new BgpParametersBuilder().setCParameters(
+ new MultiprotocolCaseBuilder().setMultiprotocolCapability(
+ new MultiprotocolCapabilityBuilder().setAfi(e.getKey()).setSafi(e.getValue()).build()).build()).build());
+ }
tlvs.add(new BgpParametersBuilder().setCParameters(
new As4BytesCaseBuilder().setAs4BytesCapability(
new As4BytesCapabilityBuilder().setAsNumber(new AsNumber((long) as)).build()).build()).build());
import java.net.InetAddress;
import java.net.InetSocketAddress;
+import java.util.HashMap;
+import java.util.Map;
import org.opendaylight.protocol.bgp.parser.BGPSessionListener;
import org.opendaylight.protocol.bgp.parser.spi.pojo.ServiceLoaderBGPExtensionProviderContext;
import org.opendaylight.protocol.framework.NeverReconnectStrategy;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateSubsequentAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
final BGPSessionListener sessionListener = new TestingListener();
- final BGPSessionProposalImpl prop = new BGPSessionProposalImpl(holdTimerValue, as.getValue().intValue(), new Ipv4Address("25.25.25.2"));
+ final Map<Class<? extends AddressFamily>, Class<? extends SubsequentAddressFamily>> tables = new HashMap<>();
+ tables.put(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
+ tables.put(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class);
+
+ final BGPSessionProposalImpl prop = new BGPSessionProposalImpl(holdTimerValue, as.getValue().intValue(), new Ipv4Address("25.25.25.2"), tables);
final BGPSessionPreferences proposal = prop.getProposal();
import io.netty.util.concurrent.Promise;
import java.net.InetSocketAddress;
+import java.util.HashMap;
+import java.util.Map;
import org.opendaylight.protocol.bgp.parser.BGPSessionListener;
import org.opendaylight.protocol.bgp.parser.spi.pojo.ServiceLoaderBGPExtensionProviderContext;
import org.opendaylight.protocol.framework.SessionListenerFactory;
import org.opendaylight.protocol.framework.SessionNegotiatorFactory;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateSubsequentAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
import org.opendaylight.yangtools.yang.binding.Notification;
import com.google.common.base.Preconditions;
}
};
- final BGPSessionPreferences prefs = new BGPSessionProposalImpl((short) 90, 25, new Ipv4Address("127.0.0.2")).getProposal();
+ final Map<Class<? extends AddressFamily>, Class<? extends SubsequentAddressFamily>> tables = new HashMap<>();
+ tables.put(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
+ tables.put(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class);
+
+ final BGPSessionPreferences prefs = new BGPSessionProposalImpl((short) 90, 72, new Ipv4Address("127.0.0.2"), tables).getProposal();
final SessionNegotiatorFactory<Notification, BGPSessionImpl, BGPSessionListener> snf = new BGPSessionNegotiatorFactory(new HashedWheelTimer(), prefs);
- final BGPSpeakerMock<Notification, BGPSessionImpl, BGPSessionListener> mock = new BGPSpeakerMock<>(snf,
- new BGPHandlerFactory(ServiceLoaderBGPExtensionProviderContext.createConsumerContext().getMessageRegistry()),
- new DefaultPromise<BGPSessionImpl>(GlobalEventExecutor.INSTANCE));
+ final BGPSpeakerMock<Notification, BGPSessionImpl, BGPSessionListener> mock = new BGPSpeakerMock<>(snf, new BGPHandlerFactory(ServiceLoaderBGPExtensionProviderContext.createConsumerContext().getMessageRegistry()), new DefaultPromise<BGPSessionImpl>(GlobalEventExecutor.INSTANCE));
mock.createServer(new InetSocketAddress("127.0.0.2", 12345), f);
}