]> rtime.felk.cvut.cz Git - frescor/fwp.git/blobdiff - fwp/lib/fwp/fwp_vres.c
Allow bypassing FWP by setting FWP_BYPASS environment variable
[frescor/fwp.git] / fwp / lib / fwp / fwp_vres.c
index ad5bacbf36e92cd160a64cef2d65be66b90dedee..1078bd184f592e16b92704e32aa558b24a7d4d3f 100644 (file)
@@ -58,7 +58,6 @@
 static void* fwp_vres_tx_thread(void *_vres);
 
 typedef enum {
-       USED,
        UNTOUCHED,
        CHANGED,
        QUEUED,
@@ -93,21 +92,9 @@ struct fwp_vres{
         * of vres parameters. */
        int                             ac_sockd;
        /** Queue for messages to send */
-       struct fwp_msgq                 msg_queue;   
-};
-
-typedef
-struct fwp_vres_table {
-       unsigned int                    max_vres; 
-       fwp_vres_t                      *entry;
-       pthread_mutex_t                 lock;
-} fwp_vres_table_t;
-
-/* Global variable - vres table */
-static fwp_vres_table_t  fwp_vres_table = {
-       .max_vres = 0,
-       .entry = NULL,
-       .lock = PTHREAD_MUTEX_INITIALIZER,
+       struct fwp_msgq                 msg_queue;
+       /** If true, it is always allowed to send messages through this vres. */
+       bool                            bypass;
 };
 
 /**< mapping priority to ac*/
@@ -160,19 +147,7 @@ static inline void clear_all_flags(fwp_vres_t *vres)
 
 static inline void fwp_vres_free(fwp_vres_t *vres)
 {
-       /* Clear USED flag */
-       clear_all_flags(vres);
-}
-
-static inline int fwp_vres_is_valid(fwp_vres_t *vres)
-{
-       int id  = vres - fwp_vres_table.entry;
-
-       if ((id < 0) || (id > fwp_vres_table.max_vres - 1) || 
-               (!get_flag(vres, USED))) 
-               return 0;
-       
-       return 1; 
+       free(vres);
 }
 
 /*inline int fwp_vres_get(fwp_vres_id_t vres_id, fwp_vres_t **vres )
@@ -184,19 +159,6 @@ static inline int fwp_vres_is_valid(fwp_vres_t *vres)
 }
 */
 
-int fwp_vres_table_init(unsigned int max_vres)
-{
-       unsigned int table_size = max_vres * sizeof(fwp_vres_t);
-
-       fwp_vres_table.entry = (fwp_vres_t*) malloc(table_size);
-       if (!fwp_vres_table.entry) 
-               return -1;      /* Errno is set by malloc */
-
-       memset((void*) fwp_vres_table.entry, 0, table_size);
-       fwp_vres_table.max_vres = max_vres;
-       return 0;
-}
-
 /**
  * Allocate vres
  *
@@ -204,28 +166,12 @@ int fwp_vres_table_init(unsigned int max_vres)
  */
 fwp_vres_t *fwp_vres_alloc()
 {
-       int i;
-       unsigned int max_vres;
-
-       /* find free vres id */
-       pthread_mutex_lock(&fwp_vres_table.lock);
-       i = 0;
-       max_vres = fwp_vres_table.max_vres;
-       while ((i < max_vres) && 
-               (get_flag(&fwp_vres_table.entry[i], USED))) {
-               i++;
-       }
-       
-       if (i == max_vres) {
-               pthread_mutex_unlock(&fwp_vres_table.lock);
-               errno = ENOBUFS;
-               return NULL;
+       fwp_vres_t *vres = malloc(sizeof(*vres));
+       if (vres) {
+               memset(vres, 0, sizeof(*vres));
+               FWP_DEBUG("Allocated vres\n");
        }
-
-       FWP_DEBUG("Allocated vres id = %d\n",i);
-       set_flag(&fwp_vres_table.entry[i], USED);
-       pthread_mutex_unlock(&fwp_vres_table.lock);
-       return (&fwp_vres_table.entry[i]);
+       return vres;
 }
 
 static int apply_params(fwp_vres_t *vres)
@@ -255,7 +201,7 @@ int fwp_vres_set_params(fwp_vres_t *vres, fwp_vres_params_t *params)
 {
        int rv = 0;
 
-       if (!fwp_vres_is_valid(vres)) {
+       if (!vres) {
                errno = EINVAL;
                return -1;
        }
@@ -310,6 +256,9 @@ int fwp_vres_create(fwp_vres_params_t *params, fwp_vres_t **vresp)
        apply_params(vres);
        fwp_msgq_init(&vres->msg_queue);
 
+       if (getenv("FWP_BYPASS"))
+               vres->bypass = true;
+
        pthread_attr_init(&vres->tx_thread_attr);
        if ((rv = pthread_create(&vres->tx_thread, &vres->tx_thread_attr, 
                            fwp_vres_tx_thread, (void*) vres)) != 0){
@@ -335,7 +284,7 @@ err:
  */
 int fwp_vres_destroy(fwp_vres_t *vres)
 {      
-       if (!fwp_vres_is_valid(vres)) {
+       if (!vres) {
                errno = EINVAL;
                return -1;
        }
@@ -370,6 +319,8 @@ static void do_consume_budget(struct fwp_vres *vres, size_t size)
 int __consume_budget(struct fwp_vres *vres, size_t size, bool can_block)
 {
        int ret = 0;
+       if (vres->bypass)
+               return 0;
        if (vres->params.budget < size) {
                errno = ENOSR;
                return -1;
@@ -511,7 +462,7 @@ int fwp_vres_bind(fwp_vres_t *vres, struct fwp_endpoint *ep, int sockd, struct i
 {
        int rv = 0;
 
-       if (!fwp_vres_is_valid(vres)) {
+       if (!vres) {
                errno = EINVAL;
                rv = -1;
                goto err;
@@ -535,7 +486,7 @@ err:
 
 int fwp_vres_unbind(fwp_vres_t *vres)
 {
-       if (!fwp_vres_is_valid(vres)) {
+       if (!vres) {
                errno = EINVAL;
                return -1;
        }