00001 #ifndef __PACKET_H__
00002 #define __PACKET_H__
00003
00004 #include "bswap.h"
00005
00006 #include <kos/net.h>
00007
00008
00009 extern unsigned char broadcast[6];
00010 extern uint8 eth_mac[6];
00011 extern uint32 our_ip;
00012 extern net_input_func lwip_cb;
00013
00014 extern netif_t * netif;
00015
00016 static int net_tx(const uint8 *data, int len, int mode)
00017 {
00018 if (netif) {
00019 int res;
00020
00021 res = netif->if_tx(netif, data, len, mode);
00022
00023 return res;
00024 } else
00025 return 0;
00026 }
00027
00028 #define packed __attribute__((packed))
00029
00030 typedef struct {
00031 unsigned char dest[6] packed;
00032 unsigned char src[6] packed;
00033 unsigned char type[2] packed;
00034 } ether_header_t;
00035
00036 typedef struct {
00037 unsigned char version_ihl packed;
00038 unsigned char tos packed;
00039 unsigned short length packed;
00040 unsigned short packet_id packed;
00041 unsigned short flags_frag_offset packed;
00042 unsigned char ttl packed;
00043 unsigned char protocol packed;
00044 unsigned short checksum packed;
00045 unsigned int src packed;
00046 unsigned int dest packed;
00047 } ip_header_t;
00048
00049 typedef struct {
00050 unsigned short src packed;
00051 unsigned short dest packed;
00052 unsigned short length packed;
00053 unsigned short checksum packed;
00054 unsigned char data[1] packed;
00055 } udp_header_t;
00056
00057 typedef struct {
00058 unsigned char type packed;
00059 unsigned char code packed;
00060 unsigned short checksum packed;
00061 unsigned int misc packed;
00062 } icmp_header_t;
00063
00064 typedef struct {
00065 unsigned short hw_addr_space packed;
00066 unsigned short proto_addr_space packed;
00067 unsigned char hw_addr_len packed;
00068 unsigned char proto_addr_len packed;
00069 unsigned short opcode packed;
00070 unsigned char hw_sender[6] packed;
00071 unsigned char proto_sender[4] packed;
00072 unsigned char hw_target[6] packed;
00073 unsigned char proto_target[4] packed;
00074 } arp_header_t;
00075
00076 typedef struct {
00077 unsigned int src_ip packed;
00078 unsigned int dest_ip packed;
00079 unsigned char zero packed;
00080 unsigned char protocol packed;
00081 unsigned short udp_length packed;
00082 unsigned short src_port packed;
00083 unsigned short dest_port packed;
00084 unsigned short length packed;
00085 unsigned short checksum packed;
00086 unsigned char data[1] packed;
00087 } ip_udp_pseudo_header_t;
00088
00089 unsigned short checksum(unsigned short *buf, int count);
00090 void make_ether(char *dest, char *src, ether_header_t *ether);
00091 void make_ip(int dest, int src, int length, char protocol, ip_header_t *ip);
00092 void make_udp(unsigned short dest, unsigned short src, unsigned char * data, int length, ip_header_t *ip, udp_header_t *udp);
00093
00094 #define ntohl bswap32
00095 #define htonl bswap32
00096 #define ntohs bswap16
00097 #define htons bswap16
00098
00099 #define ETHER_H_LEN 14
00100 #define IP_H_LEN 20
00101 #define UDP_H_LEN 8
00102 #define ICMP_H_LEN 8
00103 #define ARP_H_LEN 28
00104
00105
00106 int eth_txts(uint8 *pkt, int len);
00107
00108 #endif