00001 #include "filteradapter.h"
00002
00003 namespace n2nc {
00004
00005 FilterAdapter::FilterAdapter(net::Socket& socket) : Socket() ,m_socket(socket){
00006
00007
00008
00009
00010
00011 this->m_tmpbuf = malloc(65535);
00012 }
00013
00014
00015 FilterAdapter::~FilterAdapter(){
00016 free (this->m_tmpbuf);
00017 }
00018
00019 bool FilterAdapter::addFilter(Filter* filter){
00020 this->m_filters.push_back(filter);
00021 }
00022
00023 bool FilterAdapter::delFilter(Filter* filter){
00024
00025 }
00026
00027 int FilterAdapter::send(void * buf, size_t len){
00028 std::vector<Filter*>::iterator it;
00029 Filter *f;
00030 Filter::status_t stat ;
00031 void *inbuf, *outbuf ;
00032 size_t inlen ,outlen;
00033 inbuf = buf ; inlen =len ;
00034 outbuf = this->m_tmpbuf ;
00035
00036
00037 for( it = this->m_filters.begin() ; it != this->m_filters.end() ; it++){
00038 f = *it ;
00039 stat = f->egress(inbuf,outbuf,inlen,&outlen);
00040 memcpy(inbuf,outbuf,outlen);
00041
00042
00043 inlen = outlen ;
00044 switch(stat){
00045 case (Filter::FILTER_RETURN):
00046 goto exitchain ;
00047 break;
00048
00049 case (Filter::FILTER_DROP):
00050 return -1 ;
00051 break;
00052
00053 case (Filter::FILTER_CONTINUE):
00054
00055
00056 break;
00057 }
00058 }
00059
00060 exitchain:
00061
00062 if (this->m_filters.empty()){
00063
00064 return this->m_socket.send(inbuf,len);
00065 }
00066
00067 return this->m_socket.send(outbuf,outlen);
00068 }
00069
00070 int FilterAdapter::recv(void * buf, size_t len){
00071 std::vector<Filter*>::reverse_iterator it;
00072 Filter *f;
00073 Filter::status_t stat ;
00074 void *inbuf, *outbuf ;
00075 int inlen ;
00076 size_t outlen;
00077 inbuf = this->m_tmpbuf ; inlen =len ;
00078 outbuf = buf ;
00079
00080
00081 if (this->m_filters.empty()){
00082 inbuf = buf ;
00083 }
00084
00085 inlen = this->m_socket.recv(inbuf,len);
00086 outlen = inlen ;
00087 if (inlen < 0) {
00088 std::cerr << "FA RECV ERROR. DISCARDING PACKET" << std::endl ;
00089 return -1 ;
00090 }
00091
00092 for( it = this->m_filters.rbegin() ; it < this->m_filters.rend() ; ++it){
00093 f = *it ;
00094 stat = f->ingress(inbuf,outbuf,(size_t)inlen,&outlen);
00095 memcpy(inbuf,outbuf,outlen);
00096 inlen = outlen ;
00097 switch(stat){
00098 case (Filter::FILTER_RETURN):
00099 goto exitchain ;
00100 break;
00101
00102 case (Filter::FILTER_DROP):
00103 return -1 ;
00104 break;
00105
00106 case (Filter::FILTER_CONTINUE):
00107
00108
00109 break;
00110 }
00111 }
00112
00113 exitchain:
00114
00115 return outlen;
00116 }
00117
00118 size_t FilterAdapter::getMaxOverHead(){
00119 int tmp = 0;
00120 std::vector<Filter*>::iterator it;
00121 Filter *f;
00122 for( it = this->m_filters.begin() ; it != this->m_filters.end() ; it++){
00123 f = *it ;
00124 tmp += f->getMaxOverHead() ;
00125 }
00126 return tmp ;
00127 }
00128
00129 }
00130
00131
00132