/* $Id: isdn_x25iface.c,v 1.1.2.2 2004/01/12 22:37:19 keil Exp $
 *
 * Linux ISDN subsystem, X.25 related functions
 *
 * This software may be used and distributed according to the terms
 * of the GNU General Public License, incorporated herein by reference.
 *
 * stuff needed to support the Linux X.25 PLP code on top of devices that
 * can provide a lab_b service using the concap_proto mechanism.
 * This module supports a network interface which provides lapb_sematics
 * -- as defined in Documentation/networking/x25-iface.txt -- to
 * the upper layer and assumes that the lower layer provides a reliable
 * data link service by means of the concap_device_ops callbacks.
 *
 * Only protocol specific stuff goes here. Device specific stuff
 * goes to another -- device related -- concap_proto support source file.
 *
 */

/* #include <linux/isdn.h> */
#include <linux/netdevice.h>
#include <linux/concap.h>
#include <linux/slab.h>
#include <linux/wanrouter.h>
#include <net/x25device.h>
#include "isdn_x25iface.h"

/* for debugging messages not to cause an oops when device pointer is NULL*/
#define MY_DEVNAME(dev)  ((dev) ? (dev)->name : "DEVICE UNSPECIFIED")


typedef struct isdn_x25iface_proto_data {
	int magic;
	enum wan_states state;
	/* Private stuff, not to be accessed via proto_data. We provide the
	   other storage for the concap_proto instance here as well,
	   enabling us to allocate both with just one kmalloc(): */
	struct concap_proto priv;
} ix25_pdata_t;



/* is now in header file (extern): struct concap_proto * isdn_x25iface_proto_new(void); */
static void isdn_x25iface_proto_del(struct concap_proto *);
static int isdn_x25iface_proto_close(struct concap_proto *);
static int isdn_x25iface_proto_restart(struct concap_proto *,
				       struct net_device *,
				       struct concap_device_ops *);
static int isdn_x25iface_xmit(struct concap_proto *, struct sk_buff *);
static int isdn_x25iface_receive(struct concap_proto *, struct sk_buff *);
static int isdn_x25iface_connect_ind(struct concap_proto *);
static int isdn_x25iface_disconn_ind(struct concap_proto *);


static struct concap_proto_ops ix25_pops = {
	.proto_new = &isdn_x25iface_proto_new,
	.proto_del = &isdn_x25iface_proto_del,
	.restart = &isdn_x25iface_proto_restart,
	.close = &isdn_x25iface_proto_close,
	.encap_and_xmit = &isdn_x25iface_xmit,
	.data_ind = &isdn_x25iface_receive,
	.connect_ind = &isdn_x25iface_connect_ind,
	.disconn_ind = &isdn_x25iface_disconn_ind
};

/* error message helper function */
static void illegal_state_warn(unsigned state, unsigned char firstbyte)
{
	printk(KERN_WARNING "isdn_x25iface: firstbyte %x illegal in"
	       "current state %d\n", firstbyte, state);
}

/* check protocol data field for consistency */
static int pdata_is_bad(ix25_pdata_t *pda) {

	if (pda  &&  pda->magic == ISDN_X25IFACE_MAGIC) return 0;
	printk(KERN_WARNING
	       "isdn_x25iface_xxx: illegal pointer to proto data\n");
	return 1;
}

/* create a new x25 interface protocol instance
 */
struct concap_proto *isdn_x25iface_proto_new(void)
{
	ix25_pdata_t *tmp = kmalloc(sizeof(ix25_pdata_t), GFP_KERNEL);
	IX25DEBUG("isdn_x25iface_proto_new\n");
	if (tmp) {
		tmp->magic = ISDN_X25IFACE_MAGIC;
		tmp->state = WAN_UNCONFIGURED;
		/* private data space used to hold the concap_proto data.
		   Only to be accessed via the returned pointer */
		spin_lock_init(&tmp->priv.lock);
		tmp->priv.dops       = NULL;
		tmp->priv.net_dev    = NULL;
		tmp->priv.pops       = &ix25_pops;
		tmp->priv.flags      = 0;
		tmp->priv.proto_data = tmp;
		return (&(tmp->priv));
	}
	return NULL;
};

/* close the x25iface encapsulation protocol
 */
