int csp_init(unsigned char address) { int ret; /* Initialize CSP */ csp_set_address(address); ret = csp_conn_init(); if (ret != CSP_ERR_NONE) return ret; ret = csp_port_init(); if (ret != CSP_ERR_NONE) return ret; ret = csp_qfifo_init(); if (ret != CSP_ERR_NONE) return ret; /* Loopback */ csp_iflist_add(&csp_if_lo); /* Register loopback route */ csp_route_set(csp_get_address(), &csp_if_lo, CSP_NODE_MAC); /* Also register loopback as default, until user redefines default route */ csp_route_set(CSP_DEFAULT_ROUTE, &csp_if_lo, CSP_NODE_MAC); return CSP_ERR_NONE; }
int csp_route_table_init(void) { int prio; /* Clear routing table */ memset(routes, 0, sizeof(csp_route_t) * CSP_ROUTE_COUNT); /* Create router fifos for each priority */ for (prio = 0; prio < CSP_ROUTE_FIFOS; prio++) { if (router_input_fifo[prio] == NULL) { router_input_fifo[prio] = csp_queue_create(CSP_FIFO_INPUT, sizeof(csp_route_queue_t)); if (!router_input_fifo[prio]) return CSP_ERR_NOMEM; } } #ifdef CSP_USE_QOS /* Create QoS fifo notification queue */ router_input_event = csp_queue_create(CSP_FIFO_INPUT, sizeof(int)); if (!router_input_event) return CSP_ERR_NOMEM; #endif /* Register loopback route */ csp_route_set(my_address, &csp_if_lo, CSP_NODE_MAC); /* Also register loopback as default, until user redefines default route */ csp_route_set(CSP_DEFAULT_ROUTE, &csp_if_lo, CSP_NODE_MAC); return CSP_ERR_NONE; }
static int do_cmp_route_set(struct csp_cmp_message *cmp) { csp_iface_t *ifc = csp_route_get_if_by_name(cmp->route_set.interface); if (ifc == NULL) return CSP_ERR_INVAL; if (csp_route_set(cmp->route_set.dest_node, ifc, cmp->route_set.next_hop_mac) != CSP_ERR_NONE) return CSP_ERR_INVAL; return CSP_ERR_NONE; }
int csp_init(unsigned char address) { int ret; /* Initialize CSP */ my_address = address; ret = csp_conn_init(); if (ret != CSP_ERR_NONE) return ret; ret = csp_port_init(); if (ret != CSP_ERR_NONE) return ret; ret = csp_route_table_init(); if (ret != CSP_ERR_NONE) return ret; /* Generate CRC32 table */ #ifdef CSP_USE_CRC32 csp_crc32_gentab(); #endif /* Register loopback route */ ret = csp_route_set(address, &csp_if_lo, CSP_NODE_MAC); if (ret != CSP_ERR_NONE) return ret; /* Also register loopback as default, until user redefines default route */ ret = csp_route_set(CSP_DEFAULT_ROUTE, &csp_if_lo, CSP_NODE_MAC); if (ret != CSP_ERR_NONE) return ret; return CSP_ERR_NONE; }
/** csp_init * Start up the can-space protocol * @param address The CSP node address */ void csp_init(unsigned char address) { /* Initialize CSP */ my_address = address; csp_conn_init(); csp_port_init(); csp_route_table_init(); /* Initialize random number generator */ srand(csp_get_ms()); /* Register loopback route */ csp_route_set("LOOP", address, csp_lo_tx, CSP_NODE_MAC); }
int main(int argc, char *argv[]) { int me, other, type; char *message = "Testing CSP"; csp_socket_t *sock = NULL; csp_conn_t *conn = NULL; csp_packet_t *packet = NULL; /* Run as either server or client */ if (argc != 2) { printf("usage: server <server/client>\r\n"); return -1; } /* Set type */ if (strcmp(argv[1], "server") == 0) { me = 1; other = 2; type = TYPE_SERVER; } else if (strcmp(argv[1], "client") == 0) { me = 2; other = 1; type = TYPE_CLIENT; } else { printf("Invalid type. Must be either 'server' or 'client'\r\n"); return -1; } /* Init CSP and CSP buffer system */ if (csp_init(me) != CSP_ERR_NONE || csp_buffer_init(10, 300) != CSP_ERR_NONE) { printf("Failed to init CSP\r\n"); return -1; } if( type == TYPE_SERVER ) { _beginthreadex(NULL, 0, pipe_listener, NULL, 0, 0); } else { pipe = CreateFile( pipeName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if( pipe == INVALID_HANDLE_VALUE ) { printError(); return -1; } } /* Set default route and start router */ csp_route_set(CSP_DEFAULT_ROUTE, &csp_if_fifo, CSP_NODE_MAC); csp_route_start_task(0, 0); /* Create socket and listen for incoming connections */ if (type == TYPE_SERVER) { sock = csp_socket(CSP_SO_NONE); csp_bind(sock, PORT); csp_listen(sock, 5); } /* Super loop */ while (1) { if (type == TYPE_SERVER) { /* Process incoming packet */ conn = csp_accept(sock, 1000); if (conn) { packet = csp_read(conn, 0); if (packet) printf("Received: %s\r\n", packet->data); csp_buffer_free(packet); csp_close(conn); } } else { /* Send a new packet */ packet = csp_buffer_get(strlen(message)); if (packet) { strcpy((char *) packet->data, message); packet->length = strlen(message); conn = csp_connect(CSP_PRIO_NORM, other, PORT, 1000, CSP_O_NONE); printf("Sending: %s\r\n", message); if (!conn || !csp_send(conn, packet, 1000)) return -1; csp_close(conn); Sleep(1000); } } } return 0; }
int main(int argc, char **argv) { int me, other, type; char *message = "Testing CSP", *rx_channel_name, *tx_channel_name; csp_socket_t *sock; csp_conn_t *conn; csp_packet_t *packet; /* Run as either server or client */ if (argc != 2) { printf("usage: %s <server/client>\r\n", argv[0]); return -1; } /* Set type */ if (strcmp(argv[1], "server") == 0) { me = 1; other = 2; tx_channel_name = "server_to_client"; rx_channel_name = "client_to_server"; type = TYPE_SERVER; } else if (strcmp(argv[1], "client") == 0) { me = 2; other = 1; tx_channel_name = "client_to_server"; rx_channel_name = "server_to_client"; type = TYPE_CLIENT; } else { printf("Invalid type. Must be either 'server' or 'client'\r\n"); return -1; } /* Init CSP and CSP buffer system */ if (csp_init(me) != CSP_ERR_NONE || csp_buffer_init(10, 300) != CSP_ERR_NONE) { printf("Failed to init CSP\r\n"); return -1; } tx_channel = open(tx_channel_name, O_RDWR); if (tx_channel < 0) { printf("Failed to open TX channel\r\n"); return -1; } rx_channel = open(rx_channel_name, O_RDWR); if (rx_channel < 0) { printf("Failed to open RX channel\r\n"); return -1; } /* Start fifo RX task */ pthread_create(&rx_thread, NULL, fifo_rx, NULL); /* Set default route and start router */ csp_route_set(CSP_DEFAULT_ROUTE, &csp_if_fifo, CSP_NODE_MAC); csp_route_start_task(0, 0); /* Create socket and listen for incoming connections */ if (type == TYPE_SERVER) { sock = csp_socket(CSP_SO_NONE); csp_bind(sock, PORT); csp_listen(sock, 5); } /* Super loop */ while (1) { if (type == TYPE_SERVER) { /* Process incoming packet */ conn = csp_accept(sock, 1000); if (conn) { packet = csp_read(conn, 0); if (packet) printf("Received: %s\r\n", packet->data); csp_buffer_free(packet); csp_close(conn); } } else { /* Send a new packet */ packet = csp_buffer_get(strlen(message)); if (packet) { strcpy((char *) packet->data, message); packet->length = strlen(message); conn = csp_connect(CSP_PRIO_NORM, other, PORT, 1000, CSP_O_NONE); printf("Sending: %s\r\n", message); if (!conn || !csp_send(conn, packet, 1000)) return -1; csp_close(conn); } sleep(1); } } close(rx_channel); close(tx_channel); return 0; }