pkgsrc/net/pptp/patches/patch-ac
rillig 0d0520b161 Updated pptp to 1.7.0.
Release 1.7.0: (27th July 2005)

- silently discard packets not for the call [Cameron/Jenkins]
- adopt sigpipe for use with SIGALRM on control connection [Wolter/Cameron]
- fixes known valgrind heap violations in 1.6.0 [Cameron/Thorne]
- properly report control connection echo reply loss [Wolter]

Release 1.6.0: (18th February 2005)

- fix double-free on stop control connection reply [Kivity]
- add --idle-wait option [Cameron]
- fix segfault on fatal connection error [Kivity]
- prevent a possible signal race [Kivity]
- prevent kill of init [Shurdeek]
- portability fix for non-Linux systems [Quinot]
- rename package from pptp-linux to pptp [Cameron]

Release 1.5.0: (22nd June 2004)

- fix statistics when buffering disabled [Wilson]
- do not inherit the GRE socket [Cameron]
- fix a case of non-shutdown of call manager [Klazes]
- add --nobuffer option to eliminate all buffering of packets [Wilson]
- fix corruption of command line as shown by ps [Howarth]
- fix CPU loop after pppd killed [Cameron]
- fix compile for ARM architecture [Hopf]
- add documentation for command-line options [Wilson]
- do not hang when a connection is refused [McCurdy]
- better describe a cause of EMSGSIZE [Cameron]

Release 1.4.0: (2nd January 2004)

- support options before hostname [Wilson]
- defer OCRQ until after SCCRP [Cameron]
- include uninstall target [Pieter]
- only issue a warning if sync mode is different to pppd [Klazes]
- reformat and tidy code [Klazes]
- reduce transmitted ack-only packets from 40% to 0.8% [Klazes]

Release 1.3.1: (11th June 2003)

- fixed bug introduced since 1.2.0 that prevented simultaneous tunnels.

Release 1.3.0: (10th June 2003)

- rewrite command usage text.
- increase call disconnect notification log message verbosity.
- inherit more make command line options.
- remove execute permissions on man page.
- fixed inefficient acknowledgement immediately followed by data packet.
- added statistics for link quality monitoring.
- remove include of callmgr, do separate compile.
- remove duplicate messages caused by code in header file.
- compilation fixes for Apple MacOS X.
- support multiple clients on alias IP addresses.

Release 1.2.0: (14th February 2003)

- subsecond packet timeout to improve performance on fast links.
- rewrite INSTALL.
- add man page to install target.
- fix response to dropped packets.
- fix man page, address must be before options.
- adopt man page contributed by Thomas Quinot.
- close stderr to prevent holding open ssh sessions.
- minor hint added in case of EIO on read() of pty.
- support synchronous HDLC ppp encoding. Synchronous mode results in an
  important improvement of the CPU efficiency.
- handle out-of-order packets arriving on the GRE socket by buffering.
- bind GRE socket early to prevent ICMP Unreachable response by client.

Release 1.1.0: (20th March 2002)

- New release engineer.
- allow activation as a psuedo-tty child process from pppd.
  This allows on demand pptp links or automatically reconnect.
- ADSL modem quirks handler by mulix@actcom.co.il.
  Workarounds for Orckit ADSL modem.
- workaround for Cisco PIX connection drop after 60 seconds.
- enhance bad FCS error message.
- ported to FreeBSD and NetBSD.
- integrated call manager into pptp binary.
- many bugfixes improving stability.

Release 1.0.3: (7th May 2001)

- New maintaining team.
- Various bug fixes from the Debian package and FreeBSD port.
- Incorporate patch to support erroneous return code with
  Alcatel ADSL 1000 modems.
- Fix incorrect call id error.
- New command line option: --phone (specify phone number).
  (Needed by the Dutch Mxstream ADSL service.)
  Contributed by Rein Klazes <rklazes@xs4all.nl>
2006-03-14 13:53:57 +00:00

233 lines
11 KiB
Text