static int isdn_x25iface_proto_close(struct concap_proto *cprot) {

	ix25_pdata_t *tmp;
	int ret = 0;
	ulong flags;

	if (!cprot) {
		printk(KERN_ERR "isdn_x25iface_proto_close: "
		       "invalid concap_proto pointer\n");
		return -1;
	}
	IX25DEBUG("isdn_x25iface_proto_close %s \n", MY_DEVNAME(cprot->net_dev));
	spin_lock_irqsave(&cprot->lock, flags);
	cprot->dops    = NULL;
	cprot->net_dev = NULL;
	tmp = cprot->proto_data;
	if (pdata_is_bad(tmp)) {
		ret = -1;
	} else {
		tmp->state = WAN_UNCONFIGURED;
	}
	spin_unlock_irqrestore(&cprot->lock, flags);
	return ret;
}

/* Delete the x25iface encapsulation protocol instance
 */
static void isdn_x25iface_proto_del(struct concap_proto *cprot) {

	ix25_pdata_t *tmp;

	IX25DEBUG("isdn_x25iface_proto_del \n");
	if (!cprot) {
		printk(KERN_ERR "isdn_x25iface_proto_del: "
		       "concap_proto pointer is NULL\n");
		return;
	}
	tmp = cprot->proto_data;
	if (tmp == NULL) {
		printk(KERN_ERR "isdn_x25iface_proto_del: inconsistent "
		       "proto_data pointer (maybe already deleted?)\n");
		return;
	}
	/* close if the protocol is still open */
	if (cprot->dops) isdn_x25iface_proto_close(cprot);
	/* freeing the storage should be sufficient now. But some additional
	   settings might help to catch wild pointer bugs */
	tmp->magic = 0;
	cprot->proto_data = NULL;

	kfree(tmp);
	return;
}

/* (re-)initialize the data structures for x25iface encapsulation
 */
static int isdn_x25iface_proto_restart(struct concap_proto *cprot,
				       struct net_device *ndev,
				       struct concap_device_ops *dops)
{
	ix25_pdata_t *pda = cprot->proto_data;
	ulong flags;

	IX25DEBUG("isdn_x25iface_proto_restart %s \n", MY_DEVNAME(ndev));

	if (pdata_is_bad(pda)) return -1;

	if (!(dops && dops->data_req && dops->connect_req
	      && dops->disconn_req)) {
		printk(KERN_WARNING "isdn_x25iface_restart: required dops"
		       " missing\n");
		isdn_x25iface_proto_close(cprot);
		return -1;
	}
	spin_lock_irqsave(&cprot->lock, flags);
	cprot->net_dev = ndev;
	cprot->pops = &ix25_pops;
	cprot->dops = dops;
	pda->state = WAN_DISCONNECTED;
	spin_unlock_irqrestore(&cprot->lock, flags);
	return 0;
}

/* deliver a dl_data frame received from i4l HL driver to the network layer
 */
static int isdn_x25iface_receive(struct concap_proto *cprot, struct sk_buff *skb)
{
	IX25DEBUG("isdn_x25iface_receive %s \n", MY_DEVNAME(cprot->net_dev));
	if (((ix25_pdata_t *)(cprot->proto_data))
	    ->state == WAN_CONNECTED) {
		if (skb_push(skb, 1)) {
			skb->data[0] = X25_IFACE_DATA;
			skb->protocol = x25_type_trans(skb, cprot->net_dev);
			netif_rx(skb);
			return 0;
		}
	}
	printk(KERN_WARNING "isdn_x25iface_receive %s: not connected, skb dropped\n", MY_DEVNAME(cprot->net_dev));
	dev_kfree_skb(skb);
	return -1;
}

/* a connection set up is indicated by lower layer
 */
