4 #include <netinet/in.h>
5 #include <sys/socket.h>
9 void optimize_socket(int socket);
11 MSDD6000::MSDD6000(char* addr){
12 d_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
14 optimize_socket(d_sock);
17 // set up remote sockaddr
18 // int s = inet_aton(addr, &d_adx);
19 d_sockaddr.sin_family = AF_INET;
20 d_sockaddr.sin_port = htons(10000);
21 int s = inet_aton(addr, &d_sockaddr.sin_addr);
23 // set up local sockaddr
24 short int port = 10010;
25 d_myadx.s_addr = INADDR_ANY;
26 d_mysockaddr.sin_family = AF_INET;
27 d_mysockaddr.sin_port = htons(port);
28 memcpy(&d_mysockaddr.sin_addr.s_addr, &d_myadx.s_addr, sizeof(in_addr));
29 //d_sockaddr.sin_addr = INADDR_ANY;
30 s = bind(d_sock, (const sockaddr*) &d_mysockaddr, sizeof(d_mysockaddr));
36 d_state = STATE_STOPPED;
40 void optimize_socket(int socket){
41 #define BANDWIDTH 1000000000/8
45 int sock_buf_size = 2*BANDWIDTH*DELAY;
47 sprintf(textbuf, "%d", sock_buf_size);
48 printf("sock_buf_size = %d\n", sock_buf_size);
50 ret = setsockopt( socket, SOL_SOCKET, SO_SNDBUF,
51 (char *)&sock_buf_size, sizeof(sock_buf_size) );
53 ret = setsockopt( socket, SOL_SOCKET, SO_RCVBUF,
54 (char *)&sock_buf_size, sizeof(sock_buf_size) );
58 printf(" ****** COULD NOT OPTIMIZE SYSTEM NETWORK PARAMETERS BECAUSE YOU ARE NOT RUNNING AS ROOT *******\n ****** YOUR MSDD6000 RECIEVER PERFORMANCE IS GOING TO BE TERRIBLE *******\n");
63 // SET UP SOME SYSTEM WIDE TCP SOCKET PARAMETERS
64 FILE* fd = fopen("/proc/sys/net/core/netdev_max_backlog", "w");
65 fwrite("10000", 1, strlen("10000"), fd);
68 fd = fopen("/proc/sys/net/core/rmem_max", "w");
69 fwrite(textbuf, 1, strlen(textbuf), fd);
72 fd = fopen("/proc/sys/net/core/wmem_max", "w");
73 fwrite(textbuf, 1, strlen(textbuf), fd);
76 // just incase these were rejected before because of max sizes...
78 ret = setsockopt( socket, SOL_SOCKET, SO_SNDBUF,
79 (char *)&sock_buf_size, sizeof(sock_buf_size) );
81 ret = setsockopt( socket, SOL_SOCKET, SO_RCVBUF,
82 (char *)&sock_buf_size, sizeof(sock_buf_size) );
87 void MSDD6000::set_decim(int decim_pow2){
88 DEBUG("SETTING NEW DECIM");
91 if(d_state==STATE_STARTED)
92 send_request(d_fc_mhz, d_rf_attn, d_ddc_gain, d_decim, d_offset_hz);
95 void MSDD6000::set_rf_attn(int attn){
96 DEBUG("SETTING NEW RF ATTN");
98 if(d_state==STATE_STARTED)
99 send_request(d_fc_mhz, d_rf_attn, d_ddc_gain, d_decim, d_offset_hz);
102 void MSDD6000::set_ddc_gain(int gain){
103 DEBUG("SETTING NEW DDC GAIN");
105 if(d_state==STATE_STARTED)
106 send_request(d_fc_mhz, d_rf_attn, d_ddc_gain, d_decim, d_offset_hz);
109 void MSDD6000::set_fc(int center_mhz, int offset_hz){
110 DEBUG("SETTING NEW FC");
111 d_fc_mhz = center_mhz;
112 d_offset_hz = offset_hz;
114 if(d_state==STATE_STARTED)
115 send_request(d_fc_mhz, d_rf_attn, d_ddc_gain, d_decim, d_offset_hz);
119 void MSDD6000::start(){
120 send_request(d_fc_mhz, d_rf_attn, d_ddc_gain, d_decim, d_offset_hz);
121 d_state = STATE_STARTED;
125 void MSDD6000::stop(){
126 // new request with 0 decim tells it to halt
127 send_request(d_fc_mhz, d_rf_attn, d_ddc_gain, 0, d_offset_hz);
128 d_state = STATE_STOPPED;
132 void MSDD6000::send_request(float freq_mhz, float rf_attn, float ddc_gain, float ddc_dec, float ddc_offset_hz){
133 static char buff[512];
134 sprintf(buff, "%f %f %f %f %f\n",freq_mhz, rf_attn, ddc_gain, ddc_dec, ddc_offset_hz);
135 printf("sending: %s\n", buff);
137 sendto( d_sock, buff, strlen(buff)+1, flags, (const sockaddr*)&d_sockaddr, sizeof(d_sockaddr));
141 int MSDD6000::read(char* buf, int size){
143 return recv(d_sock, buf, size, flags);