+#include "fwp_endpoint.h"
-struct fwp_endpoint* fwp_endpoint_create(int pf, struct sockaddr *_addr, socklen_t _addrlen)
-{
- struct fwp_socket* fwpsock;
- unsigned char *addr;
-
-
-
- fwpsock = (struct fwp_socket*) malloc(sizeof(struct fwp_socket) +
- _addrlen);
- if (!fwpsock)
- return NULL;
-
- addr = (unsigned char*) fwpsock + sizeof(struct fwp_socket);
- memcpy(addr, (void*) _addr, _addrlen);
+enum fwp_endpoint_type_t {
+ FWP_SEND_EPOIN = 0,
+ FWP_RECV_EPOINT = 1,
+};
- fwpsock->addr = (struct sockaddr*) addr;
- fwpsock->addrlen = _addrlen;
+enum fwp_endpoint_status_t {
+ FWP_EPOINT_CLOSED = 0,
+ FWP_EPOINT_OPENED = 1,
+};
- return fwpsock;
-}
+static struct fwp_endpoint fwp_endpoint_table[FWP_EPOINT_MAX];
+static pthread_mutex_t fwp_endpoint_table_lock = PTHREAD_MUTEX_INITIALIZER;
-inline void fwp_socket_set(struct fwp_socket *fwpsock, struct sockaddr *_addr,
- socklen_t _addrlen)
+inline int fwp_endpoint_is_valid(int id)
{
- fwpsock->addr = _addr;
- fwpsock->addrlen = _addrlen;
+ if ((id < 0) || (id >= FWP_EPOINT_MAX))
+ return -EINVAL;
+ if ((fwp_endpoint_table[id].status != FWP_EPOINT_OPENED))
+ return -EPERM;
+ return 0;
+}
+
+void fwp_endpoint_table_init()
+{
+ int id;
+
+ for (id = 0; id < FWP_EPOINT_MAX; id++)
+ fwp_endpoint_table[id].status = FWP_EPOINT_CLOSED;
}
-void fwp_socket_free(struct fwp_socket *fwpsock)
+struct fwp_endpoint* fwp_endpoint_create(int type, int node, int port)
+/* queueing policy should be the next parameter*/
{
- free((void*)fwpsock);
- fwpsock = NULL;
+ int id,rc;
+ struct fwp_endpoint *epoint;
+
+ /* Check for validity of the contract */
+
+ /* obtain fwp_vres_table mutex */
+ pthread_mutex_lock(&fwp_epoint_table_lock);
+
+ /* find free vres id */
+ id = 0;
+ while ((id < FWP_EPOINT_MAX) &&
+ (fwp_endpoint_table[id].status != FWP_EPOINT_CLOSED)){
+
+ id++;
+ }
+ if (id == FWP_EPOINT_MAX) {
+ /* release fwp_vres_table mutex */
+ return -ENOMEM;
+ }
+
+ epoint = &fwp_endpoint_table[id];
+ epoint->status = FWP_EPOINT_OPENED;
+ /* release fwp_vres_table mutex */
+ pthread_mutex_unlock(&fwp_endpoint_table_lock);
+
+ epoint->addr.sin_family = AF_INET;
+ epoint->addr.sin_port = htons(port);
+ if (type == FWP_SEND_EPOINT) {
+ epoint->addr.sin_addr.s_addr = node;
+ return epoint;
+ }
+
+ epoint->addr.sin_addr.s_addr = INADDR_ANY;
+
+ if ((epoint->sockd = socket(AF_INET, SOCK_DGRAM, 0)) == -1){
+ perror("fwp_endpoint_create - socket error");
+ return (-errno);
+ }
+
+ if (bind(epoint->sockd, (struct sockaddr*) &epoint->addr,
+ sizeof(epoint->addr)) == -1) {
+
+ perror("fwp_endpoint_create - bind error");
+ return (-errno);
+ }
+
+
}
int sockfd;
if ((sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) == -1){
- perror("fwp_init - socket error");
+ perror("fwp_create_unix_socket - socket error");
return (-errno);
}
int sockfd;
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1){
- perror("fwp_open_inet_socket - socket error");
+ perror("fwp_create_inet_socket - socket error");
return (-errno);
}
if (bind(sockfd, (struct sockaddr*)addr,
sizeof(*addr)) == -1) {
- perror("fwp_init - bind error");
+ perror("fwp_create_inet_socket - bind error");
return (-errno);
}