static int isdn_x25iface_connect_ind(struct concap_proto *cprot)
{
	struct sk_buff *skb;
	enum wan_states *state_p
		= &(((ix25_pdata_t *)(cprot->proto_data))->state);
	IX25DEBUG("isdn_x25iface_connect_ind %s \n"
		  , MY_DEVNAME(cprot->net_dev));
	if (*state_p == WAN_UNCONFIGURED) {
		printk(KERN_WARNING
		       "isdn_x25iface_connect_ind while unconfigured %s\n"
		       , MY_DEVNAME(cprot->net_dev));
		return -1;
	}
	*state_p = WAN_CONNECTED;

	skb = dev_alloc_skb(1);
	if (skb) {
		skb_put_u8(skb, X25_IFACE_CONNECT);
		skb->protocol = x25_type_trans(skb, cprot->net_dev);
		netif_rx(skb);
		return 0;
	} else {
		printk(KERN_WARNING "isdn_x25iface_connect_ind: "
		       " out of memory -- disconnecting\n");
		cprot->dops->disconn_req(cprot);
		return -1;
	}
}

/* a disconnect is indicated by lower layer
 */
static int isdn_x25iface_disconn_ind(struct concap_proto *cprot)
{
	struct sk_buff *skb;
	enum wan_states *state_p
		= &(((ix25_pdata_t *)(cprot->proto_data))->state);
	IX25DEBUG("isdn_x25iface_disconn_ind %s \n", MY_DEVNAME(cprot->net_dev));
	if (*state_p == WAN_UNCONFIGURED) {
		printk(KERN_WARNING
		       "isdn_x25iface_disconn_ind while unconfigured\n");
		return -1;
	}
	if (!cprot->net_dev) return -1;
	*state_p = WAN_DISCONNECTED;
	skb = dev_alloc_skb(1);
	if (skb) {
		skb_put_u8(skb, X25_IFACE_DISCONNECT);
		skb->protocol = x25_type_trans(skb, cprot->net_dev);
		netif_rx(skb);
		return 0;
	} else {
		printk(KERN_WARNING "isdn_x25iface_disconn_ind:"
		       " out of memory\n");
		return -1;
	}
}

/* process a frame handed over to us from linux network layer. First byte
   semantics as defined in Documentation/networking/x25-iface.txt
*/
static int isdn_x25iface_xmit(struct concap_proto *cprot, struct sk_buff *skb)
{
	unsigned char firstbyte = skb->data[0];
	enum wan_states *state = &((ix25_pdata_t *)cprot->proto_data)->state;
	int ret = 0;
	IX25DEBUG("isdn_x25iface_xmit: %s first=%x state=%d\n",
		  MY_DEVNAME(cprot->net_dev), firstbyte, *state);
	switch (firstbyte) {
	case X25_IFACE_DATA:
		if (*state == WAN_CONNECTED) {
			skb_pull(skb, 1);
			netif_trans_update(cprot->net_dev);
			ret = (cprot->dops->data_req(cprot, skb));
			/* prepare for future retransmissions */
			if (ret) skb_push(skb, 1);
			return ret;
		}
		illegal_state_warn(*state, firstbyte);
		break;
	case X25_IFACE_CONNECT:
		if (*state == WAN_DISCONNECTED) {
			*state = WAN_CONNECTING;
			ret = cprot->dops->connect_req(cprot);
			if (ret) {
				/* reset state and notify upper layer about
				 * immidiatly failed attempts */
				isdn_x25iface_disconn_ind(cprot);
			}
		} else {
			illegal_state_warn(*state, firstbyte);
		}
		break;
	case X25_IFACE_DISCONNECT:
		switch (*state) {
		case WAN_DISCONNECTED:
			/* Should not happen. However, give upper layer a
			   chance to recover from inconstistency  but don't
			   trust the lower layer sending the disconn_confirm
			   when already disconnected */
			printk(KERN_WARNING "isdn_x25iface_xmit: disconnect "
			       " requested while disconnected\n");
			isdn_x25iface_disconn_ind(cprot);
			break; /* prevent infinite loops */
		case WAN_CONNECTING:
		case WAN_CONNECTED:
			*state = WAN_DISCONNECTED;
			cprot->dops->disconn_req(cprot);
			break;
		default:
			illegal_state_warn(*state, firstbyte);
		}
		break;
	case X25_IFACE_PARAMS:
		printk(KERN_WARNING "isdn_x25iface_xmit: setting of lapb"
		       " options not yet supported\n");
		break;
	default:
		printk(KERN_WARNING "isdn_x25iface_xmit: frame with illegal"
		       " first byte %x ignored:\n", firstbyte);
	}
	dev_kfree_skb(skb);
	return 0;
}
