rose_route
struct rose_route *next;
struct rose_route *rose_route_free_lci(unsigned int, struct rose_neigh *);
rose_transmit_link(skb, rose_route->neigh1);
rose_remove_route(rose_route);
rose_remove_route(rose_route);
rose_route = rose_route->next;
rose_route = rose_route_list;
while (rose_route != NULL) {
if (rose_route->rand == facilities.rand &&
rosecmp(src_addr, &rose_route->src_addr) == 0 &&
ax25cmp(&facilities.dest_call, &rose_route->src_call) == 0 &&
ax25cmp(&facilities.source_call, &rose_route->dest_call) == 0) {
rose_route = rose_route->next;
if ((rose_route = kmalloc_obj(*rose_route, GFP_ATOMIC)) == NULL) {
rose_route->lci1 = lci;
rose_route->src_addr = *src_addr;
rose_route->dest_addr = *dest_addr;
rose_route->src_call = facilities.dest_call;
rose_route->dest_call = facilities.source_call;
rose_route->rand = facilities.rand;
rose_route->neigh1 = rose_neigh;
if (rose_route->ndigis != 0) {
rose_route->lci2 = new_lci;
rose_route->neigh2 = new_neigh;
rose_neigh_hold(rose_route->neigh1);
rose_neigh_hold(rose_route->neigh2);
rose_route->next = rose_route_list;
rose_route_list = rose_route;
skb->data[0] |= (rose_route->lci2 >> 8) & 0x0F;
skb->data[1] = (rose_route->lci2 >> 0) & 0xFF;
rose_transmit_link(skb, rose_route->neigh2);
rose_neigh->digipeat->ndigi = rose_route->ndigis;
for (i = 0; i < rose_route->ndigis; i++) {
rose_route->digipeaters[i];
struct rose_route *rose_route;
for (rose_route = rose_route_list; rose_route && i < *pos;
rose_route = rose_route->next, ++i);
return (i == *pos) ? rose_route : NULL;
: ((struct rose_route *)v)->next;
struct rose_route *rose_route = v;
if (rose_route->neigh1)
rose_route->lci1,
rose2asc(rsbuf, &rose_route->src_addr),
ax2asc(buf, &rose_route->src_call),
rose_route->neigh1->number);
if (rose_route->neigh2)
rose_route->lci2,
rose2asc(rsbuf, &rose_route->dest_addr),
ax2asc(buf, &rose_route->dest_call),
rose_route->neigh2->number);
struct rose_route *u, *rose_route = rose_route_list;
while (rose_route != NULL) {
u = rose_route;
rose_route = rose_route->next;
if (rose_tmpn->mask > rose_route->mask) {
rose_node->address = rose_route->address;
rose_node->mask = rose_route->mask;
static void rose_remove_route(struct rose_route *rose_route)
struct rose_route *s;
if (rose_route->neigh1 != NULL)
rose_neigh_put(rose_route->neigh1);
if (rose_route->neigh2 != NULL)
rose_neigh_put(rose_route->neigh2);
if ((s = rose_route_list) == rose_route) {
rose_route_list = rose_route->next;
kfree(rose_route);
if (s->next == rose_route) {
s->next = rose_route->next;
kfree(rose_route);
static int rose_del_node(struct rose_route_struct *rose_route,
if ((rose_node->mask == rose_route->mask) &&
(rosecmpm(&rose_route->address, &rose_node->address,
rose_route->mask) == 0))
if (ax25cmp(&rose_route->neighbour,
static struct rose_route *rose_route_list;
static int __must_check rose_add_node(struct rose_route_struct *rose_route,
struct rose_route *s, *rose_route;
rose_route = rose_route_list;
while (rose_route != NULL) {
s = rose_route;
rose_route = rose_route->next;
if ((rose_node->mask == rose_route->mask) &&
(rosecmpm(&rose_route->address, &rose_node->address,
rose_route->mask) == 0))
struct rose_route *rose_route_free_lci(unsigned int lci, struct rose_neigh *neigh)
struct rose_route *rose_route;
for (rose_route = rose_route_list; rose_route != NULL; rose_route = rose_route->next)
if ((rose_route->neigh1 == neigh && rose_route->lci1 == lci) ||
(rose_route->neigh2 == neigh && rose_route->lci2 == lci))
return rose_route;
struct rose_route_struct rose_route;
if (copy_from_user(&rose_route, arg, sizeof(struct rose_route_struct)))
if ((dev = rose_ax25_dev_find(rose_route.device)) == NULL)
if (rose_dev_exists(&rose_route.address)) /* Can't add routes to ourself */
if (rose_route.mask > 10) /* Mask can't be more than 10 digits */
if (rose_route.ndigis > AX25_MAX_DIGIS)
err = rose_add_node(&rose_route, dev);
if (copy_from_user(&rose_route, arg, sizeof(struct rose_route_struct)))
if ((dev = rose_ax25_dev_find(rose_route.device)) == NULL)
err = rose_del_node(&rose_route, dev);
if (ax25cmp(&rose_route->neighbour,
struct rose_route *rose_route, *s;
rose_route = rose_route_list;
while (rose_route != NULL) {
if ((rose_route->neigh1 == rose_neigh && rose_route->neigh2 == rose_neigh) ||
(rose_route->neigh1 == rose_neigh && rose_route->neigh2 == NULL) ||
(rose_route->neigh2 == rose_neigh && rose_route->neigh1 == NULL)) {
s = rose_route->next;
rose_remove_route(rose_route);
rose_route = s;
if (rose_route->neigh1 == rose_neigh) {
rose_neigh_put(rose_route->neigh1);
rose_route->neigh1 = NULL;
rose_transmit_clear_request(rose_route->neigh2, rose_route->lci2, ROSE_OUT_OF_ORDER, 0);
if (rose_route->neigh2 == rose_neigh) {
rose_neigh_put(rose_route->neigh2);
rose_route->neigh2 = NULL;
rose_transmit_clear_request(rose_route->neigh1, rose_route->lci1, ROSE_OUT_OF_ORDER, 0);
rose_route = rose_route->next;
struct rose_route *rose_route;
rose_neigh->callsign = rose_route->neighbour;
rose_route = rose_route_list;
while (rose_route != NULL) {
if (rose_route->lci1 == lci &&
rose_route->neigh1 == rose_neigh) {
rose_remove_route(rose_route);
} else if (rose_route->neigh2 != NULL) {
skb->data[0] |= (rose_route->lci2 >> 8) & 0x0F;
skb->data[1] = (rose_route->lci2 >> 0) & 0xFF;
rose_transmit_link(skb, rose_route->neigh2);
rose_remove_route(rose_route);
rose_remove_route(rose_route);
if (rose_route->lci2 == lci &&
rose_route->neigh2 == rose_neigh) {
rose_remove_route(rose_route);
} else if (rose_route->neigh1 != NULL) {
skb->data[0] |= (rose_route->lci1 >> 8) & 0x0F;
skb->data[1] = (rose_route->lci1 >> 0) & 0xFF;