$NetBSD: patch-ac,v 1.2 2006/03/14 13:53:57 rillig Exp $
Added more logging and made its appearance more consistent.
--- pptp_ctrl.c.orig 2005-07-28 03:15:11.000000000 +0200
+++ pptp_ctrl.c 2006-03-14 14:26:42.000000000 +0100
@@ -291,6 +291,7 @@ PPTP_CONN * pptp_conn_open(int inet_sock
hton16(PPTP_MAX_CHANNELS), hton16(PPTP_FIRMWARE_VERSION),
PPTP_HOSTNAME, PPTP_VENDOR
};
+ log("sending start ctrl conn rqst");
/* fix this packet, if necessary */
int idx, rc;
idx = get_quirk_index();
@@ -366,6 +367,7 @@ PPTP_CALL * pptp_call_open(PPTP_CONN * c
packet.phone_len = sizeof(packet.phone_num);
packet.phone_len = hton16 (packet.phone_len);
}
+ log("sending out call rqst");
if (pptp_send_ctrl_packet(conn, &packet, sizeof(packet))) {
pptp_reset_timer();
call->state.pns = PNS_WAIT_REPLY;
@@ -393,6 +395,7 @@ void pptp_call_close(PPTP_CONN * conn, P
/* don't check state against WAIT_DISCONNECT... allow multiple disconnect
* requests to be made.
*/
+ log("sending call clear rqst");
pptp_send_ctrl_packet(conn, &rqst, sizeof(rqst));
pptp_reset_timer();
call->state.pns = PNS_WAIT_DISCONNECT;
@@ -427,7 +430,7 @@ void pptp_conn_close(PPTP_CONN * conn, u
for (i = 0; i < vector_size(conn->call); i++)
pptp_call_close(conn, vector_get_Nth(conn->call, i));
/* now close connection */
- log("Closing PPTP connection");
+ log("Closing PPTP connection (sending stop ctrl conn rqst)");
pptp_send_ctrl_packet(conn, &rqst, sizeof(rqst));
pptp_reset_timer(); /* wait 60 seconds for reply */
conn->conn_state = CONN_WAIT_STOP_REPLY;
@@ -706,7 +709,17 @@ int ctrlp_disp(PPTP_CONN * conn, void *
hton16(PPTP_MAX_CHANNELS), hton16(PPTP_FIRMWARE_VERSION),
PPTP_HOSTNAME, PPTP_VENDOR };
int idx, rc;
- log("Received Start Control Connection Request");
+ log("Received Start Control Connection Request: v%d rcode %d ecode %d fcap %x bcap %x chans %d fw %x host `%.64s' vendor `%.64s'",
+ ntoh16(packet->version),
+ packet->result_code,
+ packet->error_code,
+ ntoh32(packet->framing_cap),
+ ntoh32(packet->bearer_cap),
+ ntoh16(packet->max_channels),
+ ntoh16(packet->firmware_rev),
+ packet->hostname,
+ packet->vendor
+ );
/* fix this packet, if necessary */
idx = get_quirk_index();
if (idx != -1 && pptp_fixups[idx].start_ctrl_conn) {
@@ -719,9 +732,11 @@ int ctrlp_disp(PPTP_CONN * conn, void *
reply.version = packet->version;
/* protocol version not supported */
reply.result_code = hton8(5);
+ log("sending start ctrl conn reply (NAK)");
pptp_send_ctrl_packet(conn, &reply, sizeof(reply));
pptp_reset_timer(); /* give sender a chance for a retry */
} else { /* same or greater version */
+ log("sending start ctrl conn reply (ACK)");
if (pptp_send_ctrl_packet(conn, &reply, sizeof(reply))) {
conn->conn_state = CONN_ESTABLISHED;
log("server connection ESTABLISHED.");
@@ -735,7 +750,18 @@ int ctrlp_disp(PPTP_CONN * conn, void *
{
struct pptp_start_ctrl_conn *packet =
(struct pptp_start_ctrl_conn *) buffer;
- log("Received Start Control Connection Reply");
+ log("Received Start Control Connection Reply: v%d rcode %d ecode %d fcap %x bcap %x chans %d fw %x host `%.64s' vendor `%.64s'",
+ ntoh16(packet->version),
+ packet->result_code,
+ packet->error_code,
+ ntoh32(packet->framing_cap),
+ ntoh32(packet->bearer_cap),
+ ntoh16(packet->max_channels),
+ ntoh16(packet->firmware_rev),
+ packet->hostname,
+ packet->vendor
+ );
+
if (conn->conn_state == CONN_WAIT_CTL_REPLY) {
/* XXX handle collision XXX [see rfc] */
if (ntoh16(packet->version) != PPTP_VERSION) {
@@ -778,14 +804,21 @@ int ctrlp_disp(PPTP_CONN * conn, void *
/* ----------- STANDARD Stop-Session MESSAGES ------------ */
case PPTP_STOP_CTRL_CONN_RQST:
{
+ struct pptp_stop_ctrl_conn *packet =
+ (struct pptp_stop_ctrl_conn *) buffer;
/* conn_state should be CONN_ESTABLISHED, but it could be
* something else */
struct pptp_stop_ctrl_conn reply = {
PPTP_HEADER_CTRL(PPTP_STOP_CTRL_CONN_RPLY),
hton8(1), hton8(PPTP_GENERAL_ERROR_NONE), 0
};
- log("Received Stop Control Connection Request.");
+ log("Received Stop Control Connection Request: reason %d err %d reserved %d",
+ packet->reason_result,
+ packet->error_code,
+ ntoh16(packet->reserved1)
+ );
if (conn->conn_state == CONN_IDLE) break;
+ log("sending stop ctrl conn reply");
if (pptp_send_ctrl_packet(conn, &reply, sizeof(reply))) {
if (conn->callback != NULL)
conn->callback(conn, CONN_CLOSE_RQST);
@@ -796,7 +829,13 @@ int ctrlp_disp(PPTP_CONN * conn, void *
}
case PPTP_STOP_CTRL_CONN_RPLY:
{
- log("Received Stop Control Connection Reply.");
+ struct pptp_stop_ctrl_conn *packet =
+ (struct pptp_stop_ctrl_conn *) buffer;
+ log("Received Stop Control Connection Reply: reason %d err %d reserved %d",
+ packet->reason_result,
+ packet->error_code,
+ ntoh16(packet->reserved1)
+ );
/* conn_state should be CONN_WAIT_STOP_REPLY, but it
* could be something else */
if (conn->conn_state == CONN_IDLE) break;
@@ -842,9 +881,23 @@ int ctrlp_disp(PPTP_CONN * conn, void *
hton32(PPTP_CONNECT_SPEED),
hton16(PPTP_WINDOW), hton16(PPTP_DELAY), 0
};
- log("Received Outgoing Call Request.");
+ log("Received Outgoing Call Request: id %x csn %d minbps %d max %d bearer %x framing %x rsize %d delay %d plen %d rsv1 %d phone `%.64s' sub `%.64s'",
+ ntoh16(packet->call_id),
+ ntoh16(packet->call_sernum),
+ ntoh32(packet->bps_min),
+ ntoh32(packet->bps_max),
+ ntoh32(packet->bearer),
+ ntoh32(packet->framing),
+ ntoh16(packet->recv_size),
+ ntoh16(packet->delay),
+ ntoh16(packet->phone_len),
+ ntoh16(packet->reserved1),
+ packet->phone_num,
+ packet->subaddress
+ );
/* XXX PAC: eventually this should make an outgoing call. XXX */
reply.result_code = hton8(7); /* outgoing calls verboten */
+ log("sending out call reply (NAK)");
pptp_send_ctrl_packet(conn, &reply, sizeof(reply));
break;
}
@@ -854,7 +907,17 @@ int ctrlp_disp(PPTP_CONN * conn, void *
(struct pptp_out_call_rply *)buffer;
PPTP_CALL * call;
u_int16_t callid = ntoh16(packet->call_id_peer);
- log("Received Outgoing Call Reply.");
+ log("Received Outgoing Call Reply: id %x peer %d result %d err %d cause %x speed %d rsize %d delay %d channel %x",
+ ntoh16(packet->call_id),
+ ntoh16(packet->call_id_peer),
+ packet->result_code,
+ packet->error_code,
+ ntoh16(packet->cause_code),
+ ntoh32(packet->speed),
+ ntoh16(packet->recv_size),
+ ntoh16(packet->delay),
+ ntoh32(packet->channel)
+ );
if (!vector_search(conn->call, (int) callid, &call)) {
log("PPTP_OUT_CALL_RPLY received for non-existant call: "
"peer call ID (us) %d call ID (them) %d.",
@@ -908,12 +971,16 @@ int ctrlp_disp(PPTP_CONN * conn, void *
PPTP_HEADER_CTRL(PPTP_CALL_CLEAR_NTFY), packet->call_id,
1, PPTP_GENERAL_ERROR_NONE, 0, 0, {0}
};
- log("Received Call Clear Request.");
+ log("Received Call Clear Request: cid %d reserved %d",
+ ntoh16(packet->call_id),
+ ntoh16(packet->reserved1)
+ );
if (vector_contains(conn->call, ntoh16(packet->call_id))) {
PPTP_CALL * call;
vector_search(conn->call, ntoh16(packet->call_id), &call);
if (call->callback != NULL)
call->callback(conn, call, CALL_CLOSE_RQST);
+ log("sending call clear ntfy");
pptp_send_ctrl_packet(conn, &reply, sizeof(reply));
pptp_call_destroy(conn, call);
log("Call closed (RQST) (call id %d)", (int) call->call_id);
@@ -924,8 +991,13 @@ int ctrlp_disp(PPTP_CONN * conn, void *
{
struct pptp_call_clear_ntfy *packet =
(struct pptp_call_clear_ntfy *)buffer;
- log("Call disconnect notification received (call id %d)",
- ntoh16(packet->call_id));
+ log("received call clear ntfy: cid %d result %d err %d cause %x reserved %d",
+ ntoh16(packet->call_id),
+ packet->result_code,
+ packet->error_code,
+ ntoh16(packet->cause_code),
+ ntoh16(packet->reserved1)
+ );
if (vector_contains(conn->call, ntoh16(packet->call_id))) {
PPTP_CALL * call;
ctrlp_error(packet->result_code, packet->error_code,
@@ -944,12 +1016,12 @@ int ctrlp_disp(PPTP_CONN * conn, void *
/* this is really dealt with in the HDLC deencapsulation, anyway. */
struct pptp_set_link_info *packet =
(struct pptp_set_link_info *)buffer;
- /* log it. */
- log("PPTP_SET_LINK_INFO received from peer_callid %u",
- (unsigned int) ntoh16(packet->call_id_peer));
- log(" send_accm is %08lX, recv_accm is %08lX",
- (unsigned long) ntoh32(packet->send_accm),
- (unsigned long) ntoh32(packet->recv_accm));
+ log("received set link info: peer %x res %d send %x recv %x\n",
+ ntoh16(packet->call_id_peer),
+ ntoh16(packet->reserved1),
+ ntoh32(packet->send_accm),
+ ntoh32(packet->recv_accm)
+ );
if (!(ntoh32(packet->send_accm) == 0 &&
ntoh32(packet->recv_accm) == 0))
warn("Non-zero Async Control Character Maps are not supported!");
@@ -1051,6 +1123,7 @@ static void pptp_handle_timer()
} else { /* ka_state == NONE */ /* send keep-alive */
struct pptp_echo_rqst rqst = {
PPTP_HEADER_CTRL(PPTP_ECHO_RQST), hton32(global.conn->ka_id) };
+ log("sending echo request: %d", global.conn->ka_id);
pptp_send_ctrl_packet(global.conn, &rqst, sizeof(rqst));
global.conn->ka_state = KA_OUTSTANDING;
}