1
0
mirror of https://github.com/rtbrick/bngblaster.git synced 2024-05-06 15:54:57 +00:00

Fix MC MAC Addresses

This commit is contained in:
Christian Giese
2021-10-28 13:59:44 +02:00
parent 1dea03ccc2
commit cc33597301
8 changed files with 54 additions and 22 deletions

View File

@ -111,10 +111,7 @@ bbl_add_multicast_packets(bbl_ctx_s *ctx)
}
group = htobe32(group);
/* Generate multicast destination MAC */
*(uint32_t*)(&mac[2]) = group;
mac[0] = 0x01;
mac[2] = 0x5e;
mac[3] &= 0x7f;
ipv4_multicast_mac(group, mac);
eth.src = interface->mac;
eth.dst = mac;
eth.vlan_outer = interface->vlan;

View File

@ -266,6 +266,10 @@ bbl_add_network_interfaces(bbl_ctx_s *ctx)
if(network_config->ip6.len && network_config->gateway6.len) {
memcpy(&network_if->ip6, &network_config->ip6, sizeof(ipv6_prefix));
memcpy(&network_if->gateway6, &network_config->gateway6, sizeof(ipv6_prefix));
memcpy(&network_if->gateway6_solicited_node_multicast, &ipv6_solicited_node_multicast, sizeof(ipv6addr_t));
memcpy(((uint8_t*)&network_if->gateway6_solicited_node_multicast)+13,
((uint8_t*)&network_if->gateway6.address)+13, 3);
/* Send initial ICMPv6 NS */
network_if->send_requests |= BBL_IF_SEND_ICMPV6_NS;
}

View File

@ -70,8 +70,9 @@ typedef struct bbl_interface_
ipv6_prefix ip6;
ipv6_prefix gateway6;
bool icmpv6_nd_resolved;
ipv6addr_t gateway6_solicited_node_multicast;
bool icmpv6_nd_resolved;
bool gateway_resolve_wait;
uint8_t *mc_packets;

View File

