separate offer/answer logic