Fix VLAN/session lookup

This commit is contained in:
Christian Giese
2021-03-22 10:49:09 +01:00
parent 5a67810758
commit 34bf97cff8
5 changed files with 65 additions and 66 deletions
+6 -11
View File
@@ -381,7 +381,6 @@ bbl_init_sessions (bbl_ctx_s *ctx)
bbl_access_config_s *access_config;
dict_insert_result result;
vlan_session_key_t key = {0};
uint32_t i = 1; /* BNG Blaster internal session identifier */
@@ -460,8 +459,9 @@ bbl_init_sessions (bbl_ctx_s *ctx)
memset(&session->server_mac, 0xff, ETH_ADDR_LEN); // init with broadcast MAC
session->session_id = i; // BNG Blaster internal session identifier
session->access_type = access_config->access_type;
session->outer_vlan_id= access_config->access_outer_vlan;
session->inner_vlan_id = access_config->access_inner_vlan;
session->vlan_key.ifindex = access_config->access_if->ifindex;
session->vlan_key.outer_vlan_id= access_config->access_outer_vlan;
session->vlan_key.inner_vlan_id = access_config->access_inner_vlan;
session->access_third_vlan = access_config->access_third_vlan;
session->access_config = access_config;
@@ -553,15 +553,10 @@ bbl_init_sessions (bbl_ctx_s *ctx)
if(access_config->vlan_mode == VLAN_MODE_11) {
/* Add 1:1 sessions to VLAN/session dictionary */
key.ifindex = access_config->access_if->ifindex;
key.outer_vlan_id = session->outer_vlan_id;
key.inner_vlan_id = session->inner_vlan_id;
result = dict_insert(ctx->vlan_session_dict, &key);
if (!result.inserted) {
free(session);
return NULL;
result = dict_insert(ctx->vlan_session_dict, &session->vlan_key);
if (result.inserted) {
*result.datum_ptr = session;
}
*result.datum_ptr = session;
}
LOG(DEBUG, "Session %u created (%s.%u:%u)\n", i, access_config->interface, access_config->access_outer_vlan, access_config->access_inner_vlan);
+7 -3
View File
@@ -631,9 +631,13 @@ typedef struct bbl_session_
struct timer_ *timer_session_traffic_ipv6pd;
bbl_access_type_t access_type;
uint16_t outer_vlan_id;
uint16_t inner_vlan_id;
struct {
uint32_t ifindex;
uint16_t outer_vlan_id;
uint16_t inner_vlan_id;
} vlan_key;
uint16_t access_third_vlan;
/* Set to true if session is tunnelled via L2TP. */
+2 -2
View File
@@ -489,8 +489,8 @@ bbl_ctrl_session_info(int fd, bbl_ctx_s *ctx, uint32_t session_id, json_t* argum
"session-id", session->session_id,
"session-state", session_state_string(session->session_state),
"interface", session->interface->name,
"outer-vlan", session->outer_vlan_id,
"inner-vlan", session->inner_vlan_id,
"outer-vlan", session->vlan_key.outer_vlan_id,
"inner-vlan", session->vlan_key.inner_vlan_id,
"mac", format_mac_address(session->client_mac),
"username", username,
"agent-circuit-id", session->agent_circuit_id,
+16 -16
View File
@@ -37,8 +37,8 @@ bbl_add_session_packets_ipv4 (bbl_ctx_s *ctx, bbl_session_s *session)
bbl.sub_type = BBL_SUB_TYPE_IPV4;
bbl.session_id = session->session_id;
bbl.ifindex = session->interface->ifindex;
bbl.outer_vlan_id = session->outer_vlan_id;
bbl.inner_vlan_id = session->inner_vlan_id;
bbl.outer_vlan_id = session->vlan_key.outer_vlan_id;
bbl.inner_vlan_id = session->vlan_key.inner_vlan_id;
/* Prepare Access (Session) to Network Packet */
if(!session->access_ipv4_tx_packet_template) {
@@ -48,8 +48,8 @@ bbl_add_session_packets_ipv4 (bbl_ctx_s *ctx, bbl_session_s *session)
eth.dst = session->server_mac;
eth.src = session->client_mac;
eth.vlan_outer = session->outer_vlan_id;
eth.vlan_inner = session->inner_vlan_id;
eth.vlan_outer = session->vlan_key.outer_vlan_id;
eth.vlan_inner = session->vlan_key.inner_vlan_id;
eth.vlan_three = session->access_third_vlan;
if(session->access_type == ACCESS_TYPE_PPPOE) {
eth.type = ETH_TYPE_PPPOE_SESSION;
@@ -134,8 +134,8 @@ bbl_add_session_packets_ipv6 (bbl_ctx_s *ctx, bbl_session_s *session, bool ipv6_
bbl.type = BBL_TYPE_UNICAST_SESSION;
bbl.session_id = session->session_id;
bbl.ifindex = session->interface->ifindex;
bbl.outer_vlan_id = session->outer_vlan_id;
bbl.inner_vlan_id = session->inner_vlan_id;
bbl.outer_vlan_id = session->vlan_key.outer_vlan_id;
bbl.inner_vlan_id = session->vlan_key.inner_vlan_id;
/* Prepare Access (Session) to Network Packet */
if(ipv6_pd) {
@@ -168,8 +168,8 @@ bbl_add_session_packets_ipv6 (bbl_ctx_s *ctx, bbl_session_s *session, bool ipv6_
eth.dst = session->server_mac;
eth.src = session->client_mac;
eth.vlan_outer = session->outer_vlan_id;
eth.vlan_inner = session->inner_vlan_id;
eth.vlan_outer = session->vlan_key.outer_vlan_id;
eth.vlan_inner = session->vlan_key.inner_vlan_id;
eth.vlan_three = session->access_third_vlan;
if(session->access_type == ACCESS_TYPE_PPPOE) {
eth.type = ETH_TYPE_PPPOE_SESSION;
@@ -658,8 +658,8 @@ bbl_rx_udp(bbl_ipv6_t *ipv6, bbl_interface_s *interface, bbl_session_s *session)
if(bbl && bbl->type == BBL_TYPE_UNICAST_SESSION) {
switch (bbl->sub_type) {
case BBL_SUB_TYPE_IPV4:
if(bbl->outer_vlan_id != session->outer_vlan_id ||
bbl->inner_vlan_id != session->inner_vlan_id) {
if(bbl->outer_vlan_id != session->vlan_key.outer_vlan_id ||
bbl->inner_vlan_id != session->vlan_key.inner_vlan_id) {
interface->stats.session_ipv4_wrong_session++;
return;
}
@@ -679,8 +679,8 @@ bbl_rx_udp(bbl_ipv6_t *ipv6, bbl_interface_s *interface, bbl_session_s *session)
session->access_ipv4_rx_last_seq = bbl->flow_seq;
break;
case BBL_SUB_TYPE_IPV6:
if(bbl->outer_vlan_id != session->outer_vlan_id ||
bbl->inner_vlan_id != session->inner_vlan_id) {
if(bbl->outer_vlan_id != session->vlan_key.outer_vlan_id ||
bbl->inner_vlan_id != session->vlan_key.inner_vlan_id) {
interface->stats.session_ipv6_wrong_session++;
return;
}
@@ -700,8 +700,8 @@ bbl_rx_udp(bbl_ipv6_t *ipv6, bbl_interface_s *interface, bbl_session_s *session)
session->access_ipv6_rx_last_seq = bbl->flow_seq;
break;
case BBL_SUB_TYPE_IPV6PD:
if(bbl->outer_vlan_id != session->outer_vlan_id ||
bbl->inner_vlan_id != session->inner_vlan_id) {
if(bbl->outer_vlan_id != session->vlan_key.outer_vlan_id ||
bbl->inner_vlan_id != session->vlan_key.inner_vlan_id) {
interface->stats.session_ipv6pd_wrong_session++;
return;
}
@@ -887,8 +887,8 @@ bbl_rx_ipv4(bbl_ethernet_header_t *eth, bbl_ipv4_t *ipv4, bbl_interface_s *inter
/* BBL receive handler */
if(bbl) {
if(bbl->type == BBL_TYPE_UNICAST_SESSION) {
if(bbl->outer_vlan_id != session->outer_vlan_id ||
bbl->inner_vlan_id != session->inner_vlan_id) {
if(bbl->outer_vlan_id != session->vlan_key.outer_vlan_id ||
bbl->inner_vlan_id != session->vlan_key.inner_vlan_id) {
interface->stats.session_ipv4_wrong_session++;
return;
}
+34 -34
View File
@@ -241,8 +241,8 @@ bbl_encode_packet_igmp (bbl_session_s *session)
eth.dst = session->server_mac;
eth.src = session->client_mac;
eth.vlan_outer = session->outer_vlan_id;
eth.vlan_inner = session->inner_vlan_id;
eth.vlan_outer = session->vlan_key.outer_vlan_id;
eth.vlan_inner = session->vlan_key.inner_vlan_id;
eth.vlan_three = session->access_third_vlan;
if(session->access_type == ACCESS_TYPE_PPPOE) {
@@ -399,8 +399,8 @@ bbl_encode_packet_icmp_reply (bbl_session_s *session)
session->interface->stats.icmp_tx++;
eth.dst = session->server_mac;
eth.src = session->client_mac;
eth.vlan_outer = session->outer_vlan_id;
eth.vlan_inner = session->inner_vlan_id;
eth.vlan_outer = session->vlan_key.outer_vlan_id;
eth.vlan_inner = session->vlan_key.inner_vlan_id;
eth.vlan_three = session->access_third_vlan;
if(session->access_type == ACCESS_TYPE_PPPOE) {
eth.type = ETH_TYPE_PPPOE_SESSION;
@@ -459,8 +459,8 @@ bbl_encode_packet_pap_request (bbl_session_s *session) {
eth.dst = session->server_mac;
eth.src = session->client_mac;
eth.vlan_outer = session->outer_vlan_id;
eth.vlan_inner = session->inner_vlan_id;
eth.vlan_outer = session->vlan_key.outer_vlan_id;
eth.vlan_inner = session->vlan_key.inner_vlan_id;
eth.vlan_three = session->access_third_vlan;
eth.type = ETH_TYPE_PPPOE_SESSION;
eth.next = &pppoe;
@@ -507,8 +507,8 @@ bbl_encode_packet_chap_response (bbl_session_s *session) {
eth.dst = session->server_mac;
eth.src = session->client_mac;
eth.vlan_outer = session->outer_vlan_id;
eth.vlan_inner = session->inner_vlan_id;
eth.vlan_outer = session->vlan_key.outer_vlan_id;
eth.vlan_inner = session->vlan_key.inner_vlan_id;
eth.vlan_three = session->access_third_vlan;
eth.type = ETH_TYPE_PPPOE_SESSION;
eth.next = &pppoe;
@@ -555,8 +555,8 @@ bbl_encode_packet_icmpv6_rs (bbl_session_s *session) {
eth.dst = session->server_mac;
eth.src = session->client_mac;
eth.vlan_outer = session->outer_vlan_id;
eth.vlan_inner = session->inner_vlan_id;
eth.vlan_outer = session->vlan_key.outer_vlan_id;
eth.vlan_inner = session->vlan_key.inner_vlan_id;
eth.vlan_three = session->access_third_vlan;
if(session->access_type == ACCESS_TYPE_PPPOE) {
if(session->ip6cp_state != BBL_PPP_OPENED) {
@@ -613,8 +613,8 @@ bbl_encode_packet_dhcpv6_request (bbl_session_s *session) {
eth.dst = session->server_mac;
eth.src = session->client_mac;
eth.vlan_outer = session->outer_vlan_id;
eth.vlan_inner = session->inner_vlan_id;
eth.vlan_outer = session->vlan_key.outer_vlan_id;
eth.vlan_inner = session->vlan_key.inner_vlan_id;
eth.vlan_three = session->access_third_vlan;
if(session->access_type == ACCESS_TYPE_PPPOE) {
if(session->ip6cp_state != BBL_PPP_OPENED) {
@@ -708,8 +708,8 @@ bbl_encode_packet_ip6cp_request (bbl_session_s *session) {
eth.dst = session->server_mac;
eth.src = session->client_mac;
eth.vlan_outer = session->outer_vlan_id;
eth.vlan_inner = session->inner_vlan_id;
eth.vlan_outer = session->vlan_key.outer_vlan_id;
eth.vlan_inner = session->vlan_key.inner_vlan_id;
eth.vlan_three = session->access_third_vlan;
eth.type = ETH_TYPE_PPPOE_SESSION;
eth.next = &pppoe;
@@ -736,8 +736,8 @@ bbl_encode_packet_ip6cp_response (bbl_session_s *session) {
eth.dst = session->server_mac;
eth.src = session->client_mac;
eth.vlan_outer = session->outer_vlan_id;
eth.vlan_inner = session->inner_vlan_id;
eth.vlan_outer = session->vlan_key.outer_vlan_id;
eth.vlan_inner = session->vlan_key.inner_vlan_id;
eth.vlan_three = session->access_third_vlan;
eth.type = ETH_TYPE_PPPOE_SESSION;
eth.next = &pppoe;
@@ -802,8 +802,8 @@ bbl_encode_packet_ipcp_request (bbl_session_s *session) {
eth.dst = session->server_mac;
eth.src = session->client_mac;
eth.vlan_outer = session->outer_vlan_id;
eth.vlan_inner = session->inner_vlan_id;
eth.vlan_outer = session->vlan_key.outer_vlan_id;
eth.vlan_inner = session->vlan_key.inner_vlan_id;
eth.vlan_three = session->access_third_vlan;
eth.type = ETH_TYPE_PPPOE_SESSION;
eth.next = &pppoe;
@@ -841,8 +841,8 @@ bbl_encode_packet_ipcp_response (bbl_session_s *session) {
eth.dst = session->server_mac;
eth.src = session->client_mac;
eth.vlan_outer = session->outer_vlan_id;
eth.vlan_inner = session->inner_vlan_id;
eth.vlan_outer = session->vlan_key.outer_vlan_id;
eth.vlan_inner = session->vlan_key.inner_vlan_id;
eth.vlan_three = session->access_third_vlan;
eth.type = ETH_TYPE_PPPOE_SESSION;
eth.next = &pppoe;
@@ -908,8 +908,8 @@ bbl_encode_packet_lcp_request (bbl_session_s *session) {
eth.dst = session->server_mac;
eth.src = session->client_mac;
eth.vlan_outer = session->outer_vlan_id;
eth.vlan_inner = session->inner_vlan_id;
eth.vlan_outer = session->vlan_key.outer_vlan_id;
eth.vlan_inner = session->vlan_key.inner_vlan_id;
eth.vlan_three = session->access_third_vlan;
eth.type = ETH_TYPE_PPPOE_SESSION;
eth.next = &pppoe;
@@ -943,8 +943,8 @@ bbl_encode_packet_lcp_response (bbl_session_s *session) {
eth.dst = session->server_mac;
eth.src = session->client_mac;
eth.vlan_outer = session->outer_vlan_id;
eth.vlan_inner = session->inner_vlan_id;
eth.vlan_outer = session->vlan_key.outer_vlan_id;
eth.vlan_inner = session->vlan_key.inner_vlan_id;
eth.vlan_three = session->access_third_vlan;
eth.type = ETH_TYPE_PPPOE_SESSION;
eth.next = &pppoe;
@@ -999,8 +999,8 @@ bbl_encode_padi (bbl_session_s *session)
eth.dst = session->server_mac;
eth.src = session->client_mac;
eth.vlan_outer = session->outer_vlan_id;
eth.vlan_inner = session->inner_vlan_id;
eth.vlan_outer = session->vlan_key.outer_vlan_id;
eth.vlan_inner = session->vlan_key.inner_vlan_id;
eth.vlan_three = session->access_third_vlan;
eth.type = ETH_TYPE_PPPOE_DISCOVERY;
eth.next = &pppoe;
@@ -1032,8 +1032,8 @@ bbl_encode_padr (bbl_session_s *session)
eth.dst = session->server_mac;
eth.src = session->client_mac;
eth.vlan_outer = session->outer_vlan_id;
eth.vlan_inner = session->inner_vlan_id;
eth.vlan_outer = session->vlan_key.outer_vlan_id;
eth.vlan_inner = session->vlan_key.inner_vlan_id;
eth.vlan_three = session->access_third_vlan;
eth.type = ETH_TYPE_PPPOE_DISCOVERY;
eth.next = &pppoe;
@@ -1066,8 +1066,8 @@ bbl_encode_padt (bbl_session_s *session)
eth.dst = session->server_mac;
eth.src = session->client_mac;
eth.vlan_outer = session->outer_vlan_id;
eth.vlan_inner = session->inner_vlan_id;
eth.vlan_outer = session->vlan_key.outer_vlan_id;
eth.vlan_inner = session->vlan_key.inner_vlan_id;
eth.vlan_three = session->access_third_vlan;
eth.type = ETH_TYPE_PPPOE_DISCOVERY;
eth.next = &pppoe;
@@ -1132,8 +1132,8 @@ bbl_encode_packet_arp_request (bbl_session_s *session)
ctx = interface->ctx;
eth.src = session->client_mac;
eth.vlan_outer = session->outer_vlan_id;
eth.vlan_inner = session->inner_vlan_id;
eth.vlan_outer = session->vlan_key.outer_vlan_id;
eth.vlan_inner = session->vlan_key.inner_vlan_id;
eth.vlan_three = session->access_third_vlan;
eth.type = ETH_TYPE_ARP;
eth.next = &arp;
@@ -1162,8 +1162,8 @@ bbl_encode_packet_arp_reply (bbl_session_s *session)
bbl_arp_t arp = {0};
eth.dst = session->server_mac;
eth.src = session->client_mac;
eth.vlan_outer = session->outer_vlan_id;
eth.vlan_inner = session->inner_vlan_id;
eth.vlan_outer = session->vlan_key.outer_vlan_id;
eth.vlan_inner = session->vlan_key.inner_vlan_id;
eth.vlan_three = session->access_third_vlan;
eth.type = ETH_TYPE_ARP;
eth.next = &arp;