Skip to content

Commit 930c8bd

Browse files
committed
add network-interface inner-vlan and qinq
1 parent f751769 commit 930c8bd

15 files changed

Lines changed: 95 additions & 23 deletions

File tree

code/bngblaster/src/bbl_config.c

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -840,8 +840,9 @@ json_parse_network_interface(json_t *network_interface, bbl_network_config_s *ne
840840
const char *schema[] = {
841841
"interface", "address", "gateway",
842842
"address-ipv6", "gateway-ipv6", "ipv6-router-advertisement",
843-
"gateway-mac", "vlan", "mtu", "gateway-resolve-wait",
844-
"isis-instance-id", "isis-level", "isis-p2p",
843+
"gateway-mac", "vlan", "inner-vlan", "qinq", "mtu",
844+
"gateway-resolve-wait",
845+
"isis-instance-id", "isis-level", "isis-p2p",
845846
"isis-l1-metric", "isis-l2-metric",
846847
"isis-l1-priority", "isis-l2-priority",
847848
"ospfv2-instance-id", "ospfv2-metric", "ospfv2-type",
@@ -913,6 +914,23 @@ json_parse_network_interface(json_t *network_interface, bbl_network_config_s *ne
913914
network_config->vlan = json_number_value(value);
914915
network_config->vlan &= 4095;
915916
}
917+
JSON_OBJ_GET_NUMBER(network_interface, value, "access", "inner-vlan", 0, 4095);
918+
if(value) {
919+
network_config->inner_vlan = json_number_value(value);
920+
network_config->inner_vlan &= 4095;
921+
if(network_config->inner_vlan && network_config->vlan == 0) {
922+
fprintf(stderr, "JSON config error: Network interface with inner-vlan but no vlan (outer)\n");
923+
return false;
924+
}
925+
}
926+
JSON_OBJ_GET_BOOL(network_interface, value, "access", "qinq");
927+
if(value) {
928+
network_config->qinq = json_boolean_value(value);
929+
if(network_config->qinq && network_config->inner_vlan == 0) {
930+
fprintf(stderr, "JSON config error: Enabling qinq on network interfaces requires an inner-vlan\n");
931+
return false;
932+
}
933+
}
916934
JSON_OBJ_GET_NUMBER(network_interface, value, "network", "mtu", 64, 9000);
917935
if(value) {
918936
network_config->mtu = json_number_value(value);

code/bngblaster/src/bbl_config.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,9 @@ typedef struct bbl_network_config_
135135
uint8_t mac[ETH_ADDR_LEN];
136136
uint8_t gateway_mac[ETH_ADDR_LEN];
137137
bool gateway_resolve_wait;
138+
bool qinq; /* use ethertype 0x88a8 */
138139
uint16_t vlan;
140+
uint16_t inner_vlan;
139141
uint16_t mtu;
140142

141143
ipv4_prefix ip;

code/bngblaster/src/bbl_icmp_client.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ bbl_icmp_client_tx(bbl_icmp_client_s *client, bbl_icmp_s *icmp)
6565
eth.dst = network_interface->gateway_mac;
6666
eth.src = network_interface->mac;
6767
eth.vlan_outer = network_interface->vlan;
68-
eth.vlan_inner = 0;
68+
eth.vlan_inner = network_interface->inner_vlan;
69+
eth.qinq = network_interface->qinq;
6970
ipv4.src = client->src;
7071
}
7172

code/bngblaster/src/bbl_l2tp.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,8 @@ bbl_l2tp_send(bbl_l2tp_tunnel_s *l2tp_tunnel, bbl_l2tp_session_s *l2tp_session,
454454
eth.dst = interface->gateway_mac;
455455
eth.src = interface->mac;
456456
eth.vlan_outer = interface->vlan;
457+
eth.vlan_inner = interface->inner_vlan;
458+
eth.qinq = interface->qinq;
457459
eth.type = ETH_TYPE_IPV4;
458460
eth.next = &ipv4;
459461
ipv4.dst = l2tp_tunnel->peer_ip;
@@ -540,6 +542,8 @@ bbl_l2tp_send_data(bbl_l2tp_session_s *l2tp_session, uint16_t protocol, void *ne
540542
eth.dst = interface->gateway_mac;
541543
eth.src = interface->mac;
542544
eth.vlan_outer = interface->vlan;
545+
eth.vlan_inner = interface->inner_vlan;
546+
eth.qinq = interface->qinq;
543547
eth.type = ETH_TYPE_IPV4;
544548
eth.next = &ipv4;
545549
ipv4.dst = l2tp_tunnel->peer_ip;

code/bngblaster/src/bbl_network.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ bbl_network_interfaces_add()
7171
LOG(ERROR, "Failed to add network interface %s (untagged not allowed on access interfaces)\n", ifname);
7272
return false;
7373
}
74+
if(interface->network_vlan[network_config->vlan]) {
75+
LOG(ERROR, "Failed to add network interface %s (outer VLAN must be unique)\n", ifname);
76+
return false;
77+
}
7478

7579
network_interface = calloc(1, sizeof(bbl_network_interface_s));
7680
network_interface->next = interface->network;
@@ -93,6 +97,8 @@ bbl_network_interfaces_add()
9397

9498
/* Init ethernet */
9599
network_interface->vlan = network_config->vlan;
100+
network_interface->inner_vlan = network_config->inner_vlan;
101+
network_interface->qinq = network_config->qinq;
96102
network_interface->mtu = network_config->mtu;
97103

98104
if(*(uint32_t*)network_config->mac) {
@@ -306,7 +312,8 @@ bbl_network_update_eth(bbl_network_interface_s *interface,
306312
eth->dst = eth->src;
307313
eth->src = interface->mac;
308314
eth->vlan_outer = interface->vlan;
309-
eth->vlan_inner = 0;
315+
eth->vlan_inner = interface->inner_vlan;
316+
eth->qinq = interface->qinq;
310317
eth->vlan_three = 0;
311318
if(interface->tx_label.label) {
312319
eth->mpls = &interface->tx_label;

code/bngblaster/src/bbl_network.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ typedef struct bbl_network_interface_
2929

3030
uint16_t mtu;
3131
uint16_t vlan;
32+
uint16_t inner_vlan;
33+
3234
bbl_mpls_s tx_label;
3335

3436
uint8_t mac[ETH_ADDR_LEN];
@@ -41,6 +43,7 @@ typedef struct bbl_network_interface_
4143
ipv4addr_t gateway;
4244

4345
bool ipv6_ra;
46+
bool qinq;
4447

4548
ipv6_prefix ip6; /* global IPv6 address */
4649
ipv6addr_t ip6_ll; /* link-local IPv6 address */

code/bngblaster/src/bbl_stream.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -711,7 +711,8 @@ bbl_stream_build_network_packet(bbl_stream_s *stream)
711711
eth.src = network_interface->mac;
712712
eth.vlan_outer = network_interface->vlan;
713713
eth.vlan_outer_priority = config->vlan_priority;
714-
eth.vlan_inner = 0;
714+
eth.vlan_inner = network_interface->inner_vlan;
715+
eth.qinq = network_interface->qinq;
715716

716717
/* Add MPLS labels */
717718
if(config->tx_mpls1 || stream->ldp_entry) {
@@ -880,7 +881,8 @@ bbl_stream_build_l2tp_packet(bbl_stream_s *stream)
880881
eth.dst = network_interface->gateway_mac;
881882
eth.src = network_interface->mac;
882883
eth.vlan_outer = network_interface->vlan;
883-
eth.vlan_inner = 0;
884+
eth.vlan_inner = network_interface->inner_vlan;
885+
eth.qinq = network_interface->qinq;
884886
eth.type = ETH_TYPE_IPV4;
885887
eth.next = &l2tp_ipv4;
886888
l2tp_ipv4.dst = l2tp_tunnel->peer_ip;

code/bngblaster/src/bbl_tcp.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1075,6 +1075,8 @@ bbl_tcp_netif_output_ipv4(struct netif *netif, struct pbuf *p, const ip4_addr_t
10751075
eth.dst = interface->gateway_mac;
10761076
eth.src = interface->mac;
10771077
eth.vlan_outer = interface->vlan;
1078+
eth.vlan_inner = interface->inner_vlan;
1079+
eth.qinq = interface->qinq;
10781080
eth.type = ETH_TYPE_IPV4;
10791081
eth.lwip = true;
10801082
eth.next = p;
@@ -1144,6 +1146,8 @@ bbl_tcp_netif_output_ipv6(struct netif *netif, struct pbuf *p, const ip6_addr_t
11441146
eth.dst = interface->gateway6_mac;
11451147
eth.src = interface->mac;
11461148
eth.vlan_outer = interface->vlan;
1149+
eth.vlan_inner = interface->inner_vlan;
1150+
eth.qinq = interface->qinq;
11471151
eth.type = ETH_TYPE_IPV6;
11481152
eth.lwip = true;
11491153
eth.next = p;

code/bngblaster/src/bbl_tx.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1647,6 +1647,8 @@ bbl_tx_encode_network_packet(bbl_network_interface_s *interface, uint8_t *buf, u
16471647

16481648
eth.src = interface->mac;
16491649
eth.vlan_outer = interface->vlan;
1650+
eth.vlan_inner = interface->inner_vlan;
1651+
eth.qinq = interface->qinq;
16501652
if(interface->send_requests & BBL_IF_SEND_ARP_REQUEST) {
16511653
interface->send_requests &= ~BBL_IF_SEND_ARP_REQUEST;
16521654
eth.type = ETH_TYPE_ARP;

code/bngblaster/src/isis/isis_csnp.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ isis_csnp_job(timer_s *timer)
3636
isis_tlv_s *tlv;
3737
isis_lsp_entry_s *entry;
3838

39+
bbl_network_interface_s *interface = adjacency->interface;
3940
bbl_ethernet_header_s eth = {0};
4041
bbl_isis_s isis = {0};
4142

@@ -156,8 +157,10 @@ isis_csnp_job(timer_s *timer)
156157
/* Send packet ... */
157158
eth.type = ISIS_PROTOCOL_IDENTIFIER;
158159
eth.next = &isis;
159-
eth.src = adjacency->interface->mac;
160-
eth.vlan_outer = adjacency->interface->vlan;
160+
eth.src = interface->mac;
161+
eth.vlan_outer = interface->vlan;
162+
eth.vlan_inner = interface->inner_vlan;
163+
eth.qinq = interface->qinq;
161164
if(adjacency->level == ISIS_LEVEL_1) {
162165
eth.dst = g_isis_mac_all_l1;
163166
isis.type = ISIS_PDU_L1_CSNP;
@@ -167,14 +170,14 @@ isis_csnp_job(timer_s *timer)
167170
}
168171
isis.pdu = pdu.pdu;
169172
isis.pdu_len = pdu.pdu_len;
170-
if(bbl_txq_to_buffer(adjacency->interface->txq, &eth) == BBL_TXQ_OK) {
173+
if(bbl_txq_to_buffer(interface->txq, &eth) == BBL_TXQ_OK) {
171174
LOG(PACKET, "ISIS TX %s on interface %s\n",
172-
isis_pdu_type_string(isis.type), adjacency->interface->name);
175+
isis_pdu_type_string(isis.type), interface->name);
173176
adjacency->stats.csnp_tx++;
174-
adjacency->interface->stats.isis_tx++;
177+
interface->stats.isis_tx++;
175178
} else {
176179
LOG(ERROR, "Failed to send ISIS %s on interface %s\n",
177-
isis_pdu_type_string(isis.type), adjacency->interface->name);
180+
isis_pdu_type_string(isis.type), interface->name);
178181
}
179182
return;
180183
}

0 commit comments

Comments
 (0)