OpenHIP 0.9svn1
Classes | Defines | Enumerations | Functions | Variables
/home/tomh/svn/openhip/hip/trunk/src/usermode/hip_mr.c File Reference
#include <unistd.h>
#include <pthread.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip6.h>
#include <netinet/icmp6.h>
#include <netinet/tcp.h>
#include <netinet/udp.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <openssl/rand.h>
#include <sys/time.h>
#include <hip/hip_service.h>
#include <hip/hip_types.h>
#include <hip/hip_funcs.h>
#include <hip/hip_globals.h>
#include <hip/hip_mr.h>
#include <win32/checksum.h>
#include <linux/types.h>
#include <linux/netfilter.h>
#include <linux/version.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <linux/netfilter/nfnetlink.h>
#include <linux/netfilter/nfnetlink_queue.h>

Classes

struct  if_data

Defines

#define aligned_be64   u_int64_t __attribute__((aligned(8)))
#define BUFSIZE   2048
#define MR_TIMEOUT_US   500000
#define MAX_MR_CLIENTS   MAX_CONNECTIONS
#define MAX_EIFACES   8
#define PRINT_NLMSGHDR(n)

Enumerations

enum  { EIF_UNAVAILABLE, EIF_AVAILABLE }

Functions

int addr_match_payload (__u8 *payload, int family, struct sockaddr *src, struct sockaddr *dst)
__u32 get_next_spinat (void)
hip_mr_clientmr_client_lookup (hip_hit hit)
void mr_process_I1 (hip_mr_client *hip_mr_c, int family, int inbound, struct if_data *ext_if, hiphdr *hiph, unsigned char *payload)
void mr_process_R1 (hip_mr_client *hip_mr_c, int family, int inbound, struct if_data *ext_if, hiphdr *hiph, unsigned char *payload)
__u32 mr_process_I2 (hip_mr_client *hip_mr_c, int family, int inbound, struct if_data *ext_if, hiphdr *hiph, unsigned char *payload)
__u32 mr_process_R2 (hip_mr_client *hip_mr_c, int family, int inbound, struct if_data *ext_if, hiphdr *hiph, unsigned char *payload)
__u32 mr_process_I1_or_R2 (hip_mr_client *hip_mr_c, int family, int inbound, struct if_data *ext_if, hiphdr *hiph, unsigned char *payload)
void mr_process_CLOSE (hip_mr_client *hip_mr_c, int family, int inbound, struct if_data *ext_if, hiphdr *hiph, unsigned char *payload, int packet_type)
unsigned char * add_tlv_spi_nat (int family, unsigned char *payload, size_t data_len, size_t *new_len, __u32 new_spi)
unsigned char * check_hip_packet (int family, int inbound, struct if_data *ext_if, unsigned char *payload, size_t data_len, size_t *new_len)
unsigned char * new_header (int family, unsigned char *payload)
unsigned char * check_esp_packet (int family, int inbound, struct if_data *ext_if, unsigned char *payload)
void mr_clear_retransmissions (hip_spi_nat *spi_nats)
void * hip_mobile_router (void *arg)
int hip_send_proxy_update (struct sockaddr *newaddr, struct sockaddr *dstaddr, hip_spi_nat *spi_nat, hip_hit *mn_hit)
int build_tlv_proxy_hmac (hip_proxy_ticket *ticket, __u8 *data, int location, int type)
int free_hip_mr_client (hip_mr_client *hip_mr_c)
int is_mobile_router ()
int hip_mobile_router_add_remove_rules (int queue_num, int del)
int netfilter_queue_init (int queue_num)
int netfilter_queue_bind (int nlfd, int n, int af)
int netfilter_queue_unbind (int nlfd, int n, int af)
int netfilter_queue_config_command (int nlfd, int queue_num, int cmd, int af)
int netfilter_queue_config_param (int nlfd, int queue_num)
int netfilter_queue_sendmsg (int nlfd, __u8 *data, int len)
__u8netfilter_queue_command_hdr (__u8 *buf, int queue_num, int type, int *len)
int netfilter_get_packet (int nlfd, __u8 *buf, int *buf_len, __u8 *family, __u32 *id, __u8 *hook, int *ifi)
int netfilter_queue_set_verdict (int nlfd, int queue_num, __u32 id, __u32 verdict, int data_len, __u8 *data)
void rewrite_addrs (__u8 *payload, struct sockaddr *src, struct sockaddr *dst)
__u32 mr_process_I2_or_R2 (hip_mr_client *hip_mr_c, int family, int inbound, struct if_data *ext_if, hiphdr *hiph, unsigned char *payload)
void mr_process_update (hip_mr_client *hip_mr_c, int family, int inbound, struct if_data *ext_if, hiphdr *hiph, unsigned char *payload)
unsigned char * do_inbound_esp_packet (int family, unsigned char *payload, struct sockaddr *addr, hip_spi_nat *spi_nat)
unsigned char * do_outbound_esp_packet (int family, struct if_data *ext_if, unsigned char *payload, hip_mr_client *client, hip_spi_nat *spi_nat)
int hip_mr_retransmit (struct timeval *time1, hip_hit hit)
int copy_for_retrans (__u8 *data, int len, struct sockaddr *dst, hip_spi_nat *spi_nat)
int hip_mr_set_external_ifs ()
void send_updates (struct sockaddr *out)
void hip_mr_handle_address_change (int add, struct sockaddr *newaddr, int ifi)
int init_hip_mr_client (hip_hit peer_hit, struct sockaddr *src)
int add_proxy_ticket (const __u8 *data)

