Lines Matching +full:sha +full:- +full:1
1 // SPDX-License-Identifier: GPL-2.0-or-later
8 * high-level addresses) into a low-level hardware address (like an Ethernet
27 * re-arranged proxy handling.
168 [NEIGH_VAR_RETRANS_TIME] = 1 * HZ,
174 [NEIGH_VAR_ANYCAST_DELAY] = 1 * HZ,
176 [NEIGH_VAR_LOCKTIME] = 1 * HZ,
188 switch (dev->type) { in arp_mc_map()
195 ip_ib_mc_map(addr, dev->broadcast, haddr); in arp_mc_map()
198 ip_ipgre_mc_map(addr, dev->broadcast, haddr); in arp_mc_map()
202 memcpy(haddr, dev->broadcast, dev->addr_len); in arp_mc_map()
206 return -EINVAL; in arp_mc_map()
225 struct net_device *dev = neigh->dev; in arp_constructor()
230 if (dev->flags & (IFF_LOOPBACK | IFF_POINTOPOINT)) in arp_constructor()
231 memcpy(neigh->primary_key, &inaddr_any, arp_tbl.key_len); in arp_constructor()
233 addr = *(__be32 *)neigh->primary_key; in arp_constructor()
238 return -EINVAL; in arp_constructor()
241 neigh->type = inet_addr_type_dev_table(dev_net(dev), dev, addr); in arp_constructor()
243 parms = in_dev->arp_parms; in arp_constructor()
244 __neigh_parms_put(neigh->parms); in arp_constructor()
245 neigh->parms = neigh_parms_clone(parms); in arp_constructor()
248 if (!dev->header_ops) { in arp_constructor()
249 neigh->nud_state = NUD_NOARP; in arp_constructor()
250 neigh->ops = &arp_direct_ops; in arp_constructor()
251 neigh->output = neigh_direct_output; in arp_constructor()
268 if (neigh->type == RTN_MULTICAST) { in arp_constructor()
269 neigh->nud_state = NUD_NOARP; in arp_constructor()
270 arp_mc_map(addr, neigh->ha, dev, 1); in arp_constructor()
271 } else if (dev->flags & (IFF_NOARP | IFF_LOOPBACK)) { in arp_constructor()
272 neigh->nud_state = NUD_NOARP; in arp_constructor()
273 memcpy(neigh->ha, dev->dev_addr, dev->addr_len); in arp_constructor()
274 } else if (neigh->type == RTN_BROADCAST || in arp_constructor()
275 (dev->flags & IFF_POINTOPOINT)) { in arp_constructor()
276 neigh->nud_state = NUD_NOARP; in arp_constructor()
277 memcpy(neigh->ha, dev->broadcast, dev->addr_len); in arp_constructor()
280 if (dev->header_ops->cache) in arp_constructor()
281 neigh->ops = &arp_hh_ops; in arp_constructor()
283 neigh->ops = &arp_generic_ops; in arp_constructor()
285 if (neigh->nud_state & NUD_VALID) in arp_constructor()
286 neigh->output = neigh->ops->connected_output; in arp_constructor()
288 neigh->output = neigh->ops->output; in arp_constructor()
310 if (dev->flags & IFF_NOARP) in arp_send_dst()
336 struct net_device *dev = neigh->dev; in arp_solicit()
337 __be32 target = *(__be32 *)neigh->primary_key; in arp_solicit()
338 int probes = atomic_read(&neigh->probes); in arp_solicit()
352 ip_hdr(skb)->saddr) == RTN_LOCAL) in arp_solicit()
353 saddr = ip_hdr(skb)->saddr; in arp_solicit()
355 case 1: /* Restrict announcements of saddr in same subnet */ in arp_solicit()
358 saddr = ip_hdr(skb)->saddr; in arp_solicit()
375 probes -= NEIGH_VAR(neigh->parms, UCAST_PROBES); in arp_solicit()
377 if (!(neigh->nud_state & NUD_VALID)) in arp_solicit()
382 probes -= NEIGH_VAR(neigh->parms, APP_PROBES); in arp_solicit()
389 if (skb && !(dev->priv_flags & IFF_XMIT_DST_RELEASE)) in arp_solicit()
392 dst_hw, dev->dev_addr, NULL, dst); in arp_solicit()
397 struct net *net = dev_net(in_dev->dev); in arp_ignore()
403 case 1: /* Reply only if tip is configured on the incoming interface */ in arp_ignore()
424 return 1; in arp_ignore()
440 return 1; in arp_filter()
441 if (rt->dst.dev != dev) { in arp_filter()
443 flag = 1; in arp_filter()
456 int imi, omi = -1; in arp_fwd_proxy()
458 if (rt->dst.dev == dev) in arp_fwd_proxy()
465 return 1; in arp_fwd_proxy()
466 if (imi == -1) in arp_fwd_proxy()
471 out_dev = __in_dev_get_rcu(rt->dst.dev); in arp_fwd_proxy()
475 return omi != imi && omi != -1; in arp_fwd_proxy()
493 * Hewlett-Packard call it Source-Port filtering or port-isolation.
494 * Ericsson call it MAC-Forced Forwarding (RFC Draft).
502 if (rt->dst.dev != dev) in arp_fwd_pvlan()
510 return 1; in arp_fwd_pvlan()
533 int tlen = dev->needed_tailroom; in arp_create()
546 skb->dev = dev; in arp_create()
547 skb->protocol = htons(ETH_P_ARP); in arp_create()
549 src_hw = dev->dev_addr; in arp_create()
551 dest_hw = dev->broadcast; in arp_create()
556 if (dev_hard_header(skb, dev, ptype, dest_hw, src_hw, skb->len) < 0) in arp_create()
563 * which (according to RFC 1390) should always equal 1 (Ethernet). in arp_create()
569 switch (dev->type) { in arp_create()
571 arp->ar_hrd = htons(dev->type); in arp_create()
572 arp->ar_pro = htons(ETH_P_IP); in arp_create()
577 arp->ar_hrd = htons(ARPHRD_AX25); in arp_create()
578 arp->ar_pro = htons(AX25_P_IP); in arp_create()
583 arp->ar_hrd = htons(ARPHRD_NETROM); in arp_create()
584 arp->ar_pro = htons(AX25_P_IP); in arp_create()
591 arp->ar_hrd = htons(ARPHRD_ETHER); in arp_create()
592 arp->ar_pro = htons(ETH_P_IP); in arp_create()
597 arp->ar_hln = dev->addr_len; in arp_create()
598 arp->ar_pln = 4; in arp_create()
599 arp->ar_op = htons(type); in arp_create()
601 arp_ptr = (unsigned char *)(arp + 1); in arp_create()
603 memcpy(arp_ptr, src_hw, dev->addr_len); in arp_create()
604 arp_ptr += dev->addr_len; in arp_create()
608 switch (dev->type) { in arp_create()
615 memcpy(arp_ptr, target_hw, dev->addr_len); in arp_create()
617 memset(arp_ptr, 0, dev->addr_len); in arp_create()
618 arp_ptr += dev->addr_len; in arp_create()
642 dev_net(skb->dev), NULL, skb, NULL, skb->dev, in arp_xmit()
650 unsigned char *sha, unsigned char *tha) in arp_is_garp() argument
663 !memcmp(tha, sha, dev->addr_len); in arp_is_garp()
679 struct net_device *dev = skb->dev; in arp_process()
684 unsigned char *sha; in arp_process() local
687 u16 dev_type = dev->type; in arp_process()
704 if (arp->ar_pro != htons(ETH_P_IP) || in arp_process()
705 htons(dev_type) != arp->ar_hrd) in arp_process()
714 * hardware types of either 1 (Ethernet) or 6 (IEEE 802.2). in arp_process()
716 * FDDI devices should accept ARP hardware of (1) Ethernet, in arp_process()
717 * however, to be more robust, we'll accept both 1 (Ethernet) in arp_process()
720 if ((arp->ar_hrd != htons(ARPHRD_ETHER) && in arp_process()
721 arp->ar_hrd != htons(ARPHRD_IEEE802)) || in arp_process()
722 arp->ar_pro != htons(ETH_P_IP)) in arp_process()
726 if (arp->ar_pro != htons(AX25_P_IP) || in arp_process()
727 arp->ar_hrd != htons(ARPHRD_AX25)) in arp_process()
731 if (arp->ar_pro != htons(AX25_P_IP) || in arp_process()
732 arp->ar_hrd != htons(ARPHRD_NETROM)) in arp_process()
739 if (arp->ar_op != htons(ARPOP_REPLY) && in arp_process()
740 arp->ar_op != htons(ARPOP_REQUEST)) in arp_process()
746 arp_ptr = (unsigned char *)(arp + 1); in arp_process()
747 sha = arp_ptr; in arp_process()
748 arp_ptr += dev->addr_len; in arp_process()
758 arp_ptr += dev->addr_len; in arp_process()
781 sha = dev->broadcast; in arp_process()
800 if (arp->ar_op == htons(ARPOP_REQUEST) && skb_metadata_dst(skb)) in arp_process()
807 if (arp->ar_op == htons(ARPOP_REQUEST) && in arp_process()
811 sha, dev->dev_addr, sha, reply_dst); in arp_process()
815 if (arp->ar_op == htons(ARPOP_REQUEST) && in arp_process()
819 addr_type = rt->rt_type; in arp_process()
828 n = neigh_event_ns(&arp_tbl, sha, &sip, dev); in arp_process()
831 sip, dev, tip, sha, in arp_process()
832 dev->dev_addr, sha, in arp_process()
842 (rt->dst.dev != dev && in arp_process()
844 n = neigh_event_ns(&arp_tbl, sha, &sip, dev); in arp_process()
848 if (NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED || in arp_process()
849 skb->pkt_type == PACKET_HOST || in arp_process()
850 NEIGH_VAR(in_dev->arp_parms, PROXY_DELAY) == 0) { in arp_process()
852 sip, dev, tip, sha, in arp_process()
853 dev->dev_addr, sha, in arp_process()
857 in_dev->arp_parms, skb); in arp_process()
869 addr_type = -1; in arp_process()
871 is_garp = arp_is_garp(net, dev, &addr_type, arp->ar_op, in arp_process()
872 sip, tip, sha, tha); in arp_process()
882 (arp->ar_op == htons(ARPOP_REPLY) && in arp_process()
888 n = __neigh_lookup(&arp_tbl, &sip, dev, 1); in arp_process()
895 /* If several different ARP replies follows back-to-back, in arp_process()
901 n->updated + in arp_process()
902 NEIGH_VAR(n->parms, LOCKTIME)) || in arp_process()
908 if (arp->ar_op != htons(ARPOP_REPLY) || in arp_process()
909 skb->pkt_type != PACKET_HOST) in arp_process()
911 neigh_update(n, sha, state, in arp_process()
930 arp_process(dev_net(skb->dev), NULL, skb); in parp_redo()
948 if (dev->flags & IFF_NOARP || in arp_rcv()
949 skb->pkt_type == PACKET_OTHERHOST || in arp_rcv()
950 skb->pkt_type == PACKET_LOOPBACK) in arp_rcv()
962 if (arp->ar_hln != dev->addr_len || arp->ar_pln != 4) in arp_rcv()
998 return -ENXIO; in arp_req_set_proxy()
1004 __be32 ip = ((struct sockaddr_in *)&r->arp_pa)->sin_addr.s_addr; in arp_req_set_public()
1005 __be32 mask = ((struct sockaddr_in *)&r->arp_netmask)->sin_addr.s_addr; in arp_req_set_public()
1008 return -EINVAL; in arp_req_set_public()
1009 if (!dev && (r->arp_flags & ATF_COM)) { in arp_req_set_public()
1010 dev = dev_getbyhwaddr_rcu(net, r->arp_ha.sa_family, in arp_req_set_public()
1011 r->arp_ha.sa_data); in arp_req_set_public()
1013 return -ENODEV; in arp_req_set_public()
1016 if (!pneigh_lookup(&arp_tbl, net, &ip, dev, 1)) in arp_req_set_public()
1017 return -ENOBUFS; in arp_req_set_public()
1021 return arp_req_set_proxy(net, dev, 1); in arp_req_set_public()
1031 if (r->arp_flags & ATF_PUBL) in arp_req_set()
1034 ip = ((struct sockaddr_in *)&r->arp_pa)->sin_addr.s_addr; in arp_req_set()
1035 if (r->arp_flags & ATF_PERM) in arp_req_set()
1036 r->arp_flags |= ATF_COM; in arp_req_set()
1042 dev = rt->dst.dev; in arp_req_set()
1045 return -EINVAL; in arp_req_set()
1047 switch (dev->type) { in arp_req_set()
1052 * hardware types of 1 (Ethernet). However, to be more in arp_req_set()
1053 * robust, we'll accept hardware types of either 1 (Ethernet) in arp_req_set()
1056 if (r->arp_ha.sa_family != ARPHRD_FDDI && in arp_req_set()
1057 r->arp_ha.sa_family != ARPHRD_ETHER && in arp_req_set()
1058 r->arp_ha.sa_family != ARPHRD_IEEE802) in arp_req_set()
1059 return -EINVAL; in arp_req_set()
1063 if (r->arp_ha.sa_family != dev->type) in arp_req_set()
1064 return -EINVAL; in arp_req_set()
1072 if (r->arp_flags & ATF_PERM) in arp_req_set()
1074 err = neigh_update(neigh, (r->arp_flags & ATF_COM) ? in arp_req_set()
1075 r->arp_ha.sa_data : NULL, state, in arp_req_set()
1085 if (neigh->nud_state&NUD_PERMANENT) in arp_state_to_flags()
1087 else if (neigh->nud_state&NUD_VALID) in arp_state_to_flags()
1099 __be32 ip = ((struct sockaddr_in *) &r->arp_pa)->sin_addr.s_addr; in arp_req_get()
1101 int err = -ENXIO; in arp_req_get()
1105 if (!(neigh->nud_state & NUD_NOARP)) { in arp_req_get()
1106 read_lock_bh(&neigh->lock); in arp_req_get()
1107 memcpy(r->arp_ha.sa_data, neigh->ha, dev->addr_len); in arp_req_get()
1108 r->arp_flags = arp_state_to_flags(neigh); in arp_req_get()
1109 read_unlock_bh(&neigh->lock); in arp_req_get()
1110 r->arp_ha.sa_family = dev->type; in arp_req_get()
1111 strlcpy(r->arp_dev, dev->name, sizeof(r->arp_dev)); in arp_req_get()
1122 int err = -ENXIO; in arp_invalidate()
1126 if (neigh->nud_state & ~NUD_NOARP) in arp_invalidate()
1130 write_lock_bh(&tbl->lock); in arp_invalidate()
1133 write_unlock_bh(&tbl->lock); in arp_invalidate()
1142 __be32 ip = ((struct sockaddr_in *) &r->arp_pa)->sin_addr.s_addr; in arp_req_delete_public()
1143 __be32 mask = ((struct sockaddr_in *)&r->arp_netmask)->sin_addr.s_addr; in arp_req_delete_public()
1149 return -EINVAL; in arp_req_delete_public()
1159 if (r->arp_flags & ATF_PUBL) in arp_req_delete()
1162 ip = ((struct sockaddr_in *)&r->arp_pa)->sin_addr.s_addr; in arp_req_delete()
1167 dev = rt->dst.dev; in arp_req_delete()
1170 return -EINVAL; in arp_req_delete()
1188 if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) in arp_ioctl()
1189 return -EPERM; in arp_ioctl()
1194 return -EFAULT; in arp_ioctl()
1197 return -EINVAL; in arp_ioctl()
1201 return -EPFNOSUPPORT; in arp_ioctl()
1205 return -EINVAL; in arp_ioctl()
1207 ((struct sockaddr_in *)&r.arp_netmask)->sin_addr.s_addr = in arp_ioctl()
1211 err = -ENODEV; in arp_ioctl()
1218 r.arp_ha.sa_family = dev->type; in arp_ioctl()
1219 err = -EINVAL; in arp_ioctl()
1220 if ((r.arp_flags & ATF_COM) && r.arp_ha.sa_family != dev->type) in arp_ioctl()
1223 err = -ENODEV; in arp_ioctl()
1241 err = -EFAULT; in arp_ioctl()
1258 if (change_info->flags_changed & IFF_NOARP) in arp_netdev_event()
1310 /* ------------------------------------------------------------------------ */
1312 * ax25 -> ASCII conversion
1320 c = (a->ax25_call[n] >> 1) & 0x7F; in ax2asc2()
1326 *s++ = '-'; in ax2asc2()
1327 n = (a->ax25_call[6] >> 1) & 0x0F; in ax2asc2()
1329 *s++ = '1'; in ax2asc2()
1330 n -= 10; in ax2asc2()
1336 if (*buf == '\0' || *buf == '-') { in ax2asc2()
1338 buf[1] = '\0'; in ax2asc2()
1351 struct net_device *dev = n->dev; in arp_format_neigh_entry()
1352 int hatype = dev->type; in arp_format_neigh_entry()
1354 read_lock(&n->lock); in arp_format_neigh_entry()
1358 ax2asc2((ax25_address *)n->ha, hbuffer); in arp_format_neigh_entry()
1361 for (k = 0, j = 0; k < HBUFFERLEN - 3 && j < dev->addr_len; j++) { in arp_format_neigh_entry()
1362 hbuffer[k++] = hex_asc_hi(n->ha[j]); in arp_format_neigh_entry()
1363 hbuffer[k++] = hex_asc_lo(n->ha[j]); in arp_format_neigh_entry()
1367 --k; in arp_format_neigh_entry()
1372 sprintf(tbuf, "%pI4", n->primary_key); in arp_format_neigh_entry()
1373 seq_printf(seq, "%-16s 0x%-10x0x%-10x%-17s * %s\n", in arp_format_neigh_entry()
1374 tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name); in arp_format_neigh_entry()
1375 read_unlock(&n->lock); in arp_format_neigh_entry()
1381 struct net_device *dev = n->dev; in arp_format_pneigh_entry()
1382 int hatype = dev ? dev->type : 0; in arp_format_pneigh_entry()
1385 sprintf(tbuf, "%pI4", n->key); in arp_format_pneigh_entry()
1386 seq_printf(seq, "%-16s 0x%-10x0x%-10x%s * %s\n", in arp_format_pneigh_entry()
1388 dev ? dev->name : "*"); in arp_format_pneigh_entry()
1397 struct neigh_seq_state *state = seq->private; in arp_seq_show()
1399 if (state->flags & NEIGH_SEQ_IS_PNEIGH) in arp_seq_show()
1410 /* Don't want to confuse "arp -a" w/ magic entries, in arp_seq_start()
1416 /* ------------------------------------------------------------------------ */
1425 /* ------------------------------------------------------------------------ */
1429 if (!proc_create_net("arp", 0444, net->proc_net, &arp_seq_ops, in arp_net_init()
1431 return -ENOMEM; in arp_net_init()
1437 remove_proc_entry("arp", net->proc_net); in arp_net_exit()