uint8_t *tx_buffer;
uint8_t *rx_buffer;
uint16_t n_etype;
- int used;
} MOREP_descriptor_t ;
/**
{
VERBOSE (morep, TRACE, FPRINTF (stdout, "alloc_all_moreps\n"));
- int i;
- for (i = 0; i < MAX_MOREP_NUMBER; i++) {
+ for (int i = 0; i < MAX_MOREP_NUMBER; i++) {
MOREP_list[i] = (MOREP_descriptor_t *) calloc (1, sizeof (MOREP_descriptor_t));
MOREP_list[i]->tx_buffer = (uint8_t *) calloc (ETHER_PREAMBLE + MAX_ETHER_SIZE, 1);
MOREP_list[i]->rx_buffer = (uint8_t *) calloc (ETHER_PREAMBLE + MAX_ETHER_SIZE, 1);
+ MOREP_list[i]->sock = -1;
}
- for (i = 0; i < MAX_FRAGMENTS; i++) {
+ for (int i = 0; i < MAX_FRAGMENTS; i++) {
fragment_list[i] = (MOREP_fragment_t *) calloc (1, sizeof (MOREP_fragment_t));
fragment_list[i]->buffer = (uint8_t *) calloc (ETHER_PREAMBLE + MAX_ETHER_SIZE, 1);
}
{
VERBOSE (morep, TRACE, FPRINTF (stdout, "free_all_moreps\n"));
- int i;
- for (i = 0; i < MAX_MOREP_NUMBER; i++) {
+ for (int i = 0; i < MAX_MOREP_NUMBER; i++) {
if (MOREP_list[i]) {
- if (MOREP_list[i]->used) {
- MOREP_Close (i);
+ if (MOREP_list[i]->sock >= 0) {
+ close (MOREP_list[i]->sock);
}
free (MOREP_list[i]->tx_buffer);
free (MOREP_list[i]->rx_buffer);
}
free (MOREP_list[i]);
}
- for (i = 0; i < MAX_FRAGMENTS; i++) {
+ for (int i = 0; i < MAX_FRAGMENTS; i++) {
if (fragment_list[i]) {
free (fragment_list[i]->buffer);
}
VERBOSE (morep, TRACE, PRINTF ("parse_mac\n"));
/* MAC address format: XX:XX:XX:XX:XX:XX/... */
- int i, j;
- for (i = j = 0; i < 6; i++) {
+ int j = 0;
+ for (int i = 0; i < 6; i++) {
if (url[j] == 0) {
break;
}
}
uint8_t *p = (unsigned char *)ifr.ifr_hwaddr.sa_data;
- int i;
- for (i = 0; i < 6; i++) {
+ for (int i = 0; i < 6; i++) {
mac[i] = *p++;
}
void mactoa (char *str, uint8_t *mac)
{
- int i;
- for (i = 0; i < 6; i++) {
+ for (int i = 0; i < 6; i++) {
int d = mac[i] / 16;
str[3 * i] = d + ((d > 9) ? 'A' - 10 : '0');
d = mac[i] % 16;
str[17] = '\0';
}
-int find_unused_morep ()
+int find_morep_index (int sock)
+{
+ VERBOSE (morep, TRACE, PRINTF ("find_morep_index\n"));
+
+ if (sock < 0) {
+ return -1;
+ }
+ for (int i = 0; i < MAX_MOREP_NUMBER; i++) {
+ if (MOREP_list[i]->sock == sock) {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+int find_unused_morep (int sock)
{
VERBOSE (morep, TRACE, PRINTF ("find_unused_morep\n"));
- int i;
- for (i = 0; i < MAX_MOREP_NUMBER; i++) {
+ for (int i = 0; i < MAX_MOREP_NUMBER; i++) {
// FIXIT: not thread safe
- if (MOREP_list[i]->used == 0) {
- MOREP_list[i]->used = 1;
- break;
+ if (MOREP_list[i]->sock < 0) {
+ MOREP_list[i]->sock = sock;
+ VERBOSE (morep, DEBUG, PRINTF ("find morep: %d\n", i));
+ return i;
}
}
- if (i == MAX_MOREP_NUMBER) {
- VERBOSE (morep, WARNING, PRINTF ("can't find avaliable morep descriptor\n"));
- return -1;
- }
- VERBOSE (morep, DEBUG, PRINTF ("find morep: %d\n", i));
+ VERBOSE (morep, WARNING, PRINTF ("can't find avaliable morep descriptor\n"));
- return i;
+ return -1;
}
int MOREP_Connect (char *url)
/* info message */
char lmac[MAC_ADDR_STRING] = {0};
mactoa (lmac, sock_addr.sll_addr);
- VERBOSE (morep, INFO, PRINTF ("I/O on %s local=[%s] etype=[%04x]\n", addr.ifname, lmac, addr.ether_type));
+ VERBOSE (morep, INFO, PRINTF ("I/O on %s local=[%s] etype=[%04x] sock=%d\n", addr.ifname, lmac, addr.ether_type, sock));
/* store connection */
- int index = find_unused_morep ();
+ int index = find_unused_morep (sock);
if (index >= 0) {
- MOREP_list[index]->sock = sock;
memcpy (MOREP_list[index]->tx_buffer, (void *) addr.mac, 6);
memcpy (MOREP_list[index]->tx_buffer + 6, sock_addr.sll_addr, 6);
MOREP_list[index]->n_etype = htons (addr.ether_type);
memcpy (MOREP_list[index]->tx_buffer + 12, (void *) &(MOREP_list[index]->n_etype), 2);
}
- return index;
+ return sock;
}
-int MOREP_Send (int index, uint8_t msgtype, uint8_t *buffer, int len)
+int MOREP_Send (int sock, uint8_t msgtype, uint8_t *buffer, int len)
{
VERBOSE (morep, TRACE, PRINTF ("MOREP_Send\n"));
VERBOSE (morep, ERROR, PRINTF ("too large buffer to send (%d)\n", len));
return -1;
}
- if ((index < 0) || (index >= MAX_MOREP_NUMBER) ||
- (MOREP_list[index] == NULL) || (!MOREP_list[index]->used)) {
- VERBOSE (morep, ERROR, PRINTF ("incorrect MOREP descriptor (%d)\n", index));
+ int index = find_morep_index (sock);
+ if (index < 0) {
+ VERBOSE (morep, ERROR, PRINTF ("can't find MOREP for socket (%d)\n", sock));
return -1;
}
VERBOSE (morep, DEBUG, PRINTF ("flag/frag/length: %d/%d/%d\n", (pklen != len), nfrag, pklen));
uint16_t msglen = htons (pklen | (nfrag << 11) | ((pklen != len) << 15));
memcpy (morep->tx_buffer + ETHER_PREAMBLE + 2, (void *) &msglen, 2);
- VERBOSE (morep, DEBUG, PRINTF ("sent preamble: "); int i; for (i = 0; i < ETHER_PREAMBLE + MOREP_PREAMBLE; i++) printf ("%02x%c", morep->tx_buffer[i], (i == ETHER_PREAMBLE + MOREP_PREAMBLE - 1) ? '\n' : ':'));
+ VERBOSE (morep, DEBUG, PRINTF ("sent preamble: "); for (int i = 0; i < ETHER_PREAMBLE + MOREP_PREAMBLE; i++) printf ("%02x%c", morep->tx_buffer[i], (i == ETHER_PREAMBLE + MOREP_PREAMBLE - 1) ? '\n' : ':'));
memcpy (morep->tx_buffer + ETHER_PREAMBLE + MOREP_PREAMBLE, buffer, pklen);
int txlen = pklen + ETHER_PREAMBLE + MOREP_PREAMBLE;
memset (morep->tx_buffer + txlen, 0, ETHER_PREAMBLE + MIN_ETHER_SIZE - txlen);
txlen = ETHER_PREAMBLE + MIN_ETHER_SIZE;
}
- rc = sendto (morep->sock, morep->tx_buffer, txlen, 0, NULL, 0);
+ rc = sendto (sock, morep->tx_buffer, txlen, 0, NULL, 0);
len -= pklen;
buffer += pklen;
return (rc > 0) ? seqnum : -1;
}
-int MOREP_Receive (int index, uint8_t *msgtype, uint8_t *buffer, int *len)
+int MOREP_Receive (int sock, uint8_t *msgtype, uint8_t *buffer, int *len)
{
VERBOSE (morep, TRACE, PRINTF ("MOREP_Receive\n"));
- int i;
*msgtype = 0;
- if (((index < 0) || (index >= MAX_MOREP_NUMBER)) ||
- (MOREP_list[index] == NULL) || (!MOREP_list[index]->used)) {
- VERBOSE (morep, ERROR, PRINTF ("incorrect MOREP descriptor (%d)\n", index));
+ int index = find_morep_index (sock);
+ if (index < 0) {
+ VERBOSE (morep, ERROR, PRINTF ("can't find MOREP for socket (%d)\n", sock));
return -1;
}
MOREP_descriptor_t *morep = MOREP_list[index];
- for (i = 0; i < MAX_FRAGMENTS; i++) {
+ for (int i = 0; i < MAX_FRAGMENTS; i++) {
fragment_list[i]->len = 0;
//fragment_list[i]->status = 0;
}
int flag = 0;
do {
do {
- rxlen = recvfrom (morep->sock, morep->rx_buffer, ETHER_PREAMBLE + MAX_ETHER_SIZE, 0, NULL, 0);
- VERBOSE (morep, DEBUG, PRINTF ("rec. preamble: "); int i; for (i = 0; i < ETHER_PREAMBLE + MOREP_PREAMBLE; i++) printf ("%02x%c", morep->rx_buffer[i], (i == ETHER_PREAMBLE + MOREP_PREAMBLE - 1) ? '\n' : ':'));
+ rxlen = recvfrom (sock, morep->rx_buffer, ETHER_PREAMBLE + MAX_ETHER_SIZE, 0, NULL, 0);
+ VERBOSE (morep, DEBUG, PRINTF ("rec. preamble: "); for (int i = 0; i < ETHER_PREAMBLE + MOREP_PREAMBLE; i++) printf ("%02x%c", morep->rx_buffer[i], (i == ETHER_PREAMBLE + MOREP_PREAMBLE - 1) ? '\n' : ':'));
/* avoid alien packets */
uint16_t rx_n_etype;
/* check padding */
if (pkglen < MIN_ETHER_SIZE - MOREP_PREAMBLE) {
VERBOSE (morep, DEBUG, PRINTF ("padding of %d bytes\n", MIN_ETHER_SIZE - MOREP_PREAMBLE - pkglen));
- VERBOSE (morep, DEBUG, int _i; for (_i = pkglen + ETHER_PREAMBLE + MOREP_PREAMBLE; _i < ETHER_PREAMBLE + MIN_ETHER_SIZE; _i++) if (morep->rx_buffer[_i] != 0) { VERBOSE (morep, WARNING, PRINTF ("incorrect padding (%d)\n", _i)); break; });
+ VERBOSE (morep, DEBUG, for (int _i = pkglen + ETHER_PREAMBLE + MOREP_PREAMBLE; _i < ETHER_PREAMBLE + MIN_ETHER_SIZE; _i++) if (morep->rx_buffer[_i] != 0) { VERBOSE (morep, WARNING, PRINTF ("incorrect padding (%d)\n", _i)); break; });
}
if (((rxlen == ETHER_PREAMBLE + MIN_ETHER_SIZE) && (pkglen > MIN_ETHER_SIZE - MOREP_PREAMBLE)) || ((rxlen > ETHER_PREAMBLE + MIN_ETHER_SIZE) && (pkglen != rxlen - (ETHER_PREAMBLE + MOREP_PREAMBLE)))) {
VERBOSE (morep, WARNING, PRINTF ("incorrect size (%d/%d)\n", pkglen, rxlen - (ETHER_PREAMBLE + MOREP_PREAMBLE)));
// frag->status = 1;
} else {
rxlen = 0;
- for (i = 0; (i < MAX_FRAGMENTS) && (fragment_list[i]->len != 0); i++) {
+ for (int i = 0; (i < MAX_FRAGMENTS) && (fragment_list[i]->len != 0); i++) {
MOREP_fragment_t *frag = fragment_list[i];
memcpy (buffer + rxlen, frag->buffer + ETHER_PREAMBLE + MOREP_PREAMBLE, frag->len);
rxlen += frag->len;
return rxseqnum;
}
-int MOREP_Close (int index)
+int MOREP_Close (int sock)
{
VERBOSE (morep, TRACE, PRINTF ("MOREP_Close\n"));
- if ((index < 0) || (index >= MAX_MOREP_NUMBER) ||
- (MOREP_list[index] == NULL)) {
- VERBOSE (morep, ERROR, PRINTF ("incorrect MOREP descriptor (%d)\n", index));
+ int index = find_morep_index (sock);
+ if (index < 0) {
+ VERBOSE (morep, ERROR, PRINTF ("can't find MOREP for socket (%d)\n", sock));
return -1;
}
- if (MOREP_list[index]->used) {
- close (MOREP_list[index]->sock);
- MOREP_list[index]->used = 0;
- }
+ close (sock);
+ MOREP_list[index]->sock = -1;
return 0;
}
-int MOREP_Receive_timeout (int index, uint8_t *msgtype, uint8_t *buffer, int *len, int ms)
+int MOREP_Receive_timeout (int sock, uint8_t *msgtype, uint8_t *buffer, int *len, int ms)
{
VERBOSE (morep, TRACE, PRINTF ("MOREP_Receive_timeout\n"));
- if ((index < 0) || (index >= MAX_MOREP_NUMBER) ||
- (MOREP_list[index] == NULL) || (!MOREP_list[index]->used)) {
- VERBOSE (morep, ERROR, PRINTF ("incorrect MOREP descriptor (%d)\n", index));
+ int index = find_morep_index (sock);
+ if (index < 0) {
+ VERBOSE (morep, ERROR, PRINTF ("can't find MOREP for socket (%d)\n", sock));
return -1;
}
- VERBOSE (morep, DEBUG, PRINTF ("working with MOREP descriptor %d (%d)\n", index, MOREP_list[index]->sock));
- int fid = MOREP_list[index]->sock;
+ VERBOSE (morep, DEBUG, PRINTF ("working with MOREP %d (%d)\n", index, sock));
fd_set rfds;
struct timeval tv = { 0, ms * 1000};
FD_ZERO (&rfds);
- FD_SET (fid, &rfds);
+ FD_SET (sock, &rfds);
- int retval = select (fid + 1, &rfds, NULL, NULL, &tv);
+ int retval = select (sock + 1, &rfds, NULL, NULL, &tv);
VERBOSE (morep, TRACE, PRINTF ("select: %d (%ld, %ld)\n", retval, tv.tv_sec, tv.tv_usec));
if (retval != 1) {
return retval;
}
- return MOREP_Receive (index, msgtype, buffer, len);
+ return MOREP_Receive (sock, msgtype, buffer, len);
}
/* vim: set ts=4 sw=4 si et: */
The common message passing library offers unreliable connection oriented
data blocks exchange messaging between software modules over raw Ethernet
packets.
+
+ morep values returned by MOREP_Connect are standard Linux file descriptors
+ that can be used in select()/poll() system calls
*/
/**
- macaddress format is xx:xx:xx:xx:xx:xx
- ethertype is a number from 1536 to 65355
- @return a new MOREP descriptor associated with this connection
+ @return a new file descriptor associated with this connection
@see MOREP_Close()
@see MOREP_Send()
Close a connection and relase its descriptor.
- @param index descriptor retuned by MOREP_Connect()
+ @param sock file descriptor retuned by MOREP_Connect()
@see MOREP_Connect()
*/
-int MOREP_Close (int index);
+int MOREP_Close (int sock);
/**
@ingroup MOREP
Send a message over an existing MOREP connection. Will block until
resolution in case of congestion.
- @param index MOREP descriptor retuned by MOREP_Connect()
+ @param sock file descriptor retuned by MOREP_Connect()
@param msgtype a user defined message type identifier, transported
transparently
@param buffer a pointer to the message to be transmitted
@see MOREP_Connect()
*/
-int MOREP_Send (int index, uint8_t msgtype, uint8_t *buffer, int len);
+int MOREP_Send (int sock, uint8_t msgtype, uint8_t *buffer, int len);
/**
@ingroup MOREP
Received a message over an existing MOREP connection.
- @param index MOREP descriptor retuned by MOREP_Connect()
+ @param sock file descriptor retuned by MOREP_Connect()
@param msgtype a pointer to retrieve the user defined message type
identifier, transported transparently
@param buffer a pointer to the reception buffer (pre-allocated)
@see MOREP_Connect()
*/
-int MOREP_Receive (int index, uint8_t *msgtype, uint8_t *buffer, int *len);
+int MOREP_Receive (int sock, uint8_t *msgtype, uint8_t *buffer, int *len);
/**
@ingroup MOREP
Received a message over an existing MOREP connection with a timeout.
- @param index MOREP descriptor retuned by MOREP_Connect()
+ @param sock file descriptor retuned by MOREP_Connect()
@param msgtype a pointer to retrieve the user defined message type
identifier, transported transparently
@param buffer a pointer to the reception buffer (pre-allocated)
@return sequence number of the received message
- @see MOREP_Connect()
+ @see MOREP_Connect(), MOREP_Receive()
*/
-int MOREP_Receive_timeout (int index, uint8_t *msgtype, uint8_t *buffer, int *len, int ms);
+int MOREP_Receive_timeout (int sock, uint8_t *msgtype, uint8_t *buffer, int *len, int ms);
__END_DECLS