Variables

static hip_mr_client hip_mr_client_table [MAX_MR_CLIENTS]
static hip_mutex_t hip_mr_client_mutex
static int max_hip_mr_clients
static int neifs = 0
static struct if_data external_interfaces [MAX_EIFACES]

Define Documentation

#define aligned_be64   u_int64_t __attribute__((aligned(8)))
#define BUFSIZE   2048

Referenced by hip_mobile_router().

#define MAX_EIFACES   8
#define MAX_MR_CLIENTS   MAX_CONNECTIONS
#define MR_TIMEOUT_US   500000

Referenced by hip_mobile_router().

#define PRINT_NLMSGHDR (   n)
Value:
{ \
    printf("nlmsg len=%d type=%d flags=%d seq=%d pid=%d\n", \
           n->nlmsg_len, n->nlmsg_type, n->nlmsg_flags, \
           n->nlmsg_seq, n->nlmsg_pid); }

Enumeration Type Documentation

anonymous enum
Enumerator:
EIF_UNAVAILABLE 
EIF_AVAILABLE 

Function Documentation

int add_proxy_ticket ( const __u8 data)
unsigned char * add_tlv_spi_nat ( int  family,
unsigned char *  payload,
size_t  data_len,
size_t *  new_len,
__u32  new_spi 
)
int addr_match_payload ( __u8 payload,
int  family,
struct sockaddr *  src,
struct sockaddr *  dst 
)
int build_tlv_proxy_hmac ( hip_proxy_ticket ticket,
__u8 data,
int  location,
int  type 
)
unsigned char * check_esp_packet ( int  family,
int  inbound,
struct if_data ext_if,
unsigned char *  payload 
)
unsigned char * check_hip_packet ( int  family,
int  inbound,
struct if_data ext_if,
unsigned char *  payload,
size_t  data_len,
size_t *  new_len 
)
int copy_for_retrans ( __u8 data,
int  len,
struct sockaddr *  dst,
hip_spi_nat spi_nat 
)
unsigned char* do_inbound_esp_packet ( int  family,
unsigned char *  payload,
struct sockaddr *  addr,
hip_spi_nat spi_nat 
)
unsigned char* do_outbound_esp_packet ( int  family,
struct if_data ext_if,
unsigned char *  payload,
hip_mr_client client,
hip_spi_nat spi_nat 
)
int free_hip_mr_client ( hip_mr_client hip_mr_c)
__u32 get_next_spinat ( void  )
void* hip_mobile_router ( void *  arg)
int hip_mobile_router_add_remove_rules ( int  queue_num,
int  del 
)

