00001
00002
00003
00004
00005
00006
00007
00008
00009
#include <rsbac/types.h>
00010
#ifdef __KERNEL__
00011
#include <rsbac/network.h>
00012
#endif
00013
00014 __u32
rsbac_net_make_mask_u32(__u8 bits)
00015 {
00016 __u32 res;
00017 __u8 res0 = 0;
00018 __u8 res1 = 0;
00019 __u8 res2 = 0;
00020 __u8 res3 = 0;
00021
int i;
00022
00023
if(bits >=32)
00024
return (__u32) -1;
00025
if(!bits)
00026
return 0;
00027
if(bits >= 24)
00028 {
00029 bits -= 24;
00030 res0 = 255;
00031 res1 = 255;
00032 res2 = 255;
00033
for(i=0; i<bits; i++)
00034 res3 |= 1 << (7-i);
00035 }
00036
else
00037
if(bits >= 16)
00038 {
00039 bits -= 16;
00040 res0 = 255;
00041 res1 = 255;
00042 res3 = 0;
00043
for(i=0; i<bits; i++)
00044 res2 |= 1 << (7-i);
00045 }
00046
else
00047
if(bits >= 8)
00048 {
00049 bits -= 8;
00050 res0 = 255;
00051 res2 = 0;
00052 res3 = 0;
00053
for(i=0; i<bits; i++)
00054 res1 |= 1 << (7-i);
00055 }
00056
else
00057 {
00058 res1 = 0;
00059 res2 = 0;
00060 res3 = 0;
00061
for(i=0; i<bits; i++)
00062 res0 |= 1 << (7-i);
00063 }
00064 res = (res3 << 24) | (res2 << 16) | (res1 << 8) | res0;
00065
return res;
00066 }
00067
00068
#ifdef __KERNEL__
00069
00070
int rsbac_net_compare_data(
void * data1,
void * data2)
00071 {
00072
struct rsbac_net_temp_data_t * temp = data1;
00073
struct rsbac_net_description_t * desc = data2;
00074
00075
if(!temp || !desc)
00076
return 1;
00077
if( (temp->address_family !=
RSBAC_NET_ANY)
00078 && (temp->address_family != desc->address_family)
00079 )
00080
return 1;
00081
switch(desc->address_family)
00082 {
00083
case AF_UNIX:
00084
if( (temp->type !=
RSBAC_NET_ANY)
00085 && (desc->type != temp->type)
00086 )
00087
return 1;
00088
if(!temp->valid_len)
00089
return 0;
00090
if( !desc->address
00091 || !desc->address_len
00092 )
00093
return 1;
00094
if(memcmp(desc->address,
00095 temp->address,
00096
rsbac_min(desc->address_len, temp->valid_len)))
00097
return 1;
00098
else
00099
return 0;
00100
00101
case AF_INET:
00102 {
00103 __u32 mask;
00104
00105
if( (temp->type !=
RSBAC_NET_ANY)
00106 && (desc->type != temp->type)
00107 )
00108
return 1;
00109
if( (temp->protocol !=
RSBAC_NET_ANY)
00110 && (desc->protocol != temp->protocol)
00111 )
00112
return 1;
00113
if( (desc->port < temp->min_port)
00114 || (desc->port > temp->max_port)
00115 )
00116
return 1;
00117
00118
if( temp->netdev[0]
00119 && ( !desc->netdev[0]
00120 || strncmp(desc->netdev,
00121 temp->netdev,
00122 RSBAC_IFNAMSIZ)
00123 )
00124 )
00125
return 1;
00126
if(!temp->valid_len)
00127
return 0;
00128 mask =
rsbac_net_make_mask_u32(temp->valid_len);
00129
if( !desc->address
00130 || (( (*(__u32 *)desc->address) & mask ) != ( (*(__u32 *)temp->address) & mask))
00131 )
00132
return 1;
00133
else
00134
return 0;
00135 }
00136
00137
00138
default:
00139
if( (temp->type !=
RSBAC_NET_ANY)
00140 && (desc->type != temp->type)
00141 )
00142
return 1;
00143
return 0;
00144 }
00145
return 1;
00146 }
00147
#endif