162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci#include <linux/errno.h>
762306a36Sopenharmony_ci#include <linux/types.h>
862306a36Sopenharmony_ci#include <linux/socket.h>
962306a36Sopenharmony_ci#include <linux/in.h>
1062306a36Sopenharmony_ci#include <linux/kernel.h>
1162306a36Sopenharmony_ci#include <linux/timer.h>
1262306a36Sopenharmony_ci#include <linux/string.h>
1362306a36Sopenharmony_ci#include <linux/sockios.h>
1462306a36Sopenharmony_ci#include <linux/net.h>
1562306a36Sopenharmony_ci#include <net/ax25.h>
1662306a36Sopenharmony_ci#include <linux/inet.h>
1762306a36Sopenharmony_ci#include <linux/netdevice.h>
1862306a36Sopenharmony_ci#include <linux/skbuff.h>
1962306a36Sopenharmony_ci#include <net/sock.h>
2062306a36Sopenharmony_ci#include <linux/uaccess.h>
2162306a36Sopenharmony_ci#include <linux/fcntl.h>
2262306a36Sopenharmony_ci#include <linux/mm.h>
2362306a36Sopenharmony_ci#include <linux/interrupt.h>
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci/*
2662306a36Sopenharmony_ci * The following routines are taken from page 170 of the 7th ARRL Computer
2762306a36Sopenharmony_ci * Networking Conference paper, as is the whole state machine.
2862306a36Sopenharmony_ci */
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_civoid ax25_std_nr_error_recovery(ax25_cb *ax25)
3162306a36Sopenharmony_ci{
3262306a36Sopenharmony_ci	ax25_std_establish_data_link(ax25);
3362306a36Sopenharmony_ci}
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_civoid ax25_std_establish_data_link(ax25_cb *ax25)
3662306a36Sopenharmony_ci{
3762306a36Sopenharmony_ci	ax25->condition = 0x00;
3862306a36Sopenharmony_ci	ax25->n2count   = 0;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	if (ax25->modulus == AX25_MODULUS)
4162306a36Sopenharmony_ci		ax25_send_control(ax25, AX25_SABM, AX25_POLLON, AX25_COMMAND);
4262306a36Sopenharmony_ci	else
4362306a36Sopenharmony_ci		ax25_send_control(ax25, AX25_SABME, AX25_POLLON, AX25_COMMAND);
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	ax25_calculate_t1(ax25);
4662306a36Sopenharmony_ci	ax25_stop_idletimer(ax25);
4762306a36Sopenharmony_ci	ax25_stop_t3timer(ax25);
4862306a36Sopenharmony_ci	ax25_stop_t2timer(ax25);
4962306a36Sopenharmony_ci	ax25_start_t1timer(ax25);
5062306a36Sopenharmony_ci}
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_civoid ax25_std_transmit_enquiry(ax25_cb *ax25)
5362306a36Sopenharmony_ci{
5462306a36Sopenharmony_ci	if (ax25->condition & AX25_COND_OWN_RX_BUSY)
5562306a36Sopenharmony_ci		ax25_send_control(ax25, AX25_RNR, AX25_POLLON, AX25_COMMAND);
5662306a36Sopenharmony_ci	else
5762306a36Sopenharmony_ci		ax25_send_control(ax25, AX25_RR, AX25_POLLON, AX25_COMMAND);
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	ax25->condition &= ~AX25_COND_ACK_PENDING;
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci	ax25_calculate_t1(ax25);
6262306a36Sopenharmony_ci	ax25_start_t1timer(ax25);
6362306a36Sopenharmony_ci}
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_civoid ax25_std_enquiry_response(ax25_cb *ax25)
6662306a36Sopenharmony_ci{
6762306a36Sopenharmony_ci	if (ax25->condition & AX25_COND_OWN_RX_BUSY)
6862306a36Sopenharmony_ci		ax25_send_control(ax25, AX25_RNR, AX25_POLLON, AX25_RESPONSE);
6962306a36Sopenharmony_ci	else
7062306a36Sopenharmony_ci		ax25_send_control(ax25, AX25_RR, AX25_POLLON, AX25_RESPONSE);
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci	ax25->condition &= ~AX25_COND_ACK_PENDING;
7362306a36Sopenharmony_ci}
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_civoid ax25_std_timeout_response(ax25_cb *ax25)
7662306a36Sopenharmony_ci{
7762306a36Sopenharmony_ci	if (ax25->condition & AX25_COND_OWN_RX_BUSY)
7862306a36Sopenharmony_ci		ax25_send_control(ax25, AX25_RNR, AX25_POLLOFF, AX25_RESPONSE);
7962306a36Sopenharmony_ci	else
8062306a36Sopenharmony_ci		ax25_send_control(ax25, AX25_RR, AX25_POLLOFF, AX25_RESPONSE);
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	ax25->condition &= ~AX25_COND_ACK_PENDING;
8362306a36Sopenharmony_ci}
84