Lines Matching +full:remote +full:- +full:mac +full:- +full:address

2  * Copyright (c) 2016-2018 Intel Corporation.
4 * SPDX-License-Identifier: Apache-2.0
53 * "An IP host group address is mapped to an Ethernet multicast in net_eth_ipv4_mcast_to_mac_addr()
54 * address by placing the low-order 23-bits of the IP address into in net_eth_ipv4_mcast_to_mac_addr()
55 * the low-order 23 bits of the Ethernet multicast address in net_eth_ipv4_mcast_to_mac_addr()
56 * 01-00-5E-00-00-00 (hex)." in net_eth_ipv4_mcast_to_mac_addr()
58 mac_addr->addr[0] = 0x01; in net_eth_ipv4_mcast_to_mac_addr()
59 mac_addr->addr[1] = 0x00; in net_eth_ipv4_mcast_to_mac_addr()
60 mac_addr->addr[2] = 0x5e; in net_eth_ipv4_mcast_to_mac_addr()
61 mac_addr->addr[3] = ipv4_addr->s4_addr[1]; in net_eth_ipv4_mcast_to_mac_addr()
62 mac_addr->addr[4] = ipv4_addr->s4_addr[2]; in net_eth_ipv4_mcast_to_mac_addr()
63 mac_addr->addr[5] = ipv4_addr->s4_addr[3]; in net_eth_ipv4_mcast_to_mac_addr()
65 mac_addr->addr[3] &= 0x7f; in net_eth_ipv4_mcast_to_mac_addr()
71 /* RFC 2464 7. Address Mapping -- Multicast in net_eth_ipv6_mcast_to_mac_addr()
72 * "An IPv6 packet with a multicast destination address DST, in net_eth_ipv6_mcast_to_mac_addr()
74 * is transmitted to the Ethernet multicast address whose in net_eth_ipv6_mcast_to_mac_addr()
78 mac_addr->addr[0] = mac_addr->addr[1] = 0x33; in net_eth_ipv6_mcast_to_mac_addr()
79 memcpy(mac_addr->addr + 2, &ipv6_addr->s6_addr[12], 4); in net_eth_ipv6_mcast_to_mac_addr()
87 net_sprint_ll_addr((src)->addr, \
93 net_sprint_ll_addr((dst)->addr, \
104 net_sprint_ll_addr((src)->addr, \
111 net_sprint_ll_addr((dst)->addr, \
133 len = ntohs(NET_IPV4_HDR(pkt)->len); in ethernet_update_length()
135 len = ntohs(NET_IPV6_HDR(pkt)->len) + NET_IPV6H_LEN; in ethernet_update_length()
138 if (len < NET_ETH_MINIMAL_FRAME_SIZE - sizeof(struct net_eth_hdr)) { in ethernet_update_length()
141 for (frag = pkt->frags; frag; frag = frag->frags) { in ethernet_update_length()
142 if (frag->len < len) { in ethernet_update_length()
143 len -= frag->len; in ethernet_update_length()
145 frag->len = len; in ethernet_update_length()
159 if (net_eth_is_addr_broadcast(&hdr->dst)) { in ethernet_update_rx_stats()
161 } else if (net_eth_is_addr_multicast(&hdr->dst)) { in ethernet_update_rx_stats()
172 /* Drop packet if it has broadcast destination MAC address but the IP
173 * address is not multicast or broadcast address. See RFC 1122 ch 3.3.6
179 if (net_eth_is_addr_broadcast(&hdr->dst) && in ethernet_check_ipv4_bcast_addr()
180 !(net_ipv4_is_addr_mcast((struct in_addr *)NET_IPV4_HDR(pkt)->dst) || in ethernet_check_ipv4_bcast_addr()
182 (struct in_addr *)NET_IPV4_HDR(pkt)->dst))) { in ethernet_check_ipv4_bcast_addr()
201 const struct ethernet_api *api = dev->api; in ethernet_mcast_monitor_cb()
212 if (!api || !api->set_config) { in ethernet_mcast_monitor_cb()
216 switch (addr->family) { in ethernet_mcast_monitor_cb()
219 net_eth_ipv4_mcast_to_mac_addr(&addr->in_addr, &cfg.filter.mac_address); in ethernet_mcast_monitor_cb()
224 net_eth_ipv6_mcast_to_mac_addr(&addr->in6_addr, &cfg.filter.mac_address); in ethernet_mcast_monitor_cb()
231 api->set_config(dev, ETHERNET_CONFIG_TYPE_FILTER, &cfg); in ethernet_mcast_monitor_cb()
251 if (hdr == NULL || pkt->buffer->len < hdr_len) { in ethernet_recv()
276 type = ntohs(hdr->type); in ethernet_recv()
285 net_pkt_set_vlan_tci(pkt, ntohs(hdr_vlan->vlan.tci)); in ethernet_recv()
286 type = ntohs(hdr_vlan->type); in ethernet_recv()
305 if (net_if_l2(net_pkt_iface(pkt))->recv != NULL) { in ethernet_recv()
306 verdict = net_if_l2(net_pkt_iface(pkt))->recv(iface, pkt); in ethernet_recv()
334 net_buf_pull(pkt->frags, hdr_len); in ethernet_recv()
354 lladdr->addr = hdr->src.addr; in ethernet_recv()
355 lladdr->len = sizeof(struct net_eth_addr); in ethernet_recv()
356 lladdr->type = NET_LINK_ETHERNET; in ethernet_recv()
359 lladdr->addr = hdr->dst.addr; in ethernet_recv()
360 lladdr->len = sizeof(struct net_eth_addr); in ethernet_recv()
361 lladdr->type = NET_LINK_ETHERNET; in ethernet_recv()
377 if (!net_eth_is_addr_broadcast((struct net_eth_addr *)lladdr->addr) && in ethernet_recv()
378 !net_eth_is_addr_multicast((struct net_eth_addr *)lladdr->addr) && in ethernet_recv()
380 (struct net_eth_addr *)lladdr->addr) && in ethernet_recv()
381 !net_eth_is_addr_ptp_multicast((struct net_eth_addr *)lladdr->addr) && in ethernet_recv()
387 net_sprint_ll_addr(net_if_get_link_addr(iface)->addr, in ethernet_recv()
392 net_buf_pull(pkt->frags, hdr_len); in ethernet_recv()
404 net_sprint_ll_addr((uint8_t *)hdr->src.addr, in ethernet_recv()
433 (struct in_addr *)NET_IPV4_HDR(pkt)->dst) || in ethernet_ipv4_dst_is_broadcast_or_mcast()
434 net_ipv4_is_addr_mcast((struct in_addr *)NET_IPV4_HDR(pkt)->dst)) { in ethernet_ipv4_dst_is_broadcast_or_mcast()
445 net_ipv4_is_addr_mcast((struct in_addr *)NET_IPV4_HDR(pkt)->dst)) { in ethernet_fill_in_dst_on_ipv4_mcast()
446 /* Multicast address */ in ethernet_fill_in_dst_on_ipv4_mcast()
448 (struct in_addr *)NET_IPV4_HDR(pkt)->dst, dst); in ethernet_fill_in_dst_on_ipv4_mcast()
476 arp_pkt = net_arp_prepare(pkt, (struct in_addr *)NET_IPV4_HDR(pkt)->dst, NULL); in ethernet_ll_prepare_on_ipv4()
505 net_ipv6_is_addr_mcast((struct in6_addr *)NET_IPV6_HDR(pkt)->dst)) { in ethernet_fill_in_dst_on_ipv6_mcast()
507 sizeof(struct net_eth_addr) - 4); in ethernet_fill_in_dst_on_ipv6_mcast()
509 NET_IPV6_HDR(pkt)->dst + 12, in ethernet_fill_in_dst_on_ipv6_mcast()
510 sizeof(struct net_eth_addr) - 2); in ethernet_fill_in_dst_on_ipv6_mcast()
569 hdr_frag = pkt->buffer; in ethernet_fill_header()
574 net_buf_push(pkt->buffer, hdr_len); in ethernet_fill_header()
594 hdr_vlan = (struct net_eth_vlan_hdr *)(hdr_frag->data); in ethernet_fill_header()
597 (!ethernet_fill_in_dst_on_ipv4_mcast(pkt, &hdr_vlan->dst) && in ethernet_fill_header()
598 !ethernet_fill_in_dst_on_ipv6_mcast(pkt, &hdr_vlan->dst))) { in ethernet_fill_header()
599 memcpy(&hdr_vlan->dst, net_pkt_lladdr_dst(pkt)->addr, in ethernet_fill_header()
603 memcpy(&hdr_vlan->src, net_pkt_lladdr_src(pkt)->addr, in ethernet_fill_header()
606 hdr_vlan->type = ptype; in ethernet_fill_header()
607 hdr_vlan->vlan.tpid = htons(NET_ETH_PTYPE_VLAN); in ethernet_fill_header()
608 hdr_vlan->vlan.tci = htons(net_pkt_vlan_tci(pkt)); in ethernet_fill_header()
610 print_vlan_ll_addrs(pkt, ntohs(hdr_vlan->type), in ethernet_fill_header()
613 &hdr_vlan->src, &hdr_vlan->dst, false); in ethernet_fill_header()
615 hdr = (struct net_eth_hdr *)(hdr_frag->data); in ethernet_fill_header()
623 (!ethernet_fill_in_dst_on_ipv4_mcast(pkt, &hdr->dst) && in ethernet_fill_header()
624 !ethernet_fill_in_dst_on_ipv6_mcast(pkt, &hdr->dst))) { in ethernet_fill_header()
625 memcpy(&hdr->dst, net_pkt_lladdr_dst(pkt)->addr, in ethernet_fill_header()
629 memcpy(&hdr->src, net_pkt_lladdr_src(pkt)->addr, in ethernet_fill_header()
632 hdr->type = ptype; in ethernet_fill_header()
634 print_ll_addrs(pkt, ntohs(hdr->type), in ethernet_fill_header()
635 hdr_len, &hdr->src, &hdr->dst); in ethernet_fill_header()
653 if (net_eth_is_addr_multicast(&hdr->dst)) { in ethernet_update_tx_stats()
655 } else if (net_eth_is_addr_broadcast(&hdr->dst)) { in ethernet_update_tx_stats()
670 buf = pkt->buffer; in ethernet_remove_l2_header()
671 pkt->buffer = buf->frags; in ethernet_remove_l2_header()
672 buf->frags = NULL; in ethernet_remove_l2_header()
676 net_buf_pull(pkt->buffer, reserve); in ethernet_remove_l2_header()
682 const struct ethernet_api *api = net_if_get_device(iface)->api; in ethernet_send()
689 ret = -ENOENT; in ethernet_send()
693 if (!api->send) { in ethernet_send()
694 ret = -ENOTSUP; in ethernet_send()
715 ret = -ENOMEM; in ethernet_send()
739 /* The destination address is set in remote for this in ethernet_send()
742 dst_addr = (struct sockaddr_ll *)&context->remote; in ethernet_send()
743 src_addr = (struct sockaddr_ll_ptr *)&context->local; in ethernet_send()
745 net_pkt_lladdr_dst(pkt)->addr = dst_addr->sll_addr; in ethernet_send()
746 net_pkt_lladdr_dst(pkt)->len = in ethernet_send()
748 net_pkt_lladdr_src(pkt)->addr = src_addr->sll_addr; in ethernet_send()
749 net_pkt_lladdr_src(pkt)->len = in ethernet_send()
751 ptype = dst_addr->sll_protocol; in ethernet_send()
765 ret = -ENOTSUP; in ethernet_send()
773 if (!net_pkt_lladdr_dst(pkt)->addr) { in ethernet_send()
774 net_pkt_lladdr_dst(pkt)->addr = (uint8_t *)broadcast_eth_addr.addr; in ethernet_send()
775 net_pkt_lladdr_dst(pkt)->len = sizeof(struct net_eth_addr); in ethernet_send()
783 ret = -ENOMEM; in ethernet_send()
797 ret = -ENOMEM; in ethernet_send()
812 ret = net_l2_send(api->send, net_if_get_device(iface), iface, pkt); in ethernet_send()
836 iface, (struct in_addr *)NET_IPV4_HDR(pkt)->dst)) { in ethernet_send()
850 net_if_get_device(iface)->api; in ethernet_enable()
853 return -ENOENT; in ethernet_enable()
859 if (eth->stop) { in ethernet_enable()
860 ret = eth->stop(net_if_get_device(iface)); in ethernet_enable()
863 if (eth->start) { in ethernet_enable()
864 ret = eth->start(net_if_get_device(iface)); in ethernet_enable()
875 return ctx->ethernet_l2_flags; in ethernet_flags()
900 if (ctx->iface == NULL) { in carrier_on_off()
904 eth_carrier_up = atomic_test_bit(&ctx->flags, ETH_CARRIER_UP); in carrier_on_off()
906 if (eth_carrier_up == ctx->is_net_carrier_up) { in carrier_on_off()
910 ctx->is_net_carrier_up = eth_carrier_up; in carrier_on_off()
913 ctx->iface); in carrier_on_off()
916 ethernet_mgmt_raise_carrier_on_event(ctx->iface); in carrier_on_off()
917 net_if_carrier_on(ctx->iface); in carrier_on_off()
919 ethernet_mgmt_raise_carrier_off_event(ctx->iface); in carrier_on_off()
920 net_if_carrier_off(ctx->iface); in carrier_on_off()
928 if (!atomic_test_and_set_bit(&ctx->flags, ETH_CARRIER_UP)) { in net_eth_carrier_on()
929 k_work_submit(&ctx->carrier_work); in net_eth_carrier_on()
937 if (atomic_test_and_clear_bit(&ctx->flags, ETH_CARRIER_UP)) { in net_eth_carrier_off()
938 k_work_submit(&ctx->carrier_work); in net_eth_carrier_off()
945 const struct ethernet_api *api = dev->api; in net_eth_get_phy()
955 if (!api->get_phy) { in net_eth_get_phy()
959 return api->get_phy(net_if_get_device(iface)); in net_eth_get_phy()
966 const struct ethernet_api *api = dev->api; in net_eth_get_ptp_clock()
980 if (!api->get_ptp_clock) { in net_eth_get_ptp_clock()
984 return api->get_ptp_clock(net_if_get_device(iface)); in net_eth_get_ptp_clock()
1022 return ctx->port; in net_eth_get_ptp_port()
1029 ctx->port = port; in net_eth_set_ptp_port()
1039 return -ENOTSUP; in net_eth_promisc_mode()
1054 return -ENOTSUP; in net_eth_txinjection_mode()
1063 int net_eth_mac_filter(struct net_if *iface, struct net_eth_addr *mac, in net_eth_mac_filter() argument
1070 return -ENOTSUP; in net_eth_mac_filter()
1073 memcpy(&params.filter.mac_address, mac, sizeof(struct net_eth_addr)); in net_eth_mac_filter()
1081 ARG_UNUSED(mac); in net_eth_mac_filter()
1085 return -ENOTSUP; in net_eth_mac_filter()
1096 ctx->ethernet_l2_flags = NET_L2_MULTICAST; in ethernet_init()
1097 ctx->iface = iface; in ethernet_init()
1098 k_work_init(&ctx->carrier_work, carrier_on_off); in ethernet_init()
1101 ctx->ethernet_l2_flags |= NET_L2_PROMISC_MODE; in ethernet_init()
1112 ctx->is_init = true; in ethernet_init()