diff options
Diffstat (limited to 'Source/charon/packet.c')
-rw-r--r-- | Source/charon/packet.c | 115 |
1 files changed, 95 insertions, 20 deletions
diff --git a/Source/charon/packet.c b/Source/charon/packet.c index 94b58e5e1..ba2c0cb58 100644 --- a/Source/charon/packet.c +++ b/Source/charon/packet.c @@ -1,8 +1,8 @@ /** - * @file packet.h - * - * @brief UDP-Packet, contains data, sender and receiver - * + * @file packet.c + * + * @brief UDP-Packet, contains data, sender and receiver. + * */ /* @@ -24,18 +24,82 @@ #include "packet.h" -static status_t destroy(packet_t *this) +/** + * Private data of an packet_t object + */ +typedef struct private_packet_s private_packet_t; + +struct private_packet_s { + + /** + * Public part of a packet_t object + */ + packet_t public; + + /* private functions */ + + /** + * @brief helper function to set address used by set_dest & set_source. + * + * @param this calling object_t + * @param family address family + * @param saddr source address + * @param address address as string + * @return + * - SUCCESS if successfuly + * - NOT_SUPPORTED if family is not supported + */ + status_t (*set_addr) (private_packet_t *this, int family, struct sockaddr *saddr, char *address, u_int16_t port); +}; + +/** + * Implements packet_t's destroy function. + * See #packet_s.destroy for description. + */ +static status_t destroy(private_packet_t *this) { - if (this->data.ptr != NULL) + if (this->public.data.ptr != NULL) { - allocator_free(this->data.ptr); + allocator_free(this->public.data.ptr); } allocator_free(this); return SUCCESS; } /** - * @brief helper function to set address used by set_dest & set_source + * Implements packet_t's clone function. + * See #packet_s.clone for description. + */ +static status_t clone (private_packet_t *packet, packet_t **clone) +{ + *clone = packet_create(packet->public.family); + if ((*clone) == NULL) + { + + return OUT_OF_RES; + } + + + (*clone)->sockaddr_len = packet->public.sockaddr_len; + (*clone)->source = packet->public.source; + (*clone)->destination = packet->public.destination; + /* only clone existing chunks :-) */ + if (packet->public.data.ptr != NULL) + { + (*clone)->data.ptr = allocator_clone_bytes(packet->public.data.ptr,packet->public.data.len); + if ((*clone)->data.ptr == NULL) + { + (*clone)->destroy((*clone)); + return OUT_OF_RES; + } + (*clone)->data.len = packet->public.data.len; + } + return SUCCESS; +} + +/** + * Implements private_packet_t's set_addr function. + * See #private_packet_t.set_addr for description. */ static status_t set_addr(int family, struct sockaddr *saddr, char *address, u_int16_t port) { @@ -54,39 +118,50 @@ static status_t set_addr(int family, struct sockaddr *saddr, char *address, u_in return NOT_SUPPORTED; } -status_t set_destination(packet_t *this, char *address, u_int16_t port) +/** + * Implements packet_t's set_destination function. + * See #packet_t.set_destination for description. + */ +static status_t set_destination(packet_t *this, char *address, u_int16_t port) { struct sockaddr *saddr = &(this->destination); return set_addr(this->family, saddr, address, port); } -status_t set_source(packet_t *this, char *address, u_int16_t port) +/** + * Implements packet_t's set_source function. + * See #packet_t.set_source for description. + */ +static status_t set_source(packet_t *this, char *address, u_int16_t port) { struct sockaddr *saddr = &(this->source); return set_addr(this->family, saddr, address, port); } - +/* + * Documented in header + */ packet_t *packet_create(int family) { - packet_t *this = allocator_alloc_thing(packet_t); + private_packet_t *this = allocator_alloc_thing(private_packet_t); - this->destroy = destroy; - this->set_destination = set_destination; - this->set_source = set_source; + this->public.destroy = (status_t(*) (packet_t *)) destroy; + this->public.set_destination = set_destination; + this->public.set_source = set_source; + this->public.clone = (status_t(*) (packet_t *,packet_t**))clone; - this->family = family; + this->public.family = family; switch (family) { case AF_INET: - this->sockaddr_len = sizeof(struct sockaddr_in); + this->public.sockaddr_len = sizeof(struct sockaddr_in); break; default: /* not supported */ allocator_free(this); return NULL; } - this->data.len = 0; - this->data.ptr = NULL; - return this; + this->public.data.len = 0; + this->public.data.ptr = NULL; + return &(this->public); } |