From 15d856a78b124c4b67fdba4878287b2d75326064 Mon Sep 17 00:00:00 2001 From: Sven Robertz <sven@cs.lth.se> Date: Thu, 23 Feb 2012 11:15:28 +0100 Subject: [PATCH] more cleanup --- examples/simple/datagram/thr_example.c | 11 +++---- examples/simple/datagram/thr_example2.c | 32 +++++++++---------- lib/c/experimental/ThrottleDrv/throttle_drv.c | 27 ++++++++-------- lib/c/experimental/ThrottleDrv/throttle_drv.h | 10 ++++-- lib/c/experimental/ethaddr.c | 13 ++++++-- lib/c/experimental/ethaddr.h | 5 ++- 6 files changed, 55 insertions(+), 43 deletions(-) diff --git a/examples/simple/datagram/thr_example.c b/examples/simple/datagram/thr_example.c index 1a8aa75..831de89 100644 --- a/examples/simple/datagram/thr_example.c +++ b/examples/simple/datagram/thr_example.c @@ -10,8 +10,7 @@ static int encode(int argc, char *argv[]) { struct thr_chn_t *p_thr_chn = NULL; struct labcomm_encoder *encoder; int i, j; -// unsigned char dest_mac[ETH_ADR_SIZE] = {0x00, 0x09, 0x6b, 0x10, 0xf3, 0x80}; /* other host MAC address, hardcoded...... :-( */ - unsigned char dest_mac[ETH_ADR_SIZE] = {0x00, 0x09, 0x6b, 0xe3, 0x81, 0xbf}; /* other host MAC address, hardcoded...... :-( */ + struct ether_addr dest_mac; unsigned char chn_id = 0x01; unsigned short frag_size = 60; unsigned short freq = 1000; /* milliseconds */ @@ -19,7 +18,7 @@ static int encode(int argc, char *argv[]) { char *ifname = argv[1]; char *dest_mac_str = argv[2]; - if(parse_MAC_address(dest_mac_str, dest_mac)) { + if(parse_MAC_address(dest_mac_str, &dest_mac)) { printf("failed to parse dest MAC address\n"); return 1; } @@ -30,7 +29,7 @@ static int encode(int argc, char *argv[]) { } else { - p_thr_chn = thr_open_chn(dest_mac, chn_id, frag_size, freq, NULL); + p_thr_chn = thr_open_chn(&dest_mac, chn_id, frag_size, freq, NULL); encoder = labcomm_encoder_new(labcomm_thr_writer, p_thr_chn); labcomm_encoder_register_simple_TwoInts(encoder); labcomm_encoder_register_simple_IntString(encoder); @@ -62,7 +61,7 @@ static int decode(int argc, char *argv[]) { struct thr_chn_t *p_thr_chn = NULL; struct labcomm_decoder *decoder; void *context = NULL; - unsigned char dest_mac[ETH_ADR_SIZE] = {0x00, 0x09, 0x6b, 0x10, 0xf3, 0x80}; /* other host MAC address, hardcoded...... :-( */ + struct ether_addr dest_mac; int ret = 0; unsigned char chn_id = 0x01; unsigned short frag_size = 60; @@ -76,7 +75,7 @@ static int decode(int argc, char *argv[]) { } else { - p_thr_chn = thr_open_chn(dest_mac, chn_id, frag_size, freq, (thr_msg_handler_t)labcomm_decoder_decode_one); + p_thr_chn = thr_open_chn(&dest_mac, chn_id, frag_size, freq, (thr_msg_handler_t)labcomm_decoder_decode_one); decoder = labcomm_decoder_new(labcomm_thr_reader, p_thr_chn); if (!decoder) { diff --git a/examples/simple/datagram/thr_example2.c b/examples/simple/datagram/thr_example2.c index ab61c66..f6bb583 100644 --- a/examples/simple/datagram/thr_example2.c +++ b/examples/simple/datagram/thr_example2.c @@ -8,18 +8,17 @@ static void handle_simple_TwoInts_foo(simple_TwoInts *v,void *context) { - unsigned char *src = get_sender_addr((struct thr_chn_t *)context); + struct ether_addr *src = get_sender_addr((struct thr_chn_t *)context); printf("Got TwoInts. a=%d, b=%d\n", v->a, v->b); printf("... src addr: %x:%x:%x:%x:%x:%x\n", src[0], src[1], src[2], src[3], src[4], src[5]); } static int encode(int argc, char *argv[]) { - struct thr_chn_t *p_thr_chn2 = NULL; + struct thr_chn_t *p_thr_chn = NULL; struct labcomm_encoder *encoder; struct labcomm_decoder *decoder; int i, j; -// unsigned char dest_mac[ETH_ADR_SIZE] = {0x00, 0x09, 0x6b, 0x10, 0xf3, 0x80}; /* other host MAC address, hardcoded...... :-( */ - unsigned char dest_mac[ETH_ADR_SIZE] = {0x00, 0x09, 0x6b, 0xe3, 0x81, 0xbf}; /* other host MAC address, hardcoded...... :-( */ + struct ether_addr dest_mac; unsigned char chn_id = 0x01; unsigned short frag_size = 60; unsigned short freq = 1000; /* milliseconds */ @@ -27,7 +26,7 @@ static int encode(int argc, char *argv[]) { char *ifname = argv[1]; char *dest_mac_str = argv[2]; - if(parse_MAC_address(dest_mac_str, dest_mac)) { + if(parse_MAC_address(dest_mac_str, &dest_mac)) { printf("failed to parse dest MAC address\n"); return 1; } @@ -38,17 +37,17 @@ static int encode(int argc, char *argv[]) { } else { - p_thr_chn2 = thr_open_chn(dest_mac, chn_id, frag_size, freq,(thr_msg_handler_t)labcomm_decoder_decode_one); - encoder = labcomm_encoder_new(labcomm_thr_writer, p_thr_chn2); + p_thr_chn = thr_open_chn(&dest_mac, chn_id, frag_size, freq,(thr_msg_handler_t)labcomm_decoder_decode_one); + encoder = labcomm_encoder_new(labcomm_thr_writer, p_thr_chn); labcomm_encoder_register_simple_TwoInts(encoder); labcomm_encoder_register_simple_IntString(encoder); - decoder = labcomm_decoder_new(labcomm_thr_reader, p_thr_chn2); + decoder = labcomm_decoder_new(labcomm_thr_reader, p_thr_chn); if (!decoder) { printf("Failed to allocate decoder %s:%d\n", __FUNCTION__, __LINE__); return 1; } - labcomm_decoder_register_simple_TwoInts(decoder, handle_simple_TwoInts_foo, p_thr_chn2); + labcomm_decoder_register_simple_TwoInts(decoder, handle_simple_TwoInts_foo, p_thr_chn); int ret; unsigned char data[200]; @@ -64,18 +63,18 @@ static int encode(int argc, char *argv[]) { printf("Encoding TwoInts, a=%d, b=%d\n", ti.a, ti.b); labcomm_encode_simple_TwoInts(encoder, &ti); printf("Decoding:\n"); - thr_receive(p_thr_chn2, data, decoder); - thr_receive(p_thr_chn2, data, decoder); + thr_receive(p_thr_chn, data, decoder); + thr_receive(p_thr_chn, data, decoder); labcomm_encoder_free(encoder); labcomm_decoder_free(decoder); - thr_close_chn(p_thr_chn2); + thr_close_chn(p_thr_chn); //client_exit(fd); } } static void handle_simple_TwoInts(simple_TwoInts *v,void *context) { - unsigned char *src = get_sender_addr((struct thr_chn_t *)context); + struct ether_addr *src = get_sender_addr((struct thr_chn_t *)context); unsigned char ch_id = get_channel((struct thr_chn_t *)context); printf("Got TwoInts. a=%d, b=%d\n", v->a, v->b); printf("... src addr: %x:%x:%x:%x:%x:%x\n", src[0], src[1], src[2], src[3], src[4], src[5]); @@ -91,14 +90,15 @@ static void handle_simple_TwoInts(simple_TwoInts *v,void *context) { static void handle_simple_IntString(simple_IntString *v,void *context) { printf("Got IntString. x=%d, s=%s\n", v->x, v->s); - unsigned char *src = get_sender_addr((struct thr_chn_t *)context); + struct ether_addr *src = get_sender_addr((struct thr_chn_t *)context); printf("... src addr: %x:%x:%x:%x:%x:%x\n", src[0], src[1], src[2], src[3], src[4], src[5]); } static int decode(int argc, char *argv[]) { struct thr_chn_t *p_thr_chn = NULL; struct labcomm_decoder *decoder; - unsigned char dest_mac[ETH_ADR_SIZE] = {0x00, 0x09, 0x6b, 0x10, 0xf3, 0x80}; /* other host MAC address, hardcoded...... :-( */ + struct ether_addr dest_mac; // Not used in this simple decoder example. + // The return channel is opened in the handler int ret = 0; unsigned char chn_id = 0x01; unsigned short frag_size = 60; @@ -112,7 +112,7 @@ static int decode(int argc, char *argv[]) { } else { - p_thr_chn = thr_open_chn(dest_mac, chn_id, frag_size, freq, (thr_msg_handler_t)labcomm_decoder_decode_one); + p_thr_chn = thr_open_chn(&dest_mac, chn_id, frag_size, freq, (thr_msg_handler_t)labcomm_decoder_decode_one); decoder = labcomm_decoder_new(labcomm_thr_reader, p_thr_chn); if (!decoder) { diff --git a/lib/c/experimental/ThrottleDrv/throttle_drv.c b/lib/c/experimental/ThrottleDrv/throttle_drv.c index 5ecbd18..36e830f 100644 --- a/lib/c/experimental/ThrottleDrv/throttle_drv.c +++ b/lib/c/experimental/ThrottleDrv/throttle_drv.c @@ -5,10 +5,9 @@ #include "stdlib.h" #include <string.h> #include <time.h> -#include <arpa/inet.h> +// #include <arpa/inet.h> #define THROTTLENET_PROTO 0x544e -#define ETH_ADR_LEN 6 #define THR_DST_ADR_POS 0 #define THR_SRC_ADR_POS (THR_DST_ADR_POS + sizeof(((thr_header_t*)0)->dst_adr)) //6 @@ -20,8 +19,8 @@ #define THR_PAYLOAD_POS (THR_FRAG_LEN_POS + sizeof(((thr_header_t*)0)->frag_len)) //21 #define THR_MSG_HEADER_LEN THR_PAYLOAD_POS -#define THR_MSG_DST_ADR(thr_msg) (unsigned char*)(&thr_msg[THR_DST_ADR_POS]) -#define THR_MSG_SRC_ADR(thr_msg) (unsigned char*)(&thr_msg[THR_SRC_ADR_POS]) +#define THR_MSG_DST_ADR(thr_msg) (struct ether_addr*)(&thr_msg[THR_DST_ADR_POS]) +#define THR_MSG_SRC_ADR(thr_msg) (struct ether_addr*)(&thr_msg[THR_SRC_ADR_POS]) #define THR_MSG_ETH_TYP(thr_msg) *(unsigned short*)(&thr_msg[THR_ETH_TYP_POS]) #define THR_MSG_CHN_ID(thr_msg) *(unsigned char*)(&thr_msg[THR_CHN_ID_POS]) #define THR_MSG_FRAG_NUM(thr_msg) *(unsigned short*)(&thr_msg[THR_FRAG_NUM_POS]) @@ -33,21 +32,21 @@ /* local type for the Throttle Channel structure */ struct thr_chn_t { - unsigned char dst_adr[ETH_ADR_LEN];/* destination MAC address */ + struct ether_addr dst_adr; /* destination MAC address */ unsigned char id; /* Channel id */ unsigned short frag_size; /* Fragment size */ unsigned short freq; /* Message transmission frequency */ thr_msg_handler_t funct; /* Callback function invoked at the reception */ unsigned short msg_length; unsigned char* p_msg; - unsigned char last_sender_adr[ETH_ADR_LEN];/* src MAC address of last message */ + struct ether_addr last_sender_adr;/* src MAC address of last message */ }; /* Type for the Throttle message */ typedef struct { - unsigned char dst_adr[ETH_ADR_LEN]; /* destination MAC address */ - unsigned char src_adr[ETH_ADR_LEN]; /* source MAC address */ + struct ether_addr dst_adr; /* destination MAC address */ + struct ether_addr src_adr; /* source MAC address */ unsigned short eth_type; /* ethernet packet type */ unsigned char chn_id; /* channel identification */ unsigned short frag_num; /* fragment number */ @@ -105,7 +104,7 @@ int thr_init(const char* eth_int_name) * @retval struct thr_chn_t*: pointer to the Channel structure. NULL on error and errno is set appropriately. * *******************************************************************************/ -struct thr_chn_t* thr_open_chn(const unsigned char* dst_adr, unsigned char chn_id, unsigned char frag_size, unsigned short freq, const thr_msg_handler_t funct) +struct thr_chn_t* thr_open_chn(const struct ether_addr* dst_adr, unsigned char chn_id, unsigned char frag_size, unsigned short freq, const thr_msg_handler_t funct) { struct thr_chn_t* tmp_chn = NULL; /* pointer to Channel structure */ @@ -128,7 +127,7 @@ struct thr_chn_t* thr_open_chn(const unsigned char* dst_adr, unsigned char chn_i else { /* Update the Channel structure */ - memcpy(tmp_chn->dst_adr, dst_adr, sizeof(tmp_chn->dst_adr)); + memcpy(&tmp_chn->dst_adr, dst_adr, sizeof(tmp_chn->dst_adr)); tmp_chn->id = chn_id; tmp_chn->frag_size = frag_size; tmp_chn->freq = freq; @@ -192,7 +191,7 @@ int thr_send(const struct thr_chn_t* thr_chn, const char* data, unsigned int len else { /* Compose the Ethernet Frame to be sent */ - memcpy(THR_MSG_DST_ADR(thr_msg), &thr_chn->dst_adr[0], ETH_ADR_LEN); /* Destiantion MAC Address */ + memcpy(THR_MSG_DST_ADR(thr_msg), &thr_chn->dst_adr, sizeof(thr_chn->dst_adr)); /* Destiantion MAC Address */ eth_getMACadr(eth_int, THR_MSG_SRC_ADR(thr_msg)); /* Source MAC Address */ THR_MSG_ETH_TYP(thr_msg) = htons(THROTTLENET_PROTO); /* Ethernet Packet Type */ THR_MSG_CHN_ID(thr_msg) = thr_chn->id; /* Channel identification */ @@ -321,7 +320,7 @@ int thr_receive(struct thr_chn_t* thr_chn, unsigned char* data, void* param) #endif thr_chn->msg_length = ret; memcpy(thr_chn->p_msg, data, ret); /* copy the msg into the thr structure */ - memcpy(thr_chn->last_sender_adr, THR_MSG_SRC_ADR(thr_msg), 6); /* ... and the address of the sender */ + memcpy(&thr_chn->last_sender_adr, THR_MSG_SRC_ADR(thr_msg), 6); /* ... and the address of the sender */ #ifdef DEBUG printf("thr_receive: calling %x\n", thr_chn->funct); #endif @@ -401,8 +400,8 @@ int thr_read(struct thr_chn_t* thr_chn, unsigned char* data, int length) return(ret); } -unsigned char* get_sender_addr(struct thr_chn_t* ch) { - return ch->last_sender_adr; +struct ether_addr* get_sender_addr(struct thr_chn_t* ch) { + return &ch->last_sender_adr; } unsigned char get_channel(struct thr_chn_t* ch) { diff --git a/lib/c/experimental/ThrottleDrv/throttle_drv.h b/lib/c/experimental/ThrottleDrv/throttle_drv.h index 7ab0439..97323ae 100644 --- a/lib/c/experimental/ThrottleDrv/throttle_drv.h +++ b/lib/c/experimental/ThrottleDrv/throttle_drv.h @@ -1,7 +1,11 @@ #ifndef _THROTTLE_DRV_H_ #define _THROTTLE_DRV_H_ -#define ETH_ADR_SIZE 6 +//#define ETH_ADR_SIZE 6 + +#include <net/ethernet.h> + + /* typedef of the callback used to manage the received Ethernet Frame (the User Data)*/ typedef int (*thr_msg_handler_t)(void* data); @@ -9,12 +13,12 @@ struct thr_chn_t; int thr_init(const char* eth_int); -struct thr_chn_t* thr_open_chn(const unsigned char* dst_adr, unsigned char chn_id, unsigned char frag_size, unsigned short freq, thr_msg_handler_t funct); +struct thr_chn_t* thr_open_chn(const struct ether_addr* dst_adr, unsigned char chn_id, unsigned char frag_size, unsigned short freq, thr_msg_handler_t funct); void thr_close_chn(struct thr_chn_t* c); int thr_receive (struct thr_chn_t* thr_chn, unsigned char* data, void* param); int thr_send(const struct thr_chn_t* thr_chn, const char* data, unsigned int length); int thr_read(struct thr_chn_t* thr_chn, unsigned char* data, int length); -unsigned char* get_sender_addr(struct thr_chn_t* ch); +struct ether_addr * get_sender_addr(struct thr_chn_t* ch); unsigned char get_channel(struct thr_chn_t* ch); #endif diff --git a/lib/c/experimental/ethaddr.c b/lib/c/experimental/ethaddr.c index 29dab1a..b2207e5 100644 --- a/lib/c/experimental/ethaddr.c +++ b/lib/c/experimental/ethaddr.c @@ -1,15 +1,22 @@ #include <stdio.h> #include "ethaddr.h" +#if ETH_ALEN != 6 + #warning "Assumption that ETH_ALEN == 6 appears false. Here be dragons." +#endif /* parse a string on the format 00:01:02:0d:0e:0f into a char array * the mac_addr argument must be at least six bytes. * returns 0 on success, or -1 on error */ -int parse_MAC_address(const char *str, unsigned char mac_addr[]) +int parse_MAC_address(const char *str, struct ether_addr *mac_addr) { - int res = sscanf(str, "%x:%x:%x:%x:%x:%x", &mac_addr[0], &mac_addr[1], - &mac_addr[2], &mac_addr[3], &mac_addr[4], &mac_addr[5]); + int res = sscanf(str, "%x:%x:%x:%x:%x:%x", &mac_addr->ether_addr_octet[0], + &mac_addr->ether_addr_octet[1], + &mac_addr->ether_addr_octet[2], + &mac_addr->ether_addr_octet[3], + &mac_addr->ether_addr_octet[4], + &mac_addr->ether_addr_octet[5]); return (res == 6? 0 : -1); } diff --git a/lib/c/experimental/ethaddr.h b/lib/c/experimental/ethaddr.h index 605c86e..f7aaf29 100644 --- a/lib/c/experimental/ethaddr.h +++ b/lib/c/experimental/ethaddr.h @@ -1,8 +1,11 @@ #ifndef ETHADDR_H #define ETHADDR_H + +#include <net/ethernet.h> + /* parse a string on the format 00:01:02:0d:0e:0f into a char array * the mac_addr argument must be at least six bytes. * returns 0 on success, or -1 on error */ -int parse_MAC_address(const char *str, unsigned char mac_addr[]); +int parse_MAC_address(const char *str, struct ether_addr *mac_addr); #endif -- GitLab