FreeCalypso > hg > fc-rfcal-tools
comparison autocal/rvinterf.c @ 15:724e16223187
autocal/rvinterf.c now has all essential code for talking to rvinterf
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 21 May 2017 23:04:42 +0000 |
parents | d7e436bf4876 |
children | e86779d5445c |
comparison
equal
deleted
inserted
replaced
14:93e5194e5511 | 15:724e16223187 |
---|---|
10 #include <strings.h> | 10 #include <strings.h> |
11 #include <stdlib.h> | 11 #include <stdlib.h> |
12 #include <unistd.h> | 12 #include <unistd.h> |
13 #include <rvinterf/pktmux.h> | 13 #include <rvinterf/pktmux.h> |
14 #include <rvinterf/localsock.h> | 14 #include <rvinterf/localsock.h> |
15 #include <rvinterf/limits.h> | |
15 #include <rvinterf/exitcodes.h> | 16 #include <rvinterf/exitcodes.h> |
16 | 17 |
17 char *rvif_socket_pathname = "/tmp/rvinterf_socket"; | 18 char *rvif_socket_pathname = "/tmp/rvinterf_socket"; |
18 int rvif_socket; | 19 int rvif_socket; |
20 | |
21 int rx_enable_state; | |
22 u_char rvi_msg[LOCALSOCK_MAX_MSG]; | |
23 int rvi_msg_len; | |
19 | 24 |
20 connect_rvinterf_socket() | 25 connect_rvinterf_socket() |
21 { | 26 { |
22 /* local socket binding voodoo copied from osmocon */ | 27 /* local socket binding voodoo copied from osmocon */ |
23 struct sockaddr_un local; | 28 struct sockaddr_un local; |
52 exit(ERROR_RVINTERF); | 57 exit(ERROR_RVINTERF); |
53 } | 58 } |
54 | 59 |
55 return(0); | 60 return(0); |
56 } | 61 } |
62 | |
63 static void | |
64 collect_bytes_from_rvi(buf, nbytes) | |
65 u_char *buf; | |
66 { | |
67 int cc; | |
68 | |
69 while (nbytes) { | |
70 cc = read(rvif_socket, buf, nbytes); | |
71 if (cc <= 0) { | |
72 perror("read from rvinterf socket"); | |
73 exit(ERROR_RVINTERF); | |
74 } | |
75 buf += cc; | |
76 nbytes -= cc; | |
77 } | |
78 } | |
79 | |
80 collect_rvi_msg() | |
81 { | |
82 u_char lenbuf[2]; | |
83 | |
84 collect_bytes_from_rvi(lenbuf, 2); | |
85 rvi_msg_len = lenbuf[0] << 8 | lenbuf[1]; | |
86 if (rvi_msg_len < 1 || rvi_msg_len > LOCALSOCK_MAX_MSG) { | |
87 fprintf(stderr, "Invalid length from rvinterf: %02X%02X\n", | |
88 lenbuf[0], lenbuf[1]); | |
89 exit(ERROR_RVINTERF); | |
90 } | |
91 collect_bytes_from_rvi(rvi_msg, rvi_msg_len); | |
92 return(0); | |
93 } | |
94 | |
95 send_rvimisc_command(cmdpkt, cmdlen) | |
96 u_char *cmdpkt; | |
97 { | |
98 u_char lenbuf[2]; | |
99 | |
100 lenbuf[0] = 0; | |
101 lenbuf[1] = cmdlen; | |
102 write(rvif_socket, lenbuf, 2); | |
103 write(rvif_socket, cmdpkt, cmdlen); | |
104 } | |
105 | |
106 rx_control(enable) | |
107 { | |
108 u_char cmdpkt[2]; | |
109 int cmdlen; | |
110 | |
111 /* are we already in the desired state? */ | |
112 if (rx_enable_state == enable) | |
113 return(0); | |
114 /* no, do the work */ | |
115 if (enable) { | |
116 cmdpkt[0] = CLI2RVI_WANT_MUXPROTO; | |
117 cmdpkt[1] = RVT_TM_HEADER; | |
118 cmdlen = 2; | |
119 } else { | |
120 cmdpkt[0] = CLI2RVI_RESET_PACKET_RX; | |
121 cmdlen = 1; | |
122 } | |
123 send_rvimisc_command(cmdpkt, cmdlen); | |
124 collect_rvi_msg(); | |
125 if (rvi_msg[0] != RVI2CLI_LOCAL_CMD_RESP || rvi_msg_len < 2) { | |
126 fprintf(stderr, | |
127 "error: unexpected response to rvinterf local command\n"); | |
128 exit(ERROR_RVINTERF); | |
129 } | |
130 if (rvi_msg[1] != '+') { | |
131 fprintf(stderr, "Error from rvinterf: %.*s\n", rvi_msg_len - 1, | |
132 rvi_msg + 1); | |
133 exit(ERROR_RVINTERF); | |
134 } | |
135 rx_enable_state = enable; | |
136 return(0); | |
137 } | |
138 | |
139 send_pkt_to_target(pkt, pktlen) | |
140 u_char *pkt; | |
141 { | |
142 u_char hdrbuf[3]; | |
143 int len1; | |
144 | |
145 len1 = pktlen + 1; | |
146 hdrbuf[0] = len1 >> 8; | |
147 hdrbuf[1] = len1 & 0xFF; | |
148 hdrbuf[2] = CLI2RVI_PKT_TO_TARGET; | |
149 write(rvif_socket, hdrbuf, 3); | |
150 write(rvif_socket, pkt, pktlen); | |
151 } | |
152 | |
153 target_pkt_exch(outpkt, outpktlen) | |
154 u_char *outpkt; | |
155 { | |
156 rx_control(1); | |
157 send_pkt_to_target(outpkt, outpktlen); | |
158 collect_rvi_msg(); | |
159 if (rvi_msg[0] != RVI2CLI_PKT_FROM_TARGET) { | |
160 fprintf(stderr, | |
161 "error: unexpected response type from rvinterf\n"); | |
162 exit(ERROR_RVINTERF); | |
163 } | |
164 return(0); | |
165 } |