示例#1
0
void l2tp_pkt_free(struct l2tp_packet *pkt)
{
	int buf;

	L2TP_DEBUG(L2TP_DATA, "%s: pkt=%p, msg=%d tid=%hu sid=%hu ns=%hu nr=%hu", __func__,
		   pkt, pkt->msg_type, pkt->tunnel_id, pkt->session_id, pkt->nr, pkt->ns);

	if (pkt->num_bufs > 0) {
		for (buf = 0; buf < pkt->num_bufs; buf++) {
			if (pkt->iov[buf].iov_base != NULL) {
#ifdef DEBUG
				if (pkt->iov[buf].iov_len == 0) {
					l2tp_log(LOG_ERR, "Freeing zero length buffer %p, index %d?", 
						 pkt->iov[buf].iov_base, buf);
				}
				USL_POISON_MEMORY(pkt->iov[buf].iov_base, 0xe8, pkt->iov[buf].iov_len);
#endif
				free(pkt->iov[buf].iov_base);
			} else {
				break;
			}
		}
	}

	USL_POISON_MEMORY(pkt, 0xe7, sizeof(*pkt));
	free(pkt);
}
示例#2
0
bool_t l2tp_system_get_1_svc(struct l2tp_api_system_msg_data *msg, struct svc_req *req)
{
    int type;
    struct l2tp_api_system_msg_stats *stat;

    memset(msg, 0, sizeof(*msg));

    msg->config.trace_flags = l2tp_opt_trace_flags;
    msg->config.udp_port = l2tp_opt_udp_port;
    msg->config.flags = l2tp_opt_flags;

    /* catch uncopied data errors */
    USL_POISON_MEMORY(&msg->status.stats, 0xaa, sizeof(msg->status.stats));

    msg->status.stats.total_sent_control_frames = l2tp_stats.total_sent_control_frames;
    msg->status.stats.total_rcvd_control_frames = l2tp_stats.total_rcvd_control_frames;
    msg->status.stats.total_control_frame_send_fails = l2tp_stats.total_control_frame_send_fails;
    msg->status.stats.total_retransmitted_control_frames = l2tp_stats.total_retransmitted_control_frames;
    msg->status.stats.event_queue_full_errors = l2tp_stats.event_queue_full_errors;
    msg->status.stats.short_frames = l2tp_stats.short_frames;
    msg->status.stats.wrong_version_frames = l2tp_stats.wrong_version_frames;
    msg->status.stats.unexpected_data_frames = l2tp_stats.unexpected_data_frames;
    msg->status.stats.bad_rcvd_frames = l2tp_stats.bad_rcvd_frames;
    msg->status.stats.no_control_frame_resources = l2tp_stats.no_control_frame_resources;
    msg->status.stats.no_peer_resources = l2tp_stats.no_peer_resources;
    msg->status.stats.no_tunnel_resources = l2tp_stats.no_tunnel_resources;
    msg->status.stats.no_session_resources = l2tp_stats.no_session_resources;
    msg->status.stats.no_ppp_resources = l2tp_stats.no_ppp_resources;
    msg->status.stats.auth_fails = l2tp_stats.auth_fails;
    msg->status.stats.no_matching_tunnel_id_discards = l2tp_stats.no_matching_tunnel_id_discards;
    msg->status.stats.no_matching_session_id_discards = l2tp_stats.no_matching_session_id_discards;
    msg->status.stats.mismatched_tunnel_ids = l2tp_stats.mismatched_tunnel_ids;
    msg->status.stats.mismatched_session_ids = l2tp_stats.mismatched_session_ids;
    msg->status.stats.encode_message_fails = l2tp_stats.encode_message_fails;
    msg->status.stats.ignored_avps = l2tp_stats.ignored_avps;
    msg->status.stats.vendor_avps = l2tp_stats.vendor_avps;
    msg->status.stats.illegal_messages = l2tp_stats.illegal_messages;
    msg->status.stats.unsupported_messages = l2tp_stats.unsupported_messages;
    msg->status.stats.messages.messages_len = L2TP_API_MSG_TYPE_COUNT;
    msg->status.stats.messages.messages_val = calloc(L2TP_API_MSG_TYPE_COUNT, sizeof(*msg->status.stats.messages.messages_val));
    if (msg->status.stats.messages.messages_val == NULL) {
        msg->status.stats.messages.messages_len = 0;
    }

    stat = msg->status.stats.messages.messages_val;
    for (type = 0; type < msg->status.stats.messages.messages_len; type++) {
        stat->rx = l2tp_stats.messages[type].rx;
        stat->tx = l2tp_stats.messages[type].tx;
        stat->rx_bad = l2tp_stats.messages[type].rx_bad;
        stat++;
    }

    msg->status.stats.too_many_tunnels = l2tp_stats.too_many_tunnels;
    msg->status.stats.too_many_sessions = l2tp_stats.too_many_sessions;
    msg->status.stats.tunnel_setup_failures = l2tp_stats.tunnel_setup_failures;
    msg->status.stats.session_setup_failures = l2tp_stats.session_setup_failures;

    l2tp_tunnel_globals_get(msg);
    l2tp_session_globals_get(msg);

    return TRUE;
}