diff -urpN --exclude-from=/home/davej/.exclude bk-linus/net/rose/rose_link.c linux-2.5/net/rose/rose_link.c --- bk-linus/net/rose/rose_link.c 2002-11-21 02:25:21.000000000 +0000 +++ linux-2.5/net/rose/rose_link.c 2002-11-21 18:05:48.000000000 +0000 @@ -255,15 +255,21 @@ void rose_transmit_clear_request(struct struct sk_buff *skb; unsigned char *dptr; int len; + struct net_device *first; + int faclen = 0; len = AX25_BPQ_HEADER_LEN + AX25_MAX_HEADER_LEN + ROSE_MIN_LEN + 3; - if ((skb = alloc_skb(len, GFP_ATOMIC)) == NULL) + first = rose_dev_first(); + if (first) + faclen = 6 + AX25_ADDR_LEN + 3 + ROSE_ADDR_LEN; + + if ((skb = alloc_skb(len + faclen, GFP_ATOMIC)) == NULL) return; skb_reserve(skb, AX25_BPQ_HEADER_LEN + AX25_MAX_HEADER_LEN); - dptr = skb_put(skb, ROSE_MIN_LEN + 3); + dptr = skb_put(skb, ROSE_MIN_LEN + 3 + faclen); *dptr++ = AX25_P_ROSE; *dptr++ = ((lci >> 8) & 0x0F) | ROSE_GFI; @@ -272,6 +278,21 @@ void rose_transmit_clear_request(struct *dptr++ = cause; *dptr++ = diagnostic; + if (first) { + *dptr++ = 0x00; /* Address length */ + *dptr++ = 4 + AX25_ADDR_LEN + 3 + ROSE_ADDR_LEN; /* Facilities length */ + *dptr++ = 0; + *dptr++ = FAC_NATIONAL; + *dptr++ = FAC_NATIONAL_FAIL_CALL; + *dptr++ = AX25_ADDR_LEN; + memcpy(dptr, &rose_callsign, AX25_ADDR_LEN); + dptr += AX25_ADDR_LEN; + *dptr++ = FAC_NATIONAL_FAIL_ADD; + *dptr++ = ROSE_ADDR_LEN + 1; + *dptr++ = ROSE_ADDR_LEN * 2; + memcpy(dptr, first->dev_addr, ROSE_ADDR_LEN); + } + if (!rose_send_frame(skb, neigh)) kfree_skb(skb); }