anchor.diff:      recv(S);
   
   throttle(#transport{throttle_cb = F, throttled = B} = S) ->
  -    throttle(cb(F, B), S).
  +    Res = cb(F, B),
  +
  +    try throttle(Res, S) of
  +        #transport{} = NS ->
  +            throttle(defrag(NS))
  +    catch
  +        #transport{throttled = false} = NS ->
  +            recv(NS);
  +        #transport{} = NS ->
  +            NS
  +    end.
   
   %% cb/2
   
  
positive.code: throttle(NPid, #transport{parent = Pid, throttled = Msg} = S)
    when is_pid(NPid), is_binary(Msg) ->
      diameter_peer:recv(Pid, {Msg, NPid}),
      throttle(S#transport{throttled = true});
  
  throttle({NPid, F}, #transport{throttled = Msg} = S)
    when is_pid(NPid), is_binary(Msg) ->
  
negative.code: throttle(Bin, #transport{throttled = Msg} = S)
    when is_binary(Bin), is_binary(Msg) ->
      send(Bin, S),
      S;
  
  throttle({Bin, F}, #transport{throttled = Msg} = S)
    when is_binary(Bin), is_binary(Msg) ->
      throttle(Bin, S#transport{throttle_cb = F});
  
  %% Callback says to ask again in the specified number of milliseconds.
  throttle({timeout, Tmo}, S) ->
      erlang:send_after(Tmo, self(), throttle),
      throw(S);
  
  throttle({timeout = T, Tmo, F}, S) ->
      throttle({T, Tmo}, S#transport{throttle_cb = F});
  
  throttle(T, #transport{throttle_cb = F}) ->
      ?ERROR({invalid_return, T, F}).
  
  %% defrag/1
  %%
  %% Try to extract another message from packets already read before
  %% another throttling callback.
  
  defrag(#transport{frag = Head} = S) ->
      case rcv(Head, <<>>) of
          {Msg, B} ->
              S#transport{throttled = Msg, frag = B};
          _ ->
              S#transport{throttled = true}
      end.
  
  %% portnr/2
  
  