@ -235,12 +235,11 @@ static const ipv6addr_t ipv6_link_local_prefix = {0xFE, 0x80, 0x00, 0x00, 0x00,
static const ipv6addr_t ipv6_multicast_all_nodes = {0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
static const ipv6addr_t ipv6_multicast_all_routers = {0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02};
static const ipv6addr_t ipv6_multicast_all_dhcp = {0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02};
static const ipv6addr_t ipv6_solicited_node_multicast = {0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0x00, 0x00};
/* MAC Addresses */
static const uint8_t broadcast_mac[ETH_ADDR_LEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
static const uint8_t multicast_mac[ETH_ADDR_LEN] = { 0x01, 0x00, 0x5e, 0x00, 0x00, 0x00};
static const uint8_t ipv6_multicast_mac[ETH_ADDR_LEN] = { 0x33, 0x33, 0xff, 0x00, 0x00, 0x10};
static const uint8_t ipv6_multicast_mac_dhcp[ETH_ADDR_LEN] = { 0x33, 0x33, 0x00, 0x01, 0x00, 0x02};
typedef enum protocol_error_ {
PROTOCOL_SUCCESS = 0,

View File

@ -522,10 +522,7 @@ bbl_stream_build_network_packet(bbl_stream *stream) {
/* All IPv4 multicast addresses start with 1110 */
if((ipv4.dst & htobe32(0xf0000000)) == htobe32(0xe0000000)) {
/* Generate multicast destination MAC */
*(uint32_t*)(&mac[2]) = ipv4.dst;
mac[0] = 0x01;
mac[2] = 0x5e;
mac[3] &= 0x7f;
ipv4_multicast_mac(ipv4.dst, mac);
eth.dst = mac;
bbl.type = BBL_TYPE_MULTICAST;
bbl.mc_source = ipv4.src;

View File

@ -538,12 +538,12 @@ bbl_encode_packet_icmpv6_rs (bbl_session_s *session) {
bbl_pppoe_session_t pppoe = {0};
bbl_ipv6_t ipv6 = {0};
bbl_icmpv6_t icmpv6 = {0};
uint8_t mac[ETH_ADDR_LEN];
interface = session->interface;
ctx = interface->ctx;
interface->stats.icmpv6_tx++;
eth.dst = session->server_mac;
eth.src = session->client_mac;
eth.qinq = session->access_config->qinq;
eth.vlan_outer = session->vlan_key.outer_vlan_id;
@ -555,13 +555,17 @@ bbl_encode_packet_icmpv6_rs (bbl_session_s *session) {
if(session->ip6cp_state != BBL_PPP_OPENED) {
return WRONG_PROTOCOL_STATE;
}
eth.dst = session->server_mac;
eth.type = ETH_TYPE_PPPOE_SESSION;
eth.next = &pppoe;
pppoe.session_id = session->pppoe_session_id;
pppoe.protocol = PROTOCOL_IPV6;
pppoe.next = &ipv6;
} else {
/* IPoE */
ipv6_multicast_mac(ipv6_multicast_all_routers, mac);
eth.dst = mac;
eth.type = ETH_TYPE_IPV6;
eth.next = &ipv6;
}
@ -616,6 +620,7 @@ bbl_encode_packet_dhcpv6_request (bbl_session_s *session) {
bbl_udp_t udp = {0};
bbl_dhcpv6_t dhcpv6 = {0};
access_line_t access_line = {0};
uint8_t mac[ETH_ADDR_LEN];
if(session->dhcpv6_state == BBL_DHCP_INIT ||
session->dhcpv6_state == BBL_DHCP_BOUND) {
@ -649,7 +654,8 @@ bbl_encode_packet_dhcpv6_request (bbl_session_s *session) {
pppoe.next = &ipv6;
} else {
/* IPoE */
eth.dst = (void*)ipv6_multicast_mac_dhcp;
ipv6_multicast_mac(ipv6_multicast_all_dhcp, mac);
eth.dst = mac;
eth.vlan_outer_priority = ctx->config.dhcpv6_vlan_priority;
eth.type = ETH_TYPE_IPV6;
eth.next = &ipv6;
@ -1628,6 +1634,7 @@ bbl_encode_interface_packet (bbl_interface_s *interface, uint8_t *buf, uint16_t
bbl_arp_t arp = {0};
bbl_ipv6_t ipv6 = {0};
bbl_icmpv6_t icmpv6 = {0};
uint8_t mac[ETH_ADDR_LEN];
*len = 0;
@ -1649,15 +1656,12 @@ bbl_encode_interface_packet (bbl_interface_s *interface, uint8_t *buf, uint16_t
result = encode_ethernet(buf, len, &eth);
} else if(interface->send_requests & BBL_IF_SEND_ICMPV6_NS) {
interface->send_requests &= ~BBL_IF_SEND_ICMPV6_NS;
if(*(uint32_t*)interface->gateway_mac == 0) {
eth.dst = (uint8_t*)ipv6_multicast_mac;
} else {
eth.dst = interface->gateway_mac;
}
ipv6_multicast_mac(interface->gateway6_solicited_node_multicast, mac);
eth.dst = mac;
eth.type = ETH_TYPE_IPV6;
eth.next = &ipv6;
ipv6.src = interface->ip6.address;
ipv6.dst = interface->gateway6.address;
ipv6.dst = interface->gateway6_solicited_node_multicast;
ipv6.protocol = IPV6_NEXT_HEADER_ICMPV6;
ipv6.next = &icmpv6;
ipv6.ttl = 255;

View File

@ -164,3 +164,31 @@ replace_substring (const char* source,
*result_pos = '\0';
return result;
}
/**
* ipv4_multicast_mac
*
* @param ipv4 IPv4 multicast address
* @param mac target buffer to store multicast MAC
*/
void
ipv4_multicast_mac(const uint32_t ipv4, uint8_t* mac) {
*(uint32_t*)(&mac[2]) = ipv4;
mac[0] = 0x01;
mac[1] = 0x00;
mac[2] = 0x5e;
mac[3] &= 0x7f;
}
/**
* ipv6_multicast_mac
*
* @param ipv6 IPv6 multicast address
* @param mac target buffer to store multicast MAC
*/
void
ipv6_multicast_mac(const uint8_t *ipv6, uint8_t* mac) {
*(uint32_t*)(&mac[2]) =*(uint32_t*)(&ipv6[12]);
mac[0] = 0x33;
mac[1] = 0x33;
}

View File

@ -21,7 +21,9 @@ char *format_mac_address(uint8_t *mac);
char *format_ipv4_address(uint32_t *addr4);
char *format_ipv6_address(ipv6addr_t *addr6);
char *format_ipv6_prefix(ipv6_prefix *addr6);
void ipv4_multicast_mac(const uint32_t ipv4, uint8_t* mac);
void ipv6_multicast_mac(const uint8_t *ipv6, uint8_t* mac);
char *replace_substring (const char* s, const char* old, const char* new);
const char *val2key (struct keyval_ *keyval, uint val);
#endif
#endif