Referenced by hip_mobile_router().

void hip_mr_handle_address_change ( int  add,
struct sockaddr *  newaddr,
int  ifi 
)
int hip_mr_retransmit ( struct timeval *  time1,
hip_hit  hit 
)
int hip_mr_set_external_ifs ( )
int hip_send_proxy_update ( struct sockaddr *  newaddr,
struct sockaddr *  dstaddr,
hip_spi_nat spi_nat,
hip_hit mn_hit 
)
int init_hip_mr_client ( hip_hit  peer_hit,
struct sockaddr *  src 
)
int is_mobile_router ( )

References hip_opt::mr, and OPT.

Referenced by init_hip().

void mr_clear_retransmissions ( hip_spi_nat spi_nats)
hip_mr_client * mr_client_lookup ( hip_hit  hit)
void mr_process_CLOSE ( hip_mr_client hip_mr_c,
int  family,
int  inbound,
struct if_data ext_if,
hiphdr hiph,
unsigned char *  payload,
int  packet_type 
)
void mr_process_I1 ( hip_mr_client hip_mr_c,
int  family,
int  inbound,
struct if_data ext_if,
hiphdr hiph,
unsigned char *  payload 
)
__u32 mr_process_I1_or_R2 ( hip_mr_client hip_mr_c,
int  family,
int  inbound,
struct if_data ext_if,
hiphdr hiph,
unsigned char *  payload 
)
__u32 mr_process_I2 ( hip_mr_client hip_mr_c,
int  family,
int  inbound,
struct if_data ext_if,
hiphdr hiph,
unsigned char *  payload 
)

References mr_process_I2_or_R2().

Referenced by check_hip_packet().

__u32 mr_process_I2_or_R2 ( hip_mr_client hip_mr_c,
int  family,
int  inbound,
struct if_data ext_if,
hiphdr hiph,
unsigned char *  payload 
)
void mr_process_R1 ( hip_mr_client hip_mr_c,
int  family,
int  inbound,
struct if_data ext_if,
hiphdr hiph,
unsigned char *  payload 
)
__u32 mr_process_R2 ( hip_mr_client hip_mr_c,
int  family,
int  inbound,
struct if_data ext_if,
hiphdr hiph,
unsigned char *  payload 
)

References mr_process_I2_or_R2().

Referenced by check_hip_packet().

void mr_process_update ( hip_mr_client hip_mr_c,
int  family,
int  inbound,
struct if_data ext_if,
hiphdr hiph,
unsigned char *  payload 
)
int netfilter_get_packet ( int  nlfd,
__u8 buf,
int *  buf_len,
__u8 family,
__u32 id,
__u8 hook,
int *  ifi 
)
int netfilter_queue_bind ( int  nlfd,
int  n,
int  af 
)
__u8 * netfilter_queue_command_hdr ( __u8 buf,
int  queue_num,
int  type,
int *  len 
)
int netfilter_queue_config_command ( int  nlfd,
int  queue_num,
int  cmd,
int  af 
)
int netfilter_queue_config_param ( int  nlfd,
int  queue_num 
)
int netfilter_queue_init ( int  queue_num)
int netfilter_queue_sendmsg ( int  nlfd,
__u8 data,
int  len 
)
int netfilter_queue_set_verdict ( int  nlfd,
int  queue_num,
__u32  id,
__u32  verdict,
int  data_len,
__u8 data 
)
int netfilter_queue_unbind ( int  nlfd,
int  n,
int  af 
)
unsigned char * new_header ( int  family,
unsigned char *  payload 
)
void rewrite_addrs ( __u8 payload,
struct sockaddr *  src,
struct sockaddr *  dst 
)
void send_updates ( struct sockaddr *  out)

Variable Documentation

struct if_data external_interfaces[MAX_EIFACES] [static]
hip_mr_client hip_mr_client_table[MAX_MR_CLIENTS] [static]
int max_hip_mr_clients [static]
int neifs = 0 [static]