@@ -205,7 +205,7 @@ void RawSocketTransmitter::set_mark(uint32_t idx)
205
205
206
206
207
207
RawSocketTransmitter::RawSocketTransmitter (int k, int n, const string &keypair, uint64_t epoch, uint32_t channel_id, uint32_t fec_delay,
208
- vector<tags_item_t > &tags, const vector<string> &wlans, vector< uint8_t > &radiotap_header,
208
+ vector<tags_item_t > &tags, const vector<string> &wlans, radiotap_header_t &radiotap_header,
209
209
uint8_t frame_type, bool use_qdisc, uint32_t fwmark) : \
210
210
Transmitter(k, n, keypair, epoch, channel_id, fec_delay, tags),
211
211
channel_id(channel_id),
@@ -284,8 +284,8 @@ void RawSocketTransmitter::inject_packet(const uint8_t *buf, size_t size)
284
284
struct iovec iov[3 ] = \
285
285
{
286
286
// radiotap header
287
- { .iov_base = (void *)&radiotap_header[0 ],
288
- .iov_len = radiotap_header.size ()
287
+ { .iov_base = (void *)&radiotap_header. header [0 ],
288
+ .iov_len = radiotap_header.header . size ()
289
289
},
290
290
// ieee80211 header
291
291
{ .iov_base = (void *)ieee_hdr,
@@ -580,8 +580,8 @@ void data_source(shared_ptr<Transmitter> &t, vector<int> &rx_fd, int control_fd,
580
580
581
581
for (;;)
582
582
{
583
- cmd_req_t req;
584
- cmd_resp_t resp;
583
+ cmd_req_t req = {} ;
584
+ cmd_resp_t resp = {} ;
585
585
ssize_t rsize;
586
586
struct sockaddr_in from_addr;
587
587
socklen_t addr_size = sizeof (from_addr);
@@ -604,7 +604,7 @@ void data_source(shared_ptr<Transmitter> &t, vector<int> &rx_fd, int control_fd,
604
604
if (rsize != offsetof (cmd_req_t , u) + sizeof (req.u .cmd_set_fec ))
605
605
{
606
606
resp.rc = htonl (EINVAL);
607
- sendto (fd, &resp, sizeof (resp ), MSG_DONTWAIT, (sockaddr*)&from_addr, addr_size);
607
+ sendto (fd, &resp, offsetof ( cmd_resp_t , u ), MSG_DONTWAIT, (sockaddr*)&from_addr, addr_size);
608
608
continue ;
609
609
}
610
610
@@ -614,7 +614,7 @@ void data_source(shared_ptr<Transmitter> &t, vector<int> &rx_fd, int control_fd,
614
614
if (!(fec_k <= fec_n && fec_k >=1 && fec_n >= 1 && fec_n < 256 ))
615
615
{
616
616
resp.rc = htonl (EINVAL);
617
- sendto (fd, &resp, sizeof (resp ), MSG_DONTWAIT, (sockaddr*)&from_addr, addr_size);
617
+ sendto (fd, &resp, offsetof ( cmd_resp_t , u ), MSG_DONTWAIT, (sockaddr*)&from_addr, addr_size);
618
618
fprintf (stderr, " Rejecting new FEC settings" );
619
619
continue ;
620
620
}
@@ -630,7 +630,7 @@ void data_source(shared_ptr<Transmitter> &t, vector<int> &rx_fd, int control_fd,
630
630
t->send_session_key ();
631
631
}
632
632
633
- sendto (fd, &resp, sizeof (resp ), MSG_DONTWAIT, (sockaddr*)&from_addr, addr_size);
633
+ sendto (fd, &resp, offsetof ( cmd_resp_t , u ), MSG_DONTWAIT, (sockaddr*)&from_addr, addr_size);
634
634
fprintf (stderr, " Session restarted with FEC %d/%d\n " , fec_k, fec_n);
635
635
}
636
636
break ;
@@ -640,7 +640,7 @@ void data_source(shared_ptr<Transmitter> &t, vector<int> &rx_fd, int control_fd,
640
640
if (rsize != offsetof (cmd_req_t , u) + sizeof (req.u .cmd_set_radio ))
641
641
{
642
642
resp.rc = htonl (EINVAL);
643
- sendto (fd, &resp, sizeof (resp ), MSG_DONTWAIT, (sockaddr*)&from_addr, addr_size);
643
+ sendto (fd, &resp, offsetof ( cmd_resp_t , u ), MSG_DONTWAIT, (sockaddr*)&from_addr, addr_size);
644
644
continue ;
645
645
}
646
646
@@ -658,12 +658,12 @@ void data_source(shared_ptr<Transmitter> &t, vector<int> &rx_fd, int control_fd,
658
658
catch (runtime_error &e)
659
659
{
660
660
resp.rc = htonl (EINVAL);
661
- sendto (fd, &resp, sizeof (resp ), MSG_DONTWAIT, (sockaddr*)&from_addr, addr_size);
661
+ sendto (fd, &resp, offsetof ( cmd_resp_t , u ), MSG_DONTWAIT, (sockaddr*)&from_addr, addr_size);
662
662
fprintf (stderr, " Rejecting new radiotap header: %s\n " , e.what ());
663
663
continue ;
664
664
}
665
665
666
- sendto (fd, &resp, sizeof (resp ), MSG_DONTWAIT, (sockaddr*)&from_addr, addr_size);
666
+ sendto (fd, &resp, offsetof ( cmd_resp_t , u ), MSG_DONTWAIT, (sockaddr*)&from_addr, addr_size);
667
667
fprintf (stderr,
668
668
" Radiotap updated with stbc=%d, ldpc=%d, short_gi=%d, bandwidth=%d, mcs_index=%d, vht_mode=%d, vht_nss=%d\n " ,
669
669
req.u .cmd_set_radio .stbc ,
@@ -676,10 +676,53 @@ void data_source(shared_ptr<Transmitter> &t, vector<int> &rx_fd, int control_fd,
676
676
}
677
677
break ;
678
678
679
+ case CMD_GET_FEC:
680
+ {
681
+ int fec_k = 0 , fec_n = 0 ;
682
+
683
+ if (rsize != offsetof (cmd_req_t , u))
684
+ {
685
+ resp.rc = htonl (EINVAL);
686
+ sendto (fd, &resp, offsetof (cmd_resp_t , u), MSG_DONTWAIT, (sockaddr*)&from_addr, addr_size);
687
+ continue ;
688
+ }
689
+
690
+ t->get_fec (fec_k, fec_n);
691
+
692
+ resp.u .cmd_get_fec .k = fec_k;
693
+ resp.u .cmd_get_fec .n = fec_n;
694
+
695
+ sendto (fd, &resp, offsetof (cmd_resp_t , u) + sizeof (resp.u .cmd_get_fec ), MSG_DONTWAIT, (sockaddr*)&from_addr, addr_size);
696
+ }
697
+ break ;
698
+
699
+ case CMD_GET_RADIO:
700
+ {
701
+ if (rsize != offsetof (cmd_req_t , u))
702
+ {
703
+ resp.rc = htonl (EINVAL);
704
+ sendto (fd, &resp, offsetof (cmd_resp_t , u), MSG_DONTWAIT, (sockaddr*)&from_addr, addr_size);
705
+ continue ;
706
+ }
707
+
708
+ radiotap_header_t hdr = t->get_radiotap_header ();
709
+
710
+ resp.u .cmd_get_radio .stbc = hdr.stbc ;
711
+ resp.u .cmd_get_radio .ldpc = hdr.ldpc ;
712
+ resp.u .cmd_get_radio .short_gi = hdr.short_gi ;
713
+ resp.u .cmd_get_radio .bandwidth = hdr.bandwidth ;
714
+ resp.u .cmd_get_radio .mcs_index = hdr.mcs_index ;
715
+ resp.u .cmd_get_radio .vht_mode = hdr.vht_mode ;
716
+ resp.u .cmd_get_radio .vht_nss = hdr.vht_nss ;
717
+
718
+ sendto (fd, &resp, offsetof (cmd_resp_t , u) + sizeof (resp.u .cmd_get_radio ), MSG_DONTWAIT, (sockaddr*)&from_addr, addr_size);
719
+ }
720
+ break ;
721
+
679
722
default :
680
723
{
681
724
resp.rc = htonl (ENOTSUP);
682
- sendto (fd, &resp, sizeof (resp ), MSG_DONTWAIT, (sockaddr*)&from_addr, addr_size);
725
+ sendto (fd, &resp, offsetof ( cmd_resp_t , u ), MSG_DONTWAIT, (sockaddr*)&from_addr, addr_size);
683
726
continue ;
684
727
}
685
728
break ;
@@ -790,15 +833,24 @@ void data_source(shared_ptr<Transmitter> &t, vector<int> &rx_fd, int control_fd,
790
833
}
791
834
792
835
793
- vector< uint8_t > init_radiotap_header (uint8_t stbc,
794
- bool ldpc,
795
- bool short_gi,
796
- uint8_t bandwidth,
797
- uint8_t mcs_index,
798
- bool vht_mode,
799
- uint8_t vht_nss)
836
+ radiotap_header_t init_radiotap_header (uint8_t stbc,
837
+ bool ldpc,
838
+ bool short_gi,
839
+ uint8_t bandwidth,
840
+ uint8_t mcs_index,
841
+ bool vht_mode,
842
+ uint8_t vht_nss)
800
843
{
801
- vector<uint8_t > radiotap_header;
844
+ radiotap_header_t res = {
845
+ .header = {},
846
+ .stbc = stbc,
847
+ .ldpc = ldpc,
848
+ .short_gi = short_gi,
849
+ .bandwidth = bandwidth,
850
+ .mcs_index = mcs_index,
851
+ .vht_mode = vht_mode,
852
+ .vht_nss = vht_nss,
853
+ };
802
854
803
855
if (!vht_mode)
804
856
{
@@ -847,17 +899,17 @@ vector<uint8_t> init_radiotap_header(uint8_t stbc,
847
899
flags |= IEEE80211_RADIOTAP_MCS_FEC_LDPC;
848
900
}
849
901
850
- copy (radiotap_header_ht, radiotap_header_ht + sizeof (radiotap_header_ht), back_inserter (radiotap_header ));
902
+ copy (radiotap_header_ht, radiotap_header_ht + sizeof (radiotap_header_ht), back_inserter (res. header ));
851
903
852
- radiotap_header [MCS_FLAGS_OFF] = flags;
853
- radiotap_header [MCS_IDX_OFF] = mcs_index;
904
+ res. header [MCS_FLAGS_OFF] = flags;
905
+ res. header [MCS_IDX_OFF] = mcs_index;
854
906
}
855
907
else
856
908
{
857
909
// Set flags in VHT radiotap header
858
910
uint8_t flags = 0 ;
859
911
860
- copy (radiotap_header_vht, radiotap_header_vht + sizeof (radiotap_header_vht), back_inserter (radiotap_header ));
912
+ copy (radiotap_header_vht, radiotap_header_vht + sizeof (radiotap_header_vht), back_inserter (res. header ));
861
913
862
914
if (short_gi)
863
915
{
@@ -872,35 +924,35 @@ vector<uint8_t> init_radiotap_header(uint8_t stbc,
872
924
switch (bandwidth)
873
925
{
874
926
case 10 :
875
- radiotap_header [VHT_BW_OFF] = IEEE80211_RADIOTAP_VHT_BW_20M;
927
+ res. header [VHT_BW_OFF] = IEEE80211_RADIOTAP_VHT_BW_20M;
876
928
break ;
877
929
case 20 :
878
- radiotap_header [VHT_BW_OFF] = IEEE80211_RADIOTAP_VHT_BW_20M;
930
+ res. header [VHT_BW_OFF] = IEEE80211_RADIOTAP_VHT_BW_20M;
879
931
break ;
880
932
case 40 :
881
- radiotap_header [VHT_BW_OFF] = IEEE80211_RADIOTAP_VHT_BW_40M;
933
+ res. header [VHT_BW_OFF] = IEEE80211_RADIOTAP_VHT_BW_40M;
882
934
break ;
883
935
case 80 :
884
- radiotap_header [VHT_BW_OFF] = IEEE80211_RADIOTAP_VHT_BW_80M;
936
+ res. header [VHT_BW_OFF] = IEEE80211_RADIOTAP_VHT_BW_80M;
885
937
break ;
886
938
case 160 :
887
- radiotap_header [VHT_BW_OFF] = IEEE80211_RADIOTAP_VHT_BW_160M;
939
+ res. header [VHT_BW_OFF] = IEEE80211_RADIOTAP_VHT_BW_160M;
888
940
break ;
889
941
default :
890
942
throw runtime_error (string_format (" Unsupported VHT bandwidth: %d" , bandwidth));
891
943
}
892
944
893
945
if (ldpc)
894
946
{
895
- radiotap_header [VHT_CODING_OFF] = IEEE80211_RADIOTAP_VHT_CODING_LDPC_USER0;
947
+ res. header [VHT_CODING_OFF] = IEEE80211_RADIOTAP_VHT_CODING_LDPC_USER0;
896
948
}
897
949
898
- radiotap_header [VHT_FLAGS_OFF] = flags;
899
- radiotap_header [VHT_MCSNSS0_OFF] |= ((mcs_index << IEEE80211_RADIOTAP_VHT_MCS_SHIFT) & IEEE80211_RADIOTAP_VHT_MCS_MASK);
900
- radiotap_header [VHT_MCSNSS0_OFF] |= ((vht_nss << IEEE80211_RADIOTAP_VHT_NSS_SHIFT) & IEEE80211_RADIOTAP_VHT_NSS_MASK);
950
+ res. header [VHT_FLAGS_OFF] = flags;
951
+ res. header [VHT_MCSNSS0_OFF] |= ((mcs_index << IEEE80211_RADIOTAP_VHT_MCS_SHIFT) & IEEE80211_RADIOTAP_VHT_MCS_MASK);
952
+ res. header [VHT_MCSNSS0_OFF] |= ((vht_nss << IEEE80211_RADIOTAP_VHT_NSS_SHIFT) & IEEE80211_RADIOTAP_VHT_NSS_MASK);
901
953
}
902
954
903
- return radiotap_header ;
955
+ return res ;
904
956
}
905
957
906
958
0 commit comments