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 }