mirror of
https://github.com/rtbrick/bngblaster.git
synced 2024-05-06 15:54:57 +00:00
Fix VLAN/session lookup
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user