anchor.diff:  
   %% recv1/3
   
  -%% Incoming request after DPR has been sent: discard. Don't discard
  -%% DPR, so both ends don't do so when sending simultaneously.
  +%% Incoming request after outgoing DPR: discard. Don't discard DPR, so
  +%% both ends don't do so when sending simultaneously.
   recv1(Name,
         #diameter_packet{header = #diameter_header{is_request = true} = H},
         #state{dpr = {_,_,_}})
     when Name /= 'DPR' ->
  -    invalid(false, recv_after_dpr, H);
  +    invalid(false, recv_after_outgoing_dpr, H);
  +
  +%% Incoming request after incoming DPR: discard.
  +recv1(_,
  +      #diameter_packet{header = #diameter_header{is_request = true} = H},
  +      #state{dpr = true}) ->
  +    invalid(false, recv_after_incoming_dpr, H);
   
   %% DPA with identifier mismatch, or in response to a DPR initiated by
   %% the service.
  
positive.code:     Peer = {self(), Caps},
      dpr(CBs, [Reason, Ref, Peer], S);
  
  %% Connection is open, DPR already sent.
  dpr(_, #state{state = 'Open'}) ->
      ok;
  
  
negative.code:          transport    :: pid(),     %% transport process
           dictionary   :: module(),  %% common dictionary
           service      :: #diameter_service{},
           dpr = false  :: false
                         | true  %% DPR received, DPA sent
                         | {uint32(), uint32()}  %% set in old code
                         | {boolean(), uint32(), uint32()},
                         %% hop by hop and end to end identifiers in
                         %% outgoing DPR; boolean says whether or not
                         %% the request was sent explicitly with
                         %% diameter:call/4.
           length_errors :: exit | handle | discard}).
  
  %% There are non-3588 states possible as a consequence of 5.6.1 of the
  