File Index
Files and directories
Sign in
FILE

rose_route.c

File preview with syntax highlighting.

linux-6.19.14/net/rose/rose_route.c C
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 *
   4 * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
   5 * Copyright (C) Terry Dawson VK2KTJ (terry@animats.net)
   6 */
   7#include <linux/errno.h>
   8#include <linux/types.h>
   9#include <linux/socket.h>
  10#include <linux/in.h>
  11#include <linux/kernel.h>
  12#include <linux/timer.h>
  13#include <linux/string.h>
  14#include <linux/sockios.h>
  15#include <linux/net.h>
  16#include <linux/slab.h>
  17#include <net/ax25.h>
  18#include <linux/inet.h>
  19#include <linux/netdevice.h>
  20#include <net/arp.h>
  21#include <linux/if_arp.h>
  22#include <linux/skbuff.h>
  23#include <net/sock.h>
  24#include <net/tcp_states.h>
  25#include <linux/uaccess.h>
  26#include <linux/fcntl.h>
  27#include <linux/termios.h>	/* For TIOCINQ/OUTQ */
  28#include <linux/mm.h>
  29#include <linux/interrupt.h>
  30#include <linux/notifier.h>
  31#include <linux/init.h>
  32#include <net/rose.h>
  33#include <linux/seq_file.h>
  34#include <linux/export.h>
  35
  36static unsigned int rose_neigh_no = 1;
  37
  38static struct rose_node  *rose_node_list;
  39static DEFINE_SPINLOCK(rose_node_list_lock);
  40static struct rose_neigh *rose_neigh_list;
  41static DEFINE_SPINLOCK(rose_neigh_list_lock);
  42static struct rose_route *rose_route_list;
  43static DEFINE_SPINLOCK(rose_route_list_lock);
  44
  45struct rose_neigh *rose_loopback_neigh;
  46
  47/*
  48 *	Add a new route to a node, and in the process add the node and the
  49 *	neighbour if it is new.
  50 */
  51static int __must_check rose_add_node(struct rose_route_struct *rose_route,
  52	struct net_device *dev)
  53{
  54	struct rose_node  *rose_node, *rose_tmpn, *rose_tmpp;
  55	struct rose_neigh *rose_neigh;
  56	int i, res = 0;
  57
  58	spin_lock_bh(&rose_node_list_lock);
  59	spin_lock_bh(&rose_neigh_list_lock);
  60
  61	rose_node = rose_node_list;
  62	while (rose_node != NULL) {
  63		if ((rose_node->mask == rose_route->mask) &&
  64		    (rosecmpm(&rose_route->address, &rose_node->address,
  65			      rose_route->mask) == 0))
  66			break;
  67		rose_node = rose_node->next;
  68	}
  69
  70	if (rose_node != NULL && rose_node->loopback) {
  71		res = -EINVAL;
  72		goto out;
  73	}
  74
  75	rose_neigh = rose_neigh_list;
  76	while (rose_neigh != NULL) {
  77		if (ax25cmp(&rose_route->neighbour,
  78			    &rose_neigh->callsign) == 0 &&
  79		    rose_neigh->dev == dev)
  80			break;
  81		rose_neigh = rose_neigh->next;
  82	}
  83
  84	if (rose_neigh == NULL) {
  85		rose_neigh = kmalloc(sizeof(*rose_neigh), GFP_ATOMIC);
  86		if (rose_neigh == NULL) {
  87			res = -ENOMEM;
  88			goto out;
  89		}
  90
  91		rose_neigh->callsign  = rose_route->neighbour;
  92		rose_neigh->digipeat  = NULL;
  93		rose_neigh->ax25      = NULL;
  94		rose_neigh->dev       = dev;
  95		rose_neigh->count     = 0;
  96		rose_neigh->dce_mode  = 0;
  97		rose_neigh->loopback  = 0;
  98		rose_neigh->number    = rose_neigh_no++;
  99		rose_neigh->restarted = 0;
 100		refcount_set(&rose_neigh->use, 1);
 101
 102		skb_queue_head_init(&rose_neigh->queue);
 103
 104		timer_setup(&rose_neigh->ftimer, NULL, 0);
 105		timer_setup(&rose_neigh->t0timer, NULL, 0);
 106
 107		if (rose_route->ndigis != 0) {
 108			rose_neigh->digipeat =
 109				kmalloc(sizeof(ax25_digi), GFP_ATOMIC);
 110			if (rose_neigh->digipeat == NULL) {
 111				kfree(rose_neigh);
 112				res = -ENOMEM;
 113				goto out;
 114			}
 115
 116			rose_neigh->digipeat->ndigi      = rose_route->ndigis;
 117			rose_neigh->digipeat->lastrepeat = -1;
 118
 119			for (i = 0; i < rose_route->ndigis; i++) {
 120				rose_neigh->digipeat->calls[i]    =
 121					rose_route->digipeaters[i];
 122				rose_neigh->digipeat->repeated[i] = 0;
 123			}
 124		}
 125
 126		rose_neigh->next = rose_neigh_list;
 127		rose_neigh_list  = rose_neigh;
 128	}
 129
 130	/*
 131	 * This is a new node to be inserted into the list. Find where it needs
 132	 * to be inserted into the list, and insert it. We want to be sure
 133	 * to order the list in descending order of mask size to ensure that
 134	 * later when we are searching this list the first match will be the
 135	 * best match.
 136	 */
 137	if (rose_node == NULL) {
 138		rose_tmpn = rose_node_list;
 139		rose_tmpp = NULL;
 140
 141		while (rose_tmpn != NULL) {
 142			if (rose_tmpn->mask > rose_route->mask) {
 143				rose_tmpp = rose_tmpn;
 144				rose_tmpn = rose_tmpn->next;
 145			} else {
 146				break;
 147			}
 148		}
 149
 150		/* create new node */
 151		rose_node = kmalloc(sizeof(*rose_node), GFP_ATOMIC);
 152		if (rose_node == NULL) {
 153			res = -ENOMEM;
 154			goto out;
 155		}
 156
 157		rose_node->address      = rose_route->address;
 158		rose_node->mask         = rose_route->mask;
 159		rose_node->count        = 1;
 160		rose_node->loopback     = 0;
 161		rose_node->neighbour[0] = rose_neigh;
 162
 163		if (rose_tmpn == NULL) {
 164			if (rose_tmpp == NULL) {	/* Empty list */
 165				rose_node_list  = rose_node;
 166				rose_node->next = NULL;
 167			} else {
 168				rose_tmpp->next = rose_node;
 169				rose_node->next = NULL;
 170			}
 171		} else {
 172			if (rose_tmpp == NULL) {	/* 1st node */
 173				rose_node->next = rose_node_list;
 174				rose_node_list  = rose_node;
 175			} else {
 176				rose_tmpp->next = rose_node;
 177				rose_node->next = rose_tmpn;
 178			}
 179		}
 180		rose_neigh->count++;
 181		rose_neigh_hold(rose_neigh);
 182
 183		goto out;
 184	}
 185
 186	/* We have space, slot it in */
 187	if (rose_node->count < 3) {
 188		rose_node->neighbour[rose_node->count] = rose_neigh;
 189		rose_node->count++;
 190		rose_neigh->count++;
 191		rose_neigh_hold(rose_neigh);
 192	}
 193
 194out:
 195	spin_unlock_bh(&rose_neigh_list_lock);
 196	spin_unlock_bh(&rose_node_list_lock);
 197
 198	return res;
 199}
 200
 201/*
 202 * Caller is holding rose_node_list_lock.
 203 */
 204static void rose_remove_node(struct rose_node *rose_node)
 205{
 206	struct rose_node *s;
 207
 208	if ((s = rose_node_list) == rose_node) {
 209		rose_node_list = rose_node->next;
 210		kfree(rose_node);
 211		return;
 212	}
 213
 214	while (s != NULL && s->next != NULL) {
 215		if (s->next == rose_node) {
 216			s->next = rose_node->next;
 217			kfree(rose_node);
 218			return;
 219		}
 220
 221		s = s->next;
 222	}
 223}
 224
 225/*
 226 * Caller is holding rose_neigh_list_lock.
 227 */
 228static void rose_remove_neigh(struct rose_neigh *rose_neigh)
 229{
 230	struct rose_neigh *s;
 231
 232	timer_delete_sync(&rose_neigh->ftimer);
 233	timer_delete_sync(&rose_neigh->t0timer);
 234
 235	skb_queue_purge(&rose_neigh->queue);
 236
 237	if ((s = rose_neigh_list) == rose_neigh) {
 238		rose_neigh_list = rose_neigh->next;
 239		return;
 240	}
 241
 242	while (s != NULL && s->next != NULL) {
 243		if (s->next == rose_neigh) {
 244			s->next = rose_neigh->next;
 245			return;
 246		}
 247
 248		s = s->next;
 249	}
 250}
 251
 252/*
 253 * Caller is holding rose_route_list_lock.
 254 */
 255static void rose_remove_route(struct rose_route *rose_route)
 256{
 257	struct rose_route *s;
 258
 259	if (rose_route->neigh1 != NULL)
 260		rose_neigh_put(rose_route->neigh1);
 261
 262	if (rose_route->neigh2 != NULL)
 263		rose_neigh_put(rose_route->neigh2);
 264
 265	if ((s = rose_route_list) == rose_route) {
 266		rose_route_list = rose_route->next;
 267		kfree(rose_route);
 268		return;
 269	}
 270
 271	while (s != NULL && s->next != NULL) {
 272		if (s->next == rose_route) {
 273			s->next = rose_route->next;
 274			kfree(rose_route);
 275			return;
 276		}
 277
 278		s = s->next;
 279	}
 280}
 281
 282/*
 283 *	"Delete" a node. Strictly speaking remove a route to a node. The node
 284 *	is only deleted if no routes are left to it.
 285 */
 286static int rose_del_node(struct rose_route_struct *rose_route,
 287	struct net_device *dev)
 288{
 289	struct rose_node  *rose_node;
 290	struct rose_neigh *rose_neigh;
 291	int i, err = 0;
 292
 293	spin_lock_bh(&rose_node_list_lock);
 294	spin_lock_bh(&rose_neigh_list_lock);
 295
 296	rose_node = rose_node_list;
 297	while (rose_node != NULL) {
 298		if ((rose_node->mask == rose_route->mask) &&
 299		    (rosecmpm(&rose_route->address, &rose_node->address,
 300			      rose_route->mask) == 0))
 301			break;
 302		rose_node = rose_node->next;
 303	}
 304
 305	if (rose_node == NULL || rose_node->loopback) {
 306		err = -EINVAL;
 307		goto out;
 308	}
 309
 310	rose_neigh = rose_neigh_list;
 311	while (rose_neigh != NULL) {
 312		if (ax25cmp(&rose_route->neighbour,
 313			    &rose_neigh->callsign) == 0 &&
 314		    rose_neigh->dev == dev)
 315			break;
 316		rose_neigh = rose_neigh->next;
 317	}
 318
 319	if (rose_neigh == NULL) {
 320		err = -EINVAL;
 321		goto out;
 322	}
 323
 324	for (i = 0; i < rose_node->count; i++) {
 325		if (rose_node->neighbour[i] == rose_neigh) {
 326			rose_neigh->count--;
 327			rose_neigh_put(rose_neigh);
 328
 329			if (rose_neigh->count == 0) {
 330				rose_remove_neigh(rose_neigh);
 331				rose_neigh_put(rose_neigh);
 332			}
 333
 334			rose_node->count--;
 335
 336			if (rose_node->count == 0) {
 337				rose_remove_node(rose_node);
 338			} else {
 339				switch (i) {
 340				case 0:
 341					rose_node->neighbour[0] =
 342						rose_node->neighbour[1];
 343					fallthrough;
 344				case 1:
 345					rose_node->neighbour[1] =
 346						rose_node->neighbour[2];
 347					break;
 348				case 2:
 349					break;
 350				}
 351			}
 352			goto out;
 353		}
 354	}
 355	err = -EINVAL;
 356
 357out:
 358	spin_unlock_bh(&rose_neigh_list_lock);
 359	spin_unlock_bh(&rose_node_list_lock);
 360
 361	return err;
 362}
 363
 364/*
 365 *	Add the loopback neighbour.
 366 */
 367void rose_add_loopback_neigh(void)
 368{
 369	struct rose_neigh *sn;
 370
 371	rose_loopback_neigh = kmalloc(sizeof(struct rose_neigh), GFP_KERNEL);
 372	if (!rose_loopback_neigh)
 373		return;
 374	sn = rose_loopback_neigh;
 375
 376	sn->callsign  = null_ax25_address;
 377	sn->digipeat  = NULL;
 378	sn->ax25      = NULL;
 379	sn->dev       = NULL;
 380	sn->count     = 0;
 381	sn->dce_mode  = 1;
 382	sn->loopback  = 1;
 383	sn->number    = rose_neigh_no++;
 384	sn->restarted = 1;
 385	refcount_set(&sn->use, 1);
 386
 387	skb_queue_head_init(&sn->queue);
 388
 389	timer_setup(&sn->ftimer, NULL, 0);
 390	timer_setup(&sn->t0timer, NULL, 0);
 391
 392	spin_lock_bh(&rose_neigh_list_lock);
 393	sn->next = rose_neigh_list;
 394	rose_neigh_list           = sn;
 395	spin_unlock_bh(&rose_neigh_list_lock);
 396}
 397
 398/*
 399 *	Add a loopback node.
 400 */
 401int rose_add_loopback_node(const rose_address *address)
 402{
 403	struct rose_node *rose_node;
 404	int err = 0;
 405
 406	spin_lock_bh(&rose_node_list_lock);
 407
 408	rose_node = rose_node_list;
 409	while (rose_node != NULL) {
 410		if ((rose_node->mask == 10) &&
 411		     (rosecmpm(address, &rose_node->address, 10) == 0) &&
 412		     rose_node->loopback)
 413			break;
 414		rose_node = rose_node->next;
 415	}
 416
 417	if (rose_node != NULL)
 418		goto out;
 419
 420	if ((rose_node = kmalloc(sizeof(*rose_node), GFP_ATOMIC)) == NULL) {
 421		err = -ENOMEM;
 422		goto out;
 423	}
 424
 425	rose_node->address      = *address;
 426	rose_node->mask         = 10;
 427	rose_node->count        = 1;
 428	rose_node->loopback     = 1;
 429	rose_node->neighbour[0] = rose_loopback_neigh;
 430
 431	/* Insert at the head of list. Address is always mask=10 */
 432	rose_node->next = rose_node_list;
 433	rose_node_list  = rose_node;
 434
 435	rose_loopback_neigh->count++;
 436	rose_neigh_hold(rose_loopback_neigh);
 437
 438out:
 439	spin_unlock_bh(&rose_node_list_lock);
 440
 441	return err;
 442}
 443
 444/*
 445 *	Delete a loopback node.
 446 */
 447void rose_del_loopback_node(const rose_address *address)
 448{
 449	struct rose_node *rose_node;
 450
 451	spin_lock_bh(&rose_node_list_lock);
 452
 453	rose_node = rose_node_list;
 454	while (rose_node != NULL) {
 455		if ((rose_node->mask == 10) &&
 456		    (rosecmpm(address, &rose_node->address, 10) == 0) &&
 457		    rose_node->loopback)
 458			break;
 459		rose_node = rose_node->next;
 460	}
 461
 462	if (rose_node == NULL)
 463		goto out;
 464
 465	rose_remove_node(rose_node);
 466
 467	rose_loopback_neigh->count--;
 468	rose_neigh_put(rose_loopback_neigh);
 469
 470out:
 471	spin_unlock_bh(&rose_node_list_lock);
 472}
 473
 474/*
 475 *	A device has been removed. Remove its routes and neighbours.
 476 */
 477void rose_rt_device_down(struct net_device *dev)
 478{
 479	struct rose_neigh *s, *rose_neigh;
 480	struct rose_node  *t, *rose_node;
 481	int i;
 482
 483	spin_lock_bh(&rose_node_list_lock);
 484	spin_lock_bh(&rose_neigh_list_lock);
 485	rose_neigh = rose_neigh_list;
 486	while (rose_neigh != NULL) {
 487		s          = rose_neigh;
 488		rose_neigh = rose_neigh->next;
 489
 490		if (s->dev != dev)
 491			continue;
 492
 493		rose_node = rose_node_list;
 494
 495		while (rose_node != NULL) {
 496			t         = rose_node;
 497			rose_node = rose_node->next;
 498
 499			for (i = t->count - 1; i >= 0; i--) {
 500				if (t->neighbour[i] != s)
 501					continue;
 502
 503				t->count--;
 504
 505				memmove(&t->neighbour[i], &t->neighbour[i + 1],
 506					sizeof(t->neighbour[0]) *
 507						(t->count - i));
 508				rose_neigh_put(s);
 509			}
 510
 511			if (t->count <= 0)
 512				rose_remove_node(t);
 513		}
 514
 515		rose_remove_neigh(s);
 516		rose_neigh_put(s);
 517	}
 518	spin_unlock_bh(&rose_neigh_list_lock);
 519	spin_unlock_bh(&rose_node_list_lock);
 520}
 521
 522#if 0 /* Currently unused */
 523/*
 524 *	A device has been removed. Remove its links.
 525 */
 526void rose_route_device_down(struct net_device *dev)
 527{
 528	struct rose_route *s, *rose_route;
 529
 530	spin_lock_bh(&rose_route_list_lock);
 531	rose_route = rose_route_list;
 532	while (rose_route != NULL) {
 533		s          = rose_route;
 534		rose_route = rose_route->next;
 535
 536		if (s->neigh1->dev == dev || s->neigh2->dev == dev)
 537			rose_remove_route(s);
 538	}
 539	spin_unlock_bh(&rose_route_list_lock);
 540}
 541#endif
 542
 543/*
 544 *	Clear all nodes and neighbours out, except for neighbours with
 545 *	active connections going through them.
 546 *  Do not clear loopback neighbour and nodes.
 547 */
 548static int rose_clear_routes(void)
 549{
 550	struct rose_neigh *s, *rose_neigh;
 551	struct rose_node  *t, *rose_node;
 552	int i;
 553
 554	spin_lock_bh(&rose_node_list_lock);
 555	spin_lock_bh(&rose_neigh_list_lock);
 556
 557	rose_neigh = rose_neigh_list;
 558	rose_node  = rose_node_list;
 559
 560	while (rose_node != NULL) {
 561		t         = rose_node;
 562		rose_node = rose_node->next;
 563
 564		if (!t->loopback) {
 565			for (i = 0; i < t->count; i++)
 566				rose_neigh_put(t->neighbour[i]);
 567			rose_remove_node(t);
 568		}
 569	}
 570
 571	while (rose_neigh != NULL) {
 572		s          = rose_neigh;
 573		rose_neigh = rose_neigh->next;
 574
 575		if (!s->loopback) {
 576			rose_remove_neigh(s);
 577			rose_neigh_put(s);
 578		}
 579	}
 580
 581	spin_unlock_bh(&rose_neigh_list_lock);
 582	spin_unlock_bh(&rose_node_list_lock);
 583
 584	return 0;
 585}
 586
 587/*
 588 *	Check that the device given is a valid AX.25 interface that is "up".
 589 * 	called with RTNL
 590 */
 591static struct net_device *rose_ax25_dev_find(char *devname)
 592{
 593	struct net_device *dev;
 594
 595	if ((dev = __dev_get_by_name(&init_net, devname)) == NULL)
 596		return NULL;
 597
 598	if ((dev->flags & IFF_UP) && dev->type == ARPHRD_AX25)
 599		return dev;
 600
 601	return NULL;
 602}
 603
 604/*
 605 *	Find the first active ROSE device, usually "rose0".
 606 */
 607struct net_device *rose_dev_first(void)
 608{
 609	struct net_device *dev, *first = NULL;
 610
 611	rcu_read_lock();
 612	for_each_netdev_rcu(&init_net, dev) {
 613		if ((dev->flags & IFF_UP) && dev->type == ARPHRD_ROSE)
 614			if (first == NULL || strncmp(dev->name, first->name, 3) < 0)
 615				first = dev;
 616	}
 617	if (first)
 618		dev_hold(first);
 619	rcu_read_unlock();
 620
 621	return first;
 622}
 623
 624/*
 625 *	Find the ROSE device for the given address.
 626 */
 627struct net_device *rose_dev_get(rose_address *addr)
 628{
 629	struct net_device *dev;
 630
 631	rcu_read_lock();
 632	for_each_netdev_rcu(&init_net, dev) {
 633		if ((dev->flags & IFF_UP) && dev->type == ARPHRD_ROSE &&
 634		    rosecmp(addr, (const rose_address *)dev->dev_addr) == 0) {
 635			dev_hold(dev);
 636			goto out;
 637		}
 638	}
 639	dev = NULL;
 640out:
 641	rcu_read_unlock();
 642	return dev;
 643}
 644
 645static int rose_dev_exists(rose_address *addr)
 646{
 647	struct net_device *dev;
 648
 649	rcu_read_lock();
 650	for_each_netdev_rcu(&init_net, dev) {
 651		if ((dev->flags & IFF_UP) && dev->type == ARPHRD_ROSE &&
 652		    rosecmp(addr, (const rose_address *)dev->dev_addr) == 0)
 653			goto out;
 654	}
 655	dev = NULL;
 656out:
 657	rcu_read_unlock();
 658	return dev != NULL;
 659}
 660
 661
 662
 663
 664struct rose_route *rose_route_free_lci(unsigned int lci, struct rose_neigh *neigh)
 665{
 666	struct rose_route *rose_route;
 667
 668	for (rose_route = rose_route_list; rose_route != NULL; rose_route = rose_route->next)
 669		if ((rose_route->neigh1 == neigh && rose_route->lci1 == lci) ||
 670		    (rose_route->neigh2 == neigh && rose_route->lci2 == lci))
 671			return rose_route;
 672
 673	return NULL;
 674}
 675
 676/*
 677 *	Find a neighbour or a route given a ROSE address.
 678 */
 679struct rose_neigh *rose_get_neigh(rose_address *addr, unsigned char *cause,
 680	unsigned char *diagnostic, int route_frame)
 681{
 682	struct rose_neigh *res = NULL;
 683	struct rose_node *node;
 684	int failed = 0;
 685	int i;
 686
 687	if (!route_frame) spin_lock_bh(&rose_node_list_lock);
 688	for (node = rose_node_list; node != NULL; node = node->next) {
 689		if (rosecmpm(addr, &node->address, node->mask) == 0) {
 690			for (i = 0; i < node->count; i++) {
 691				if (node->neighbour[i]->restarted) {
 692					res = node->neighbour[i];
 693					rose_neigh_hold(node->neighbour[i]);
 694					goto out;
 695				}
 696			}
 697		}
 698	}
 699	if (!route_frame) { /* connect request */
 700		for (node = rose_node_list; node != NULL; node = node->next) {
 701			if (rosecmpm(addr, &node->address, node->mask) == 0) {
 702				for (i = 0; i < node->count; i++) {
 703					if (!rose_ftimer_running(node->neighbour[i])) {
 704						res = node->neighbour[i];
 705						rose_neigh_hold(node->neighbour[i]);
 706						goto out;
 707					}
 708					failed = 1;
 709				}
 710			}
 711		}
 712	}
 713
 714	if (failed) {
 715		*cause      = ROSE_OUT_OF_ORDER;
 716		*diagnostic = 0;
 717	} else {
 718		*cause      = ROSE_NOT_OBTAINABLE;
 719		*diagnostic = 0;
 720	}
 721
 722out:
 723	if (!route_frame) spin_unlock_bh(&rose_node_list_lock);
 724	return res;
 725}
 726
 727/*
 728 *	Handle the ioctls that control the routing functions.
 729 */
 730int rose_rt_ioctl(unsigned int cmd, void __user *arg)
 731{
 732	struct rose_route_struct rose_route;
 733	struct net_device *dev;
 734	int err;
 735
 736	switch (cmd) {
 737	case SIOCADDRT:
 738		if (copy_from_user(&rose_route, arg, sizeof(struct rose_route_struct)))
 739			return -EFAULT;
 740		if ((dev = rose_ax25_dev_find(rose_route.device)) == NULL)
 741			return -EINVAL;
 742		if (rose_dev_exists(&rose_route.address)) /* Can't add routes to ourself */
 743			return -EINVAL;
 744		if (rose_route.mask > 10) /* Mask can't be more than 10 digits */
 745			return -EINVAL;
 746		if (rose_route.ndigis > AX25_MAX_DIGIS)
 747			return -EINVAL;
 748		err = rose_add_node(&rose_route, dev);
 749		return err;
 750
 751	case SIOCDELRT:
 752		if (copy_from_user(&rose_route, arg, sizeof(struct rose_route_struct)))
 753			return -EFAULT;
 754		if ((dev = rose_ax25_dev_find(rose_route.device)) == NULL)
 755			return -EINVAL;
 756		err = rose_del_node(&rose_route, dev);
 757		return err;
 758
 759	case SIOCRSCLRRT:
 760		return rose_clear_routes();
 761
 762	default:
 763		return -EINVAL;
 764	}
 765
 766	return 0;
 767}
 768
 769static void rose_del_route_by_neigh(struct rose_neigh *rose_neigh)
 770{
 771	struct rose_route *rose_route, *s;
 772
 773	rose_neigh->restarted = 0;
 774
 775	rose_stop_t0timer(rose_neigh);
 776	rose_start_ftimer(rose_neigh);
 777
 778	skb_queue_purge(&rose_neigh->queue);
 779
 780	spin_lock_bh(&rose_route_list_lock);
 781
 782	rose_route = rose_route_list;
 783
 784	while (rose_route != NULL) {
 785		if ((rose_route->neigh1 == rose_neigh && rose_route->neigh2 == rose_neigh) ||
 786		    (rose_route->neigh1 == rose_neigh && rose_route->neigh2 == NULL)       ||
 787		    (rose_route->neigh2 == rose_neigh && rose_route->neigh1 == NULL)) {
 788			s = rose_route->next;
 789			rose_remove_route(rose_route);
 790			rose_route = s;
 791			continue;
 792		}
 793
 794		if (rose_route->neigh1 == rose_neigh) {
 795			rose_neigh_put(rose_route->neigh1);
 796			rose_route->neigh1 = NULL;
 797			rose_transmit_clear_request(rose_route->neigh2, rose_route->lci2, ROSE_OUT_OF_ORDER, 0);
 798		}
 799
 800		if (rose_route->neigh2 == rose_neigh) {
 801			rose_neigh_put(rose_route->neigh2);
 802			rose_route->neigh2 = NULL;
 803			rose_transmit_clear_request(rose_route->neigh1, rose_route->lci1, ROSE_OUT_OF_ORDER, 0);
 804		}
 805
 806		rose_route = rose_route->next;
 807	}
 808	spin_unlock_bh(&rose_route_list_lock);
 809}
 810
 811/*
 812 * 	A level 2 link has timed out, therefore it appears to be a poor link,
 813 *	then don't use that neighbour until it is reset. Blow away all through
 814 *	routes and connections using this route.
 815 */
 816void rose_link_failed(ax25_cb *ax25, int reason)
 817{
 818	struct rose_neigh *rose_neigh;
 819
 820	spin_lock_bh(&rose_neigh_list_lock);
 821	rose_neigh = rose_neigh_list;
 822	while (rose_neigh != NULL) {
 823		if (rose_neigh->ax25 == ax25)
 824			break;
 825		rose_neigh = rose_neigh->next;
 826	}
 827
 828	if (rose_neigh != NULL) {
 829		rose_neigh->ax25 = NULL;
 830		ax25_cb_put(ax25);
 831
 832		rose_del_route_by_neigh(rose_neigh);
 833		rose_kill_by_neigh(rose_neigh);
 834	}
 835	spin_unlock_bh(&rose_neigh_list_lock);
 836}
 837
 838/*
 839 * 	A device has been "downed" remove its link status. Blow away all
 840 *	through routes and connections that use this device.
 841 */
 842void rose_link_device_down(struct net_device *dev)
 843{
 844	struct rose_neigh *rose_neigh;
 845
 846	for (rose_neigh = rose_neigh_list; rose_neigh != NULL; rose_neigh = rose_neigh->next) {
 847		if (rose_neigh->dev == dev) {
 848			rose_del_route_by_neigh(rose_neigh);
 849			rose_kill_by_neigh(rose_neigh);
 850		}
 851	}
 852}
 853
 854/*
 855 *	Route a frame to an appropriate AX.25 connection.
 856 *	A NULL ax25_cb indicates an internally generated frame.
 857 */
 858int rose_route_frame(struct sk_buff *skb, ax25_cb *ax25)
 859{
 860	struct rose_neigh *rose_neigh, *new_neigh;
 861	struct rose_route *rose_route;
 862	struct rose_facilities_struct facilities;
 863	rose_address *src_addr, *dest_addr;
 864	struct sock *sk;
 865	unsigned short frametype;
 866	unsigned int lci, new_lci;
 867	unsigned char cause, diagnostic;
 868	struct net_device *dev;
 869	int res = 0;
 870	char buf[11];
 871
 872	if (skb->len < ROSE_MIN_LEN)
 873		return res;
 874
 875	if (!ax25)
 876		return rose_loopback_queue(skb, NULL);
 877
 878	frametype = skb->data[2];
 879	lci = ((skb->data[0] << 8) & 0xF00) + ((skb->data[1] << 0) & 0x0FF);
 880	if (frametype == ROSE_CALL_REQUEST &&
 881	    (skb->len <= ROSE_CALL_REQ_FACILITIES_OFF ||
 882	     skb->data[ROSE_CALL_REQ_ADDR_LEN_OFF] !=
 883	     ROSE_CALL_REQ_ADDR_LEN_VAL))
 884		return res;
 885	src_addr  = (rose_address *)(skb->data + ROSE_CALL_REQ_SRC_ADDR_OFF);
 886	dest_addr = (rose_address *)(skb->data + ROSE_CALL_REQ_DEST_ADDR_OFF);
 887
 888	spin_lock_bh(&rose_neigh_list_lock);
 889	spin_lock_bh(&rose_route_list_lock);
 890
 891	rose_neigh = rose_neigh_list;
 892	while (rose_neigh != NULL) {
 893		if (ax25cmp(&ax25->dest_addr, &rose_neigh->callsign) == 0 &&
 894		    ax25->ax25_dev->dev == rose_neigh->dev)
 895			break;
 896		rose_neigh = rose_neigh->next;
 897	}
 898
 899	if (rose_neigh == NULL) {
 900		printk("rose_route : unknown neighbour or device %s\n",
 901		       ax2asc(buf, &ax25->dest_addr));
 902		goto out;
 903	}
 904
 905	/*
 906	 *	Obviously the link is working, halt the ftimer.
 907	 */
 908	rose_stop_ftimer(rose_neigh);
 909
 910	/*
 911	 *	LCI of zero is always for us, and its always a restart
 912	 * 	frame.
 913	 */
 914	if (lci == 0) {
 915		rose_link_rx_restart(skb, rose_neigh, frametype);
 916		goto out;
 917	}
 918
 919	/*
 920	 *	Find an existing socket.
 921	 */
 922	if ((sk = rose_find_socket(lci, rose_neigh)) != NULL) {
 923		if (frametype == ROSE_CALL_REQUEST) {
 924			struct rose_sock *rose = rose_sk(sk);
 925
 926			/* Remove an existing unused socket */
 927			rose_clear_queues(sk);
 928			rose->cause	 = ROSE_NETWORK_CONGESTION;
 929			rose->diagnostic = 0;
 930			rose_neigh_put(rose->neighbour);
 931			rose->neighbour	 = NULL;
 932			rose->lci	 = 0;
 933			rose->state	 = ROSE_STATE_0;
 934			sk->sk_state	 = TCP_CLOSE;
 935			sk->sk_err	 = 0;
 936			sk->sk_shutdown	 |= SEND_SHUTDOWN;
 937			if (!sock_flag(sk, SOCK_DEAD)) {
 938				sk->sk_state_change(sk);
 939				sock_set_flag(sk, SOCK_DEAD);
 940			}
 941		}
 942		else {
 943			skb_reset_transport_header(skb);
 944			res = rose_process_rx_frame(sk, skb);
 945			goto out;
 946		}
 947	}
 948
 949	/*
 950	 *	Is is a Call Request and is it for us ?
 951	 */
 952	if (frametype == ROSE_CALL_REQUEST)
 953		if ((dev = rose_dev_get(dest_addr)) != NULL) {
 954			res = rose_rx_call_request(skb, dev, rose_neigh, lci);
 955			dev_put(dev);
 956			goto out;
 957		}
 958
 959	if (!sysctl_rose_routing_control) {
 960		rose_transmit_clear_request(rose_neigh, lci, ROSE_NOT_OBTAINABLE, 0);
 961		goto out;
 962	}
 963
 964	/*
 965	 *	Route it to the next in line if we have an entry for it.
 966	 */
 967	rose_route = rose_route_list;
 968	while (rose_route != NULL) {
 969		if (rose_route->lci1 == lci &&
 970		    rose_route->neigh1 == rose_neigh) {
 971			if (frametype == ROSE_CALL_REQUEST) {
 972				/* F6FBB - Remove an existing unused route */
 973				rose_remove_route(rose_route);
 974				break;
 975			} else if (rose_route->neigh2 != NULL) {
 976				skb->data[0] &= 0xF0;
 977				skb->data[0] |= (rose_route->lci2 >> 8) & 0x0F;
 978				skb->data[1]  = (rose_route->lci2 >> 0) & 0xFF;
 979				rose_transmit_link(skb, rose_route->neigh2);
 980				if (frametype == ROSE_CLEAR_CONFIRMATION)
 981					rose_remove_route(rose_route);
 982				res = 1;
 983				goto out;
 984			} else {
 985				if (frametype == ROSE_CLEAR_CONFIRMATION)
 986					rose_remove_route(rose_route);
 987				goto out;
 988			}
 989		}
 990		if (rose_route->lci2 == lci &&
 991		    rose_route->neigh2 == rose_neigh) {
 992			if (frametype == ROSE_CALL_REQUEST) {
 993				/* F6FBB - Remove an existing unused route */
 994				rose_remove_route(rose_route);
 995				break;
 996			} else if (rose_route->neigh1 != NULL) {
 997				skb->data[0] &= 0xF0;
 998				skb->data[0] |= (rose_route->lci1 >> 8) & 0x0F;
 999				skb->data[1]  = (rose_route->lci1 >> 0) & 0xFF;
1000				rose_transmit_link(skb, rose_route->neigh1);
1001				if (frametype == ROSE_CLEAR_CONFIRMATION)
1002					rose_remove_route(rose_route);
1003				res = 1;
1004				goto out;
1005			} else {
1006				if (frametype == ROSE_CLEAR_CONFIRMATION)
1007					rose_remove_route(rose_route);
1008				goto out;
1009			}
1010		}
1011		rose_route = rose_route->next;
1012	}
1013
1014	/*
1015	 *	We know that:
1016	 *	1. The frame isn't for us,
1017	 *	2. It isn't "owned" by any existing route.
1018	 */
1019	if (frametype != ROSE_CALL_REQUEST) {	/* XXX */
1020		res = 0;
1021		goto out;
1022	}
1023
1024	memset(&facilities, 0x00, sizeof(struct rose_facilities_struct));
1025
1026	if (!rose_parse_facilities(skb->data + ROSE_CALL_REQ_FACILITIES_OFF,
1027				   skb->len - ROSE_CALL_REQ_FACILITIES_OFF,
1028				   &facilities)) {
1029		rose_transmit_clear_request(rose_neigh, lci, ROSE_INVALID_FACILITY, 76);
1030		goto out;
1031	}
1032
1033	/*
1034	 *	Check for routing loops.
1035	 */
1036	rose_route = rose_route_list;
1037	while (rose_route != NULL) {
1038		if (rose_route->rand == facilities.rand &&
1039		    rosecmp(src_addr, &rose_route->src_addr) == 0 &&
1040		    ax25cmp(&facilities.dest_call, &rose_route->src_call) == 0 &&
1041		    ax25cmp(&facilities.source_call, &rose_route->dest_call) == 0) {
1042			rose_transmit_clear_request(rose_neigh, lci, ROSE_NOT_OBTAINABLE, 120);
1043			goto out;
1044		}
1045		rose_route = rose_route->next;
1046	}
1047
1048	if ((new_neigh = rose_get_neigh(dest_addr, &cause, &diagnostic, 1)) == NULL) {
1049		rose_transmit_clear_request(rose_neigh, lci, cause, diagnostic);
1050		goto out;
1051	}
1052
1053	if ((new_lci = rose_new_lci(new_neigh)) == 0) {
1054		rose_transmit_clear_request(rose_neigh, lci, ROSE_NETWORK_CONGESTION, 71);
1055		goto put_neigh;
1056	}
1057
1058	if ((rose_route = kmalloc(sizeof(*rose_route), GFP_ATOMIC)) == NULL) {
1059		rose_transmit_clear_request(rose_neigh, lci, ROSE_NETWORK_CONGESTION, 120);
1060		goto put_neigh;
1061	}
1062
1063	rose_route->lci1      = lci;
1064	rose_route->src_addr  = *src_addr;
1065	rose_route->dest_addr = *dest_addr;
1066	rose_route->src_call  = facilities.dest_call;
1067	rose_route->dest_call = facilities.source_call;
1068	rose_route->rand      = facilities.rand;
1069	rose_route->neigh1    = rose_neigh;
1070	rose_route->lci2      = new_lci;
1071	rose_route->neigh2    = new_neigh;
1072
1073	rose_neigh_hold(rose_route->neigh1);
1074	rose_neigh_hold(rose_route->neigh2);
1075
1076	rose_route->next = rose_route_list;
1077	rose_route_list  = rose_route;
1078
1079	skb->data[0] &= 0xF0;
1080	skb->data[0] |= (rose_route->lci2 >> 8) & 0x0F;
1081	skb->data[1]  = (rose_route->lci2 >> 0) & 0xFF;
1082
1083	rose_transmit_link(skb, rose_route->neigh2);
1084	res = 1;
1085
1086put_neigh:
1087	rose_neigh_put(new_neigh);
1088out:
1089	spin_unlock_bh(&rose_route_list_lock);
1090	spin_unlock_bh(&rose_neigh_list_lock);
1091
1092	return res;
1093}
1094
1095#ifdef CONFIG_PROC_FS
1096
1097static void *rose_node_start(struct seq_file *seq, loff_t *pos)
1098	__acquires(rose_node_list_lock)
1099{
1100	struct rose_node *rose_node;
1101	int i = 1;
1102
1103	spin_lock_bh(&rose_node_list_lock);
1104	if (*pos == 0)
1105		return SEQ_START_TOKEN;
1106
1107	for (rose_node = rose_node_list; rose_node && i < *pos;
1108	     rose_node = rose_node->next, ++i);
1109
1110	return (i == *pos) ? rose_node : NULL;
1111}
1112
1113static void *rose_node_next(struct seq_file *seq, void *v, loff_t *pos)
1114{
1115	++*pos;
1116
1117	return (v == SEQ_START_TOKEN) ? rose_node_list
1118		: ((struct rose_node *)v)->next;
1119}
1120
1121static void rose_node_stop(struct seq_file *seq, void *v)
1122	__releases(rose_node_list_lock)
1123{
1124	spin_unlock_bh(&rose_node_list_lock);
1125}
1126
1127static int rose_node_show(struct seq_file *seq, void *v)
1128{
1129	char rsbuf[11];
1130	int i;
1131
1132	if (v == SEQ_START_TOKEN)
1133		seq_puts(seq, "address    mask n neigh neigh neigh\n");
1134	else {
1135		const struct rose_node *rose_node = v;
1136		seq_printf(seq, "%-10s %04d %d",
1137			   rose2asc(rsbuf, &rose_node->address),
1138			   rose_node->mask,
1139			   rose_node->count);
1140
1141		for (i = 0; i < rose_node->count; i++)
1142			seq_printf(seq, " %05d", rose_node->neighbour[i]->number);
1143
1144		seq_puts(seq, "\n");
1145	}
1146	return 0;
1147}
1148
1149const struct seq_operations rose_node_seqops = {
1150	.start = rose_node_start,
1151	.next = rose_node_next,
1152	.stop = rose_node_stop,
1153	.show = rose_node_show,
1154};
1155
1156static void *rose_neigh_start(struct seq_file *seq, loff_t *pos)
1157	__acquires(rose_neigh_list_lock)
1158{
1159	struct rose_neigh *rose_neigh;
1160	int i = 1;
1161
1162	spin_lock_bh(&rose_neigh_list_lock);
1163	if (*pos == 0)
1164		return SEQ_START_TOKEN;
1165
1166	for (rose_neigh = rose_neigh_list; rose_neigh && i < *pos;
1167	     rose_neigh = rose_neigh->next, ++i);
1168
1169	return (i == *pos) ? rose_neigh : NULL;
1170}
1171
1172static void *rose_neigh_next(struct seq_file *seq, void *v, loff_t *pos)
1173{
1174	++*pos;
1175
1176	return (v == SEQ_START_TOKEN) ? rose_neigh_list
1177		: ((struct rose_neigh *)v)->next;
1178}
1179
1180static void rose_neigh_stop(struct seq_file *seq, void *v)
1181	__releases(rose_neigh_list_lock)
1182{
1183	spin_unlock_bh(&rose_neigh_list_lock);
1184}
1185
1186static int rose_neigh_show(struct seq_file *seq, void *v)
1187{
1188	char buf[11];
1189	int i;
1190
1191	if (v == SEQ_START_TOKEN)
1192		seq_puts(seq,
1193			 "addr  callsign  dev  count use mode restart  t0  tf digipeaters\n");
1194	else {
1195		struct rose_neigh *rose_neigh = v;
1196
1197		/* if (!rose_neigh->loopback) { */
1198		seq_printf(seq, "%05d %-9s %-4s   %3d %3d  %3s     %3s %3lu %3lu",
1199			   rose_neigh->number,
1200			   (rose_neigh->loopback) ? "RSLOOP-0" : ax2asc(buf, &rose_neigh->callsign),
1201			   rose_neigh->dev ? rose_neigh->dev->name : "???",
1202			   rose_neigh->count,
1203			   refcount_read(&rose_neigh->use) - rose_neigh->count - 1,
1204			   (rose_neigh->dce_mode) ? "DCE" : "DTE",
1205			   (rose_neigh->restarted) ? "yes" : "no",
1206			   ax25_display_timer(&rose_neigh->t0timer) / HZ,
1207			   ax25_display_timer(&rose_neigh->ftimer)  / HZ);
1208
1209		if (rose_neigh->digipeat != NULL) {
1210			for (i = 0; i < rose_neigh->digipeat->ndigi; i++)
1211				seq_printf(seq, " %s", ax2asc(buf, &rose_neigh->digipeat->calls[i]));
1212		}
1213
1214		seq_puts(seq, "\n");
1215	}
1216	return 0;
1217}
1218
1219
1220const struct seq_operations rose_neigh_seqops = {
1221	.start = rose_neigh_start,
1222	.next = rose_neigh_next,
1223	.stop = rose_neigh_stop,
1224	.show = rose_neigh_show,
1225};
1226
1227static void *rose_route_start(struct seq_file *seq, loff_t *pos)
1228	__acquires(rose_route_list_lock)
1229{
1230	struct rose_route *rose_route;
1231	int i = 1;
1232
1233	spin_lock_bh(&rose_route_list_lock);
1234	if (*pos == 0)
1235		return SEQ_START_TOKEN;
1236
1237	for (rose_route = rose_route_list; rose_route && i < *pos;
1238	     rose_route = rose_route->next, ++i);
1239
1240	return (i == *pos) ? rose_route : NULL;
1241}
1242
1243static void *rose_route_next(struct seq_file *seq, void *v, loff_t *pos)
1244{
1245	++*pos;
1246
1247	return (v == SEQ_START_TOKEN) ? rose_route_list
1248		: ((struct rose_route *)v)->next;
1249}
1250
1251static void rose_route_stop(struct seq_file *seq, void *v)
1252	__releases(rose_route_list_lock)
1253{
1254	spin_unlock_bh(&rose_route_list_lock);
1255}
1256
1257static int rose_route_show(struct seq_file *seq, void *v)
1258{
1259	char buf[11], rsbuf[11];
1260
1261	if (v == SEQ_START_TOKEN)
1262		seq_puts(seq,
1263			 "lci  address     callsign   neigh  <-> lci  address     callsign   neigh\n");
1264	else {
1265		struct rose_route *rose_route = v;
1266
1267		if (rose_route->neigh1)
1268			seq_printf(seq,
1269				   "%3.3X  %-10s  %-9s  %05d      ",
1270				   rose_route->lci1,
1271				   rose2asc(rsbuf, &rose_route->src_addr),
1272				   ax2asc(buf, &rose_route->src_call),
1273				   rose_route->neigh1->number);
1274		else
1275			seq_puts(seq,
1276				 "000  *           *          00000      ");
1277
1278		if (rose_route->neigh2)
1279			seq_printf(seq,
1280				   "%3.3X  %-10s  %-9s  %05d\n",
1281				   rose_route->lci2,
1282				   rose2asc(rsbuf, &rose_route->dest_addr),
1283				   ax2asc(buf, &rose_route->dest_call),
1284				   rose_route->neigh2->number);
1285		 else
1286			 seq_puts(seq,
1287				  "000  *           *          00000\n");
1288		}
1289	return 0;
1290}
1291
1292struct seq_operations rose_route_seqops = {
1293	.start = rose_route_start,
1294	.next = rose_route_next,
1295	.stop = rose_route_stop,
1296	.show = rose_route_show,
1297};
1298#endif /* CONFIG_PROC_FS */
1299
1300/*
1301 *	Release all memory associated with ROSE routing structures.
1302 */
1303void __exit rose_rt_free(void)
1304{
1305	struct rose_neigh *s, *rose_neigh = rose_neigh_list;
1306	struct rose_node  *t, *rose_node  = rose_node_list;
1307	struct rose_route *u, *rose_route = rose_route_list;
1308	int i;
1309
1310	while (rose_neigh != NULL) {
1311		s          = rose_neigh;
1312		rose_neigh = rose_neigh->next;
1313
1314		rose_remove_neigh(s);
1315		rose_neigh_put(s);
1316	}
1317
1318	while (rose_node != NULL) {
1319		t         = rose_node;
1320		rose_node = rose_node->next;
1321
1322		for (i = 0; i < t->count; i++)
1323			rose_neigh_put(t->neighbour[i]);
1324		rose_remove_node(t);
1325	}
1326
1327	while (rose_route != NULL) {
1328		u          = rose_route;
1329		rose_route = rose_route->next;
1330
1331		rose_remove_route(u);
1332	}
1333}
~/ Read-only file preview.