<< ").";
}
+const uint64_t msgr2_required = CEPH_FEATUREMASK_MSG_ADDR2;
+
using CtPtr = Ct<ProtocolV2> *;
struct SHA256SignatureError : public std::exception {
this->peer_required_features = peer_required_features;
if (this->peer_required_features == 0) {
- this->connection_features = CEPH_FEATURE_MSG_ADDR2;
+ this->connection_features = msgr2_required;
}
HelloFrame hello(this, messenger->get_mytype(), connection->target_addr);
ClientIdentFrame client_ident(this, messenger->get_myaddrs(),
messenger->get_myname().num(), global_seq,
connection->policy.features_supported,
- connection->policy.features_required, flags);
+ connection->policy.features_required | msgr2_required,
+ flags);
ldout(cct, 5) << __func__ << " sending identification: "
<< "addrs=" << messenger->get_myaddrs()
<< " global_seq=" << global_seq
<< " features_supported=" << std::hex
<< connection->policy.features_supported
- << " features_required=" << connection->policy.features_required
+ << " features_required="
+ << (connection->policy.features_required | msgr2_required)
<< " flags=" << flags << std::dec << dendl;
bufferlist &bl = client_ident.get_buffer();
global_seq,
connect_seq,
connection->policy.features_supported,
- connection->policy.features_required,
+ connection->policy.features_required | msgr2_required,
in_seq);
ldout(cct, 5) << __func__ << " reconnect to session: cookie=" << cookie
peer_name = entity_name_t(connection->get_peer_type(), client_ident.gid());
connection->set_peer_id(client_ident.gid());
- uint64_t feat_missing = connection->policy.features_required &
- ~(uint64_t)client_ident.supported_features();
+ uint64_t feat_missing =
+ (connection->policy.features_required | msgr2_required) &
+ ~(uint64_t)client_ident.supported_features();
if (feat_missing) {
ldout(cct, 1) << __func__ << " peer missing required features " << std::hex
<< feat_missing << std::dec << dendl;
connection->policy.features_supported;
peer_global_seq = reconnect.global_seq();
+ uint64_t feat_missing =
+ (connection->policy.features_required | msgr2_required) &
+ ~(uint64_t)reconnect.supported_features();
+ if (feat_missing) {
+ ldout(cct, 1) << __func__ << " peer missing required features " << std::hex
+ << feat_missing << std::dec << dendl;
+ IdentMissingFeaturesFrame ident_missing_features(this, feat_missing);
+
+ bufferlist &bl = ident_missing_features.get_buffer();
+ return WRITE(bl, "ident missing features", read_frame);
+ }
+
connection->lock.unlock();
AsyncConnectionRef existing = messenger->lookup_conn(*connection->peer_addrs);
ServerIdentFrame server_ident(
this, messenger->get_myaddrs(), messenger->get_myname().num(), gs,
connection->policy.features_supported,
- connection->policy.features_required, flags, cookie);
+ connection->policy.features_required | msgr2_required,
+ flags,
+ cookie);
ldout(cct, 5) << __func__ << " sending identification:"
<< " addrs=" << messenger->get_myaddrs()
<< " gid=" << messenger->get_myname().num()
<< " global_seq=" << gs << " features_supported=" << std::hex
<< connection->policy.features_supported
- << " features_required=" << connection->policy.features_required
+ << " features_required="
+ << (connection->policy.features_required | msgr2_required)
<< " flags=" << flags << " cookie=" << std::dec << cookie
<< dendl;