diff --git a/src/server.c b/src/server.c index a456ca8..1b117a5 100644 --- a/src/server.c +++ b/src/server.c @@ -1074,9 +1074,11 @@ static int handle_sabm(patty_ax25_server *server, } remote->status = PATTY_AX25_SOCK_ESTABLISHED; - remote->mode = PATTY_AX25_SOCK_SABM; remote->iface = iface; + remote->mode = (frame->type == PATTY_AX25_FRAME_SABM)? + PATTY_AX25_SOCK_SABM: PATTY_AX25_SOCK_SABME; + save_reply_addr(remote, frame); if (sock_save_by_fd(server->socks_by_fd, remote) < 0) { @@ -1106,7 +1108,7 @@ static int handle_sabm(patty_ax25_server *server, response.ret = 0; response.eno = 0; - memcpy(&response.peer, &frame->src, sizeof(patty_ax25_addr)); + memcpy(&response.peer, &frame->src, sizeof(patty_ax25_addr)); memcpy(&response.path, &remote->path, sizeof(response.path)); if (write(client, &response, sizeof(response)) < 0) { @@ -1315,12 +1317,13 @@ static int handle_frame(patty_ax25_server *server, } switch (frame.type) { - case PATTY_AX25_FRAME_I: return handle_i(server, iface, sock, &frame); - case PATTY_AX25_FRAME_SABM: return handle_sabm(server, iface, &frame); - case PATTY_AX25_FRAME_UA: return handle_ua(server, iface, &frame); - case PATTY_AX25_FRAME_DM: return handle_dm(server, iface, &frame); - case PATTY_AX25_FRAME_DISC: return handle_disc(server, iface, &frame); - case PATTY_AX25_FRAME_FRMR: return 0; + case PATTY_AX25_FRAME_I: return handle_i(server, iface, sock, &frame); + case PATTY_AX25_FRAME_UA: return handle_ua(server, iface, &frame); + case PATTY_AX25_FRAME_DM: return handle_dm(server, iface, &frame); + case PATTY_AX25_FRAME_SABM: + case PATTY_AX25_FRAME_SABME: return handle_sabm(server, iface, &frame); + case PATTY_AX25_FRAME_DISC: return handle_disc(server, iface, &frame); + case PATTY_AX25_FRAME_FRMR: return 0; default: break;