Lines Matching +full:entry +full:- +full:address

1 // SPDX-License-Identifier: GPL-2.0-or-later
20 * Jaume Grau - flush caches on AARP_PROBE
21 * Rob Newberry - Added proxy AARP and AARP proc fs,
23 * Arnaldo C. Melo - don't mangle rx packets
46 * struct aarp_entry - AARP entry
50 * @expires_at: Entry expiry time
51 * @target_addr: DDP Address
53 * @hwaddr: Physical i/f address of target/router
55 * @next: Next entry in chain
89 skb_queue_purge(&a->packet_queue); in __aarp_expire()
94 * Send an aarp queue entry request
102 struct net_device *dev = a->dev; in __aarp_send_query()
104 int len = dev->hard_header_len + sizeof(*eah) + aarp_dl->header_length; in __aarp_send_query()
117 skb_reserve(skb, dev->hard_header_len + aarp_dl->header_length); in __aarp_send_query()
121 skb->protocol = htons(ETH_P_ATALK); in __aarp_send_query()
122 skb->dev = dev; in __aarp_send_query()
126 eah->hw_type = htons(AARP_HW_TYPE_ETHERNET); in __aarp_send_query()
127 eah->pa_type = htons(ETH_P_ATALK); in __aarp_send_query()
128 eah->hw_len = ETH_ALEN; in __aarp_send_query()
129 eah->pa_len = AARP_PA_ALEN; in __aarp_send_query()
130 eah->function = htons(AARP_REQUEST); in __aarp_send_query()
132 ether_addr_copy(eah->hw_src, dev->dev_addr); in __aarp_send_query()
134 eah->pa_src_zero = 0; in __aarp_send_query()
135 eah->pa_src_net = sat->s_net; in __aarp_send_query()
136 eah->pa_src_node = sat->s_node; in __aarp_send_query()
138 eth_zero_addr(eah->hw_dst); in __aarp_send_query()
140 eah->pa_dst_zero = 0; in __aarp_send_query()
141 eah->pa_dst_net = a->target_addr.s_net; in __aarp_send_query()
142 eah->pa_dst_node = a->target_addr.s_node; in __aarp_send_query()
145 aarp_dl->request(aarp_dl, skb, aarp_eth_multicast); in __aarp_send_query()
147 a->xmit_count++; in __aarp_send_query()
148 a->last_sent = jiffies; in __aarp_send_query()
157 int len = dev->hard_header_len + sizeof(*eah) + aarp_dl->header_length; in aarp_send_reply()
164 skb_reserve(skb, dev->hard_header_len + aarp_dl->header_length); in aarp_send_reply()
168 skb->protocol = htons(ETH_P_ATALK); in aarp_send_reply()
169 skb->dev = dev; in aarp_send_reply()
173 eah->hw_type = htons(AARP_HW_TYPE_ETHERNET); in aarp_send_reply()
174 eah->pa_type = htons(ETH_P_ATALK); in aarp_send_reply()
175 eah->hw_len = ETH_ALEN; in aarp_send_reply()
176 eah->pa_len = AARP_PA_ALEN; in aarp_send_reply()
177 eah->function = htons(AARP_REPLY); in aarp_send_reply()
179 ether_addr_copy(eah->hw_src, dev->dev_addr); in aarp_send_reply()
181 eah->pa_src_zero = 0; in aarp_send_reply()
182 eah->pa_src_net = us->s_net; in aarp_send_reply()
183 eah->pa_src_node = us->s_node; in aarp_send_reply()
186 eth_zero_addr(eah->hw_dst); in aarp_send_reply()
188 ether_addr_copy(eah->hw_dst, sha); in aarp_send_reply()
190 eah->pa_dst_zero = 0; in aarp_send_reply()
191 eah->pa_dst_net = them->s_net; in aarp_send_reply()
192 eah->pa_dst_node = them->s_node; in aarp_send_reply()
195 aarp_dl->request(aarp_dl, skb, sha); in aarp_send_reply()
206 int len = dev->hard_header_len + sizeof(*eah) + aarp_dl->header_length; in aarp_send_probe()
215 skb_reserve(skb, dev->hard_header_len + aarp_dl->header_length); in aarp_send_probe()
219 skb->protocol = htons(ETH_P_ATALK); in aarp_send_probe()
220 skb->dev = dev; in aarp_send_probe()
224 eah->hw_type = htons(AARP_HW_TYPE_ETHERNET); in aarp_send_probe()
225 eah->pa_type = htons(ETH_P_ATALK); in aarp_send_probe()
226 eah->hw_len = ETH_ALEN; in aarp_send_probe()
227 eah->pa_len = AARP_PA_ALEN; in aarp_send_probe()
228 eah->function = htons(AARP_PROBE); in aarp_send_probe()
230 ether_addr_copy(eah->hw_src, dev->dev_addr); in aarp_send_probe()
232 eah->pa_src_zero = 0; in aarp_send_probe()
233 eah->pa_src_net = us->s_net; in aarp_send_probe()
234 eah->pa_src_node = us->s_node; in aarp_send_probe()
236 eth_zero_addr(eah->hw_dst); in aarp_send_probe()
238 eah->pa_dst_zero = 0; in aarp_send_probe()
239 eah->pa_dst_net = us->s_net; in aarp_send_probe()
240 eah->pa_dst_node = us->s_node; in aarp_send_probe()
243 aarp_dl->request(aarp_dl, skb, aarp_eth_multicast); in aarp_send_probe()
258 if (time_after(jiffies, (*n)->expires_at)) { in __aarp_expire_timer()
260 *n = (*n)->next; in __aarp_expire_timer()
263 n = &((*n)->next); in __aarp_expire_timer()
277 if ((*n)->xmit_count >= sysctl_aarp_retransmit_limit) { in __aarp_kick()
279 *n = (*n)->next; in __aarp_kick()
283 n = &((*n)->next); in __aarp_kick()
298 if ((*n)->dev == dev) { in __aarp_expire_device()
300 *n = (*n)->next; in __aarp_expire_device()
303 n = &((*n)->next); in __aarp_expire_device()
357 *n = (*n)->next; in __aarp_expire_all()
362 /* Cleanup all hash chains -- module unloading */
377 * Create a new aarp entry. This must use GFP_ATOMIC because it
385 skb_queue_head_init(&a->packet_queue); in aarp_alloc()
390 * Find an entry. We might return an expired but not yet purged entry. We
400 if (list->target_addr.s_net == sat->s_net && in __aarp_find_entry()
401 list->target_addr.s_node == sat->s_node && in __aarp_find_entry()
402 list->dev == dev) in __aarp_find_entry()
404 list = list->next; in __aarp_find_entry()
413 int hash = sa->s_node % (AARP_HASH_SIZE - 1); in aarp_proxy_remove()
420 a->expires_at = jiffies - 1; in aarp_proxy_remove()
429 int hash = sa->s_node % (AARP_HASH_SIZE - 1); in __aarp_proxy_find()
440 aarp_send_probe(atif->dev, &atif->address); in aarp_probe_network()
445 if (atif->status & ATIF_PROBE_FAIL) in aarp_probe_network()
452 int hash, retval = -EPROTONOSUPPORT; in aarp_proxy_probe_network()
453 struct aarp_entry *entry; in aarp_proxy_probe_network() local
460 if (atif->dev->type == ARPHRD_LOCALTLK || in aarp_proxy_probe_network()
461 atif->dev->type == ARPHRD_PPP) in aarp_proxy_probe_network()
465 * create a new AARP entry with the flags set to be published -- in aarp_proxy_probe_network()
468 entry = aarp_alloc(); in aarp_proxy_probe_network()
469 retval = -ENOMEM; in aarp_proxy_probe_network()
470 if (!entry) in aarp_proxy_probe_network()
473 entry->expires_at = -1; in aarp_proxy_probe_network()
474 entry->status = ATIF_PROBE; in aarp_proxy_probe_network()
475 entry->target_addr.s_node = sa->s_node; in aarp_proxy_probe_network()
476 entry->target_addr.s_net = sa->s_net; in aarp_proxy_probe_network()
477 entry->dev = atif->dev; in aarp_proxy_probe_network()
481 hash = sa->s_node % (AARP_HASH_SIZE - 1); in aarp_proxy_probe_network()
482 entry->next = proxies[hash]; in aarp_proxy_probe_network()
483 proxies[hash] = entry; in aarp_proxy_probe_network()
486 aarp_send_probe(atif->dev, sa); in aarp_proxy_probe_network()
493 if (entry->status & ATIF_PROBE_FAIL) in aarp_proxy_probe_network()
497 if (entry->status & ATIF_PROBE_FAIL) { in aarp_proxy_probe_network()
498 entry->expires_at = jiffies - 1; /* free the entry */ in aarp_proxy_probe_network()
499 retval = -EADDRINUSE; /* return network full */ in aarp_proxy_probe_network()
501 entry->status &= ~ATIF_PROBE; in aarp_proxy_probe_network()
522 if (dev->type == ARPHRD_LOCALTLK) { in aarp_send_ddp()
524 struct ddpehdr *ddp = (struct ddpehdr *)skb->data; in aarp_send_ddp()
534 if ((!ddp->deh_snet || at->s_net == ddp->deh_snet) && in aarp_send_ddp()
535 (!ddp->deh_dnet || at->s_net == ddp->deh_dnet)) { in aarp_send_ddp()
536 skb_pull(skb, sizeof(*ddp) - 4); in aarp_send_ddp()
543 *((__be16 *)skb->data) = htons(skb->len); in aarp_send_ddp()
552 skb->data[0] = sa->s_node; in aarp_send_ddp()
553 skb->data[1] = at->s_node; in aarp_send_ddp()
554 skb->data[2] = ft; in aarp_send_ddp()
555 skb->dev = dev; in aarp_send_ddp()
560 if (dev->type == ARPHRD_PPP) { in aarp_send_ddp()
561 skb->protocol = htons(ETH_P_PPPTALK); in aarp_send_ddp()
562 skb->dev = dev; in aarp_send_ddp()
567 if (dev->type != ARPHRD_ETHER) in aarp_send_ddp()
570 skb->dev = dev; in aarp_send_ddp()
571 skb->protocol = htons(ETH_P_ATALK); in aarp_send_ddp()
572 hash = sa->s_node % (AARP_HASH_SIZE - 1); in aarp_send_ddp()
574 /* Do we have a resolved entry? */ in aarp_send_ddp()
575 if (sa->s_node == ATADDR_BCAST) { in aarp_send_ddp()
577 ddp_dl->request(ddp_dl, skb, ddp_eth_multicast); in aarp_send_ddp()
584 if (a) { /* Return 1 and fill in the address */ in aarp_send_ddp()
585 a->expires_at = jiffies + (sysctl_aarp_expiry_time * 10); in aarp_send_ddp()
586 ddp_dl->request(ddp_dl, skb, a->hwaddr); in aarp_send_ddp()
591 /* Do we have an unresolved entry: This is the less common path */ in aarp_send_ddp()
594 skb_queue_tail(&a->packet_queue, skb); in aarp_send_ddp()
598 /* Allocate a new entry */ in aarp_send_ddp()
607 skb_queue_tail(&a->packet_queue, skb); in aarp_send_ddp()
608 a->expires_at = jiffies + sysctl_aarp_resolve_time; in aarp_send_ddp()
609 a->dev = dev; in aarp_send_ddp()
610 a->next = unresolved[hash]; in aarp_send_ddp()
611 a->target_addr = *sa; in aarp_send_ddp()
612 a->xmit_count = 0; in aarp_send_ddp()
616 /* Send an initial request for the address */ in aarp_send_ddp()
621 * unresolved entry to get added) in aarp_send_ddp()
635 if (skb->sk) in aarp_send_ddp()
636 skb->priority = READ_ONCE(skb->sk->sk_priority); in aarp_send_ddp()
649 * An entry in the aarp unresolved queue has become resolved. Send
661 unresolved_count--; in __aarp_resolved()
662 *list = a->next; in __aarp_resolved()
665 a->next = resolved[hash]; in __aarp_resolved()
669 while ((skb = skb_dequeue(&a->packet_queue)) != NULL) { in __aarp_resolved()
670 a->expires_at = jiffies + in __aarp_resolved()
672 ddp_dl->request(ddp_dl, skb, a->hwaddr); in __aarp_resolved()
675 list = &((*list)->next); in __aarp_resolved()
696 if (dev->type != ARPHRD_ETHER) in aarp_rcv()
703 function = ntohs(ea->function); in aarp_rcv()
707 ea->hw_len != ETH_ALEN || ea->pa_len != AARP_PA_ALEN || in aarp_rcv()
708 ea->pa_src_zero || ea->pa_dst_zero) in aarp_rcv()
712 hash = ea->pa_src_node % (AARP_HASH_SIZE - 1); in aarp_rcv()
714 /* Build an address. */ in aarp_rcv()
715 sa.s_node = ea->pa_src_node; in aarp_rcv()
716 sa.s_net = ea->pa_src_net; in aarp_rcv()
723 if (ifa->status & ATIF_PROBE && in aarp_rcv()
724 ifa->address.s_node == ea->pa_dst_node && in aarp_rcv()
725 ifa->address.s_net == ea->pa_dst_net) { in aarp_rcv()
726 ifa->status |= ATIF_PROBE_FAIL; /* Fail the probe (in use) */ in aarp_rcv()
731 da.s_node = ea->pa_dst_node; in aarp_rcv()
732 da.s_net = ea->pa_dst_net; in aarp_rcv()
737 if (a && a->status & ATIF_PROBE) { in aarp_rcv()
738 a->status |= ATIF_PROBE_FAIL; in aarp_rcv()
741 * this address while we are probing this address in aarp_rcv()
751 /* Find the entry. */ in aarp_rcv()
753 if (!a || dev != a->dev) in aarp_rcv()
756 /* We can fill one in - this is good. */ in aarp_rcv()
757 ether_addr_copy(a->hwaddr, ea->hw_src); in aarp_rcv()
768 * If it is my address set ma to my address and reply. in aarp_rcv()
771 * as in a probe they are proposing an address not in aarp_rcv()
774 * Support for proxy-AARP added. We check if the in aarp_rcv()
775 * address is one of our proxies before we toss the in aarp_rcv()
779 sa.s_node = ea->pa_dst_node; in aarp_rcv()
780 sa.s_net = ea->pa_dst_net; in aarp_rcv()
785 ma = &ifa->address; in aarp_rcv()
786 else { /* We need to make a copy of the entry. */ in aarp_rcv()
795 * address. So as a precaution flush any in aarp_rcv()
796 * entries we have for this address. in aarp_rcv()
799 (AARP_HASH_SIZE - 1)], in aarp_rcv()
800 skb->dev, &sa); in aarp_rcv()
803 * Make it expire next tick - that avoids us in aarp_rcv()
809 a->expires_at = jiffies - 1; in aarp_rcv()
815 if (sa.s_node != ma->s_node) in aarp_rcv()
818 if (sa.s_net && ma->s_net && sa.s_net != ma->s_net) in aarp_rcv()
821 sa.s_node = ea->pa_src_node; in aarp_rcv()
822 sa.s_net = ea->pa_src_net; in aarp_rcv()
824 /* aarp_my_address has found the address to use for us. in aarp_rcv()
826 aarp_send_reply(dev, ma, &sa, ea->hw_src); in aarp_rcv()
852 return -ENOMEM; in aarp_proto_init()
883 * Get the aarp entry that is in the chain described
886 * pos = 1 is the first entry
890 int ct = iter->bucket; in iter_next()
891 struct aarp_entry **table = iter->table; in iter_next()
893 struct aarp_entry *entry; in iter_next() local
897 for (entry = table[ct]; entry; entry = entry->next) { in iter_next()
899 iter->table = table; in iter_next()
900 iter->bucket = ct; in iter_next()
901 return entry; in iter_next()
923 struct aarp_iter_state *iter = seq->private; in aarp_seq_start()
926 iter->table = resolved; in aarp_seq_start()
927 iter->bucket = 0; in aarp_seq_start()
934 struct aarp_entry *entry = v; in aarp_seq_next() local
935 struct aarp_iter_state *iter = seq->private; in aarp_seq_next()
941 entry = iter_next(iter, NULL); in aarp_seq_next()
943 /* next entry in current bucket */ in aarp_seq_next()
944 else if (entry->next) in aarp_seq_next()
945 entry = entry->next; in aarp_seq_next()
949 ++iter->bucket; in aarp_seq_next()
950 entry = iter_next(iter, NULL); in aarp_seq_next()
952 return entry; in aarp_seq_next()
972 struct aarp_iter_state *iter = seq->private; in aarp_seq_show()
973 struct aarp_entry *entry = v; in aarp_seq_show() local
978 "Address Interface Hardware Address" in aarp_seq_show()
981 seq_printf(seq, "%04X:%02X %-12s", in aarp_seq_show()
982 ntohs(entry->target_addr.s_net), in aarp_seq_show()
983 (unsigned int) entry->target_addr.s_node, in aarp_seq_show()
984 entry->dev ? entry->dev->name : "????"); in aarp_seq_show()
985 seq_printf(seq, "%pM", entry->hwaddr); in aarp_seq_show()
987 dt2str((long)entry->expires_at - (long)now)); in aarp_seq_show()
988 if (iter->table == unresolved) in aarp_seq_show()
990 dt2str(now - entry->last_sent), in aarp_seq_show()
991 entry->xmit_count); in aarp_seq_show()
995 (iter->table == resolved) ? "resolved" in aarp_seq_show()
996 : (iter->table == unresolved) ? "unresolved" in aarp_seq_show()
997 : (iter->table == proxies) ? "proxies" in aarp_seq_show()