diff --git a/src/bbl.c b/src/bbl.c index 499864ad..b26e9080 100644 --- a/src/bbl.c +++ b/src/bbl.c @@ -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); diff --git a/src/bbl.h b/src/bbl.h index 1c02f66a..b919ac89 100644 --- a/src/bbl.h +++ b/src/bbl.h @@ -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. */ diff --git a/src/bbl_ctrl.c b/src/bbl_ctrl.c index 6a1c5015..2c2c9f1e 100644 --- a/src/bbl_ctrl.c +++ b/src/bbl_ctrl.c @@ -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, diff --git a/src/bbl_rx.c b/src/bbl_rx.c index f83a0722..6b46723f 100644 --- a/src/bbl_rx.c +++ b/src/bbl_rx.c @@ -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; } diff --git a/src/bbl_tx.c b/src/bbl_tx.c index 8483a0f7..cf89ff36 100644 --- a/src/bbl_tx.c +++ b/src/bbl_tx.c @@ -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;