# 1 "/Users/jgurney/work/hcs12/src/sereth/contrib/udp.c" # 1 "" # 1 "" # 1 "/Users/jgurney/work/hcs12/src/sereth/contrib/udp.c" # 77 "/Users/jgurney/work/hcs12/src/sereth/contrib/udp.c" # 1 "/Users/jgurney/work/hcs12/src/sereth/contrib/datatypes.h" 1 # 39 "/Users/jgurney/work/hcs12/src/sereth/contrib/datatypes.h" # 48 "/Users/jgurney/work/hcs12/src/sereth/contrib/datatypes.h" typedef unsigned char tU08; typedef unsigned int tU16; typedef unsigned long tU32; typedef signed char tS08; typedef int tS16; typedef long int tS32; # 65 "/Users/jgurney/work/hcs12/src/sereth/contrib/datatypes.h" typedef union uREG08 { tU08 Byte; struct { tU08 _0 :1; tU08 _1 :1; tU08 _2 :1; tU08 _3 :1; tU08 _4 :1; tU08 _5 :1; tU08 _6 :1; tU08 _7 :1; }bit; }tREG08; typedef union uREG16 { tU16 Word; struct { tREG08 msb; tREG08 lsb; }Byte; }tREG16; # 107 "/Users/jgurney/work/hcs12/src/sereth/contrib/datatypes.h" typedef unsigned long uint32; typedef signed long int32; # 130 "/Users/jgurney/work/hcs12/src/sereth/contrib/datatypes.h" typedef unsigned char uint8; typedef unsigned short uint16; typedef signed char int8; typedef signed short int16; # 78 "/Users/jgurney/work/hcs12/src/sereth/contrib/udp.c" 2 # 1 "/Users/jgurney/work/hcs12/src/sereth/contrib/ethernet.h" 1 # 36 "/Users/jgurney/work/hcs12/src/sereth/contrib/ethernet.h" struct ethernet_frame { tU08 destination[6]; tU08 source[6]; tU16 frame_size; tU16 protocol; tU16 buf_index; }; # 79 "/Users/jgurney/work/hcs12/src/sereth/contrib/udp.c" 2 # 1 "/Users/jgurney/work/hcs12/src/sereth/contrib/debug.h" 1 # 76 "/Users/jgurney/work/hcs12/src/sereth/contrib/debug.h" # 1 "/Users/jgurney/work/hcs12/src/sereth/contrib/system.h" 1 # 1 "/Users/jgurney/work/hcs12/src/sereth/contrib/ne64api.h" 1 # 22 "/Users/jgurney/work/hcs12/src/sereth/contrib/ne64api.h" typedef struct TEthernetFrame { tU08 destination[6]; tU08 source[6]; tU16 frame_size; tU16 protocol; tU16 buf_index; } TEthernetFrame; # 59 "/Users/jgurney/work/hcs12/src/sereth/contrib/ne64api.h" extern void NE64WriteByte (tU08 dat); extern void NE64WriteWord (tU16 dat); # 77 "/Users/jgurney/work/hcs12/src/sereth/contrib/ne64api.h" extern void NE64WriteBytes (tU08* buf, tU16 len); # 92 "/Users/jgurney/work/hcs12/src/sereth/contrib/ne64api.h" extern tU08 NE64ReadByte (void); extern tU16 NE64ReadWord (void); # 114 "/Users/jgurney/work/hcs12/src/sereth/contrib/ne64api.h" extern void NE64ReadBytes (tU08* buf, tU16 len); # 132 "/Users/jgurney/work/hcs12/src/sereth/contrib/ne64api.h" extern void NE64InitializeTransmissionBuffer (tU08 page); # 152 "/Users/jgurney/work/hcs12/src/sereth/contrib/ne64api.h" extern void NE64InitializeOffsetToReadRxBuffer (tU16 pos); # 167 "/Users/jgurney/work/hcs12/src/sereth/contrib/ne64api.h" extern void NE64StartFrameTransmission (tU16 len ); # 184 "/Users/jgurney/work/hcs12/src/sereth/contrib/ne64api.h" extern void NE64WriteEthernetHeaderToTxBuffer (struct TEthernetFrame* frame); # 205 "/Users/jgurney/work/hcs12/src/sereth/contrib/ne64api.h" extern tU16 NE64ValidFrameReception (void); # 223 "/Users/jgurney/work/hcs12/src/sereth/contrib/ne64api.h" extern void NE64FreeReceiveBuffer (void); # 235 "/Users/jgurney/work/hcs12/src/sereth/contrib/ne64api.h" extern void* NE64GetCurrentReceivedFrame (void); # 6 "/Users/jgurney/work/hcs12/src/sereth/contrib/system.h" 2 # 1 "/Users/jgurney/work/hcs12/src/sereth/contrib/ne64config.h" 1 # 8 "/Users/jgurney/work/hcs12/src/sereth/contrib/system.h" 2 # 1 "/Users/jgurney/work/hcs12/src/sereth/contrib/globalvariables.h" 1 # 69 "/Users/jgurney/work/hcs12/src/sereth/contrib/globalvariables.h" # 1 "/Users/jgurney/work/hcs12/src/sereth/contrib/ip.h" 1 # 110 "/Users/jgurney/work/hcs12/src/sereth/contrib/ip.h" struct ip_frame { tU08 vihl; tU08 tos; tU16 tlen; tU16 id; tU16 frags; tU08 ttl; tU08 protocol; tU16 checksum; tU32 sip; tU32 dip; tU08 opt[40 + 1]; tU16 buf_index; }; tS16 process_ip_in(struct ethernet_frame*); tS16 process_ip_out(tU32, tU08, tU08, tU08, tU08*, tU16); tU08 ip_check_cs(struct ip_frame*); tU16 ip_checksum(tU16, tU08, tU08); tU32 ip_checksum_buf (tU16 cs, tU08* buf, tU16 len); tU32 ip_construct_cs(struct ip_frame*); # 70 "/Users/jgurney/work/hcs12/src/sereth/contrib/globalvariables.h" 2 extern tU32 base_timer; extern tU08 net_buf[]; extern struct ethernet_frame received_frame; extern struct ethernet_frame send_frame; extern struct netif localmachine; extern struct ip_frame received_ip_packet; extern struct ip_frame send_ip_packet; extern struct udp_frame received_udp_packet; extern struct tcp_frame received_tcp_packet; # 11 "/Users/jgurney/work/hcs12/src/sereth/contrib/system.h" 2 # 44 "/Users/jgurney/work/hcs12/src/sereth/contrib/system.h" struct netif { # 64 "/Users/jgurney/work/hcs12/src/sereth/contrib/system.h" unsigned long localip; # 73 "/Users/jgurney/work/hcs12/src/sereth/contrib/system.h" unsigned char localHW[6]; unsigned long defgw; # 90 "/Users/jgurney/work/hcs12/src/sereth/contrib/system.h" unsigned long netmask; }; # 300 "/Users/jgurney/work/hcs12/src/sereth/contrib/system.h" extern void kick_WD (void); extern void wait (tS16); extern void enter_power_save (void); extern void exit_power_save (void); extern tS16 __strlen (tU08*, tU16); extern tS16 bufsearch (tU08*, tU16, tU08*); extern tU16 hextoascii (tU08); extern void __itoa (tU16, tU08*); extern void __ltoa (tU32, tU08*); extern tS16 __atoi (tU08*, tU08); extern tU08 asciitohex (tU08); extern tU08 isnumeric (tU08); extern void mputs (tS08*); void mputhex (tU08); extern tU32 random (void); extern void dummy (void); extern tU08 __tolower (tU08); extern tU08 __toupper (tU08); extern void init(void); # 77 "/Users/jgurney/work/hcs12/src/sereth/contrib/debug.h" 2 # 80 "/Users/jgurney/work/hcs12/src/sereth/contrib/udp.c" 2 # 1 "/Users/jgurney/work/hcs12/src/sereth/contrib/tcp_ip.h" 1 # 491 "/Users/jgurney/work/hcs12/src/sereth/contrib/tcp_ip.h" struct udp_frame { tU16 sport; tU16 dport; tU16 tlen; tU16 checksum; tU16 buf_index; }; # 509 "/Users/jgurney/work/hcs12/src/sereth/contrib/tcp_ip.h" struct ucb { # 519 "/Users/jgurney/work/hcs12/src/sereth/contrib/tcp_ip.h" tU08 state; tU08 tos; tU16 locport; # 542 "/Users/jgurney/work/hcs12/src/sereth/contrib/tcp_ip.h" tU08 opts; tS32 (*event_listener) (tS08, tU08, tU32, tU16, tU16, tU16 ); }; # 567 "/Users/jgurney/work/hcs12/src/sereth/contrib/tcp_ip.h" struct tcp_frame { tU16 sport; tU16 dport; tU32 seqno; tU32 ackno; tU16 hlen_flags; tU16 window; tU16 checksum; tU16 urgent; tU08 opt[40 + 1]; tU16 buf_index; }; # 592 "/Users/jgurney/work/hcs12/src/sereth/contrib/tcp_ip.h" struct tcb { # 612 "/Users/jgurney/work/hcs12/src/sereth/contrib/tcp_ip.h" tU08 state; # 624 "/Users/jgurney/work/hcs12/src/sereth/contrib/tcp_ip.h" tU08 type; tU08 flags; tU32 rem_ip; tU16 remport; tU16 locport; tU32 send_unacked; tU08 myflags; tU32 send_next; tU16 send_mtu; tU16 tout; tU08 tos; tU32 receive_next; tU08 persist_timerh; tU08 retransmit_timerh; tU08 retries_left; # 647 "/Users/jgurney/work/hcs12/src/sereth/contrib/tcp_ip.h" tS32 (*event_listener)(tS08, tU08, tU32, tU32); }; tS16 process_icmp_in(struct ip_frame*, tU16); tS08 udp_init (void); tS08 udp_getsocket (tU08 , tS32 (* )(tS08, tU08, tU32, tU16, tU16, tU16), tU08 ); tS08 udp_releasesocket (tS08 ); tS08 udp_open (tS08 , tU16 ); tS08 udp_close (tS08 ); tS16 udp_send (tS08 , tU32 , tU16 , tU08* , tU16 , tU16 ); tS16 process_udp_in(struct ip_frame* , tU16 ); tU16 udp_getfreeport(void); tS16 process_tcp_in(struct ip_frame*, tU16); tS16 process_tcp_out(tS08, tU08*, tU16, tU16); tS08 tcp_init(void); tS08 tcp_listen(tS08, tU16); tS08 tcp_mapsocket(struct ip_frame*, struct tcp_frame*); tU08 tcp_check_cs(struct ip_frame*, tU16); void tcp_sendcontrol(tS08); tU32 tcp_initseq(void); void tcp_poll(void); void tcp_newstate(struct tcb*, tU08); tS08 tcp_getsocket(tU08, tU08, tU16, tS32 (*)(tS08, tU08, tU32, tU32) ); tS08 tcp_releasesocket(tS08); tS08 tcp_connect (tS08 sochandle, tU32 ip, tU16 rport, tU16 myport ); tS16 tcp_send(tS08, tU08*, tU16, tU16); tS08 tcp_close(tS08); void tcp_sendreset(struct tcp_frame*, tU32); tS08 tcp_getstate(tS08); tU16 tcp_getfreeport(void); tS16 tcp_checksend(tS08); tS08 tcp_abort(tS08); # 82 "/Users/jgurney/work/hcs12/src/sereth/contrib/udp.c" 2 # 94 "/Users/jgurney/work/hcs12/src/sereth/contrib/udp.c" struct ucb udp_socket[8]; struct udp_frame received_udp_packet; # 122 "/Users/jgurney/work/hcs12/src/sereth/contrib/udp.c" tS08 udp_init (void) { tU08 i; struct ucb* soc; ; {};; for(i=0; i < 8; i++) { soc = &udp_socket[i]; soc->state = 1; soc->tos = 0; soc->locport = 0; soc->opts = 1 | 2; soc->event_listener = 0; ; {};; } ; {};; return(i+1); } # 173 "/Users/jgurney/work/hcs12/src/sereth/contrib/udp.c" tS08 udp_getsocket (tU08 tos, tS32 (*listener)(tS08, tU08, tU32, tU16, tU16, tU16), tU08 opts ) { tS08 i; struct ucb* soc; if(listener == 0) { ; {};; return(-1); } ; {};; for(i=0; i < 8; i++) { soc = &udp_socket[i]; if(soc->state == 1) { ; {};; soc->state = 2; soc->tos = tos; soc->locport = 0; soc->opts = 0; if(opts & 1) soc->opts |= 1; if(opts & 2) soc->opts |= 2; soc->event_listener = listener; return(i); } } ; {};; return(-1); } # 235 "/Users/jgurney/work/hcs12/src/sereth/contrib/udp.c" tS08 udp_releasesocket (tS08 sochandle) { struct ucb* soc; if( sochandle > 8 ) { ; {};; return(-1); } if( sochandle < 0 ) { ; {};; return(-1); } soc = &udp_socket[sochandle]; soc->state = 1; soc->tos = 0; soc->locport = 0; soc->opts = 1 | 2; soc->event_listener = 0; return(sochandle); } # 276 "/Users/jgurney/work/hcs12/src/sereth/contrib/udp.c" tS08 udp_open (tS08 sochandle, tU16 locport) { struct ucb* soc; if( sochandle > 8 ) { ; {};; return(-1); } if( sochandle < 0 ) { ; {};; return(-1); } if(locport == 0) { locport=udp_getfreeport(); return(-1); } soc = &udp_socket[sochandle]; soc->state = 3; soc->locport = locport; return(sochandle); } # 319 "/Users/jgurney/work/hcs12/src/sereth/contrib/udp.c" tS08 udp_close (tS08 sochandle) { struct ucb* soc; if( sochandle > 8 ) { ; {};; return(-1); } if( sochandle < 0 ) { ; {};; return(-1); } soc = &udp_socket[sochandle]; soc->state = 2; return(sochandle); } # 368 "/Users/jgurney/work/hcs12/src/sereth/contrib/udp.c" tS16 udp_send (tS08 sochandle, tU32 remip, tU16 remport, tU08* buf, tU16 blen, tU16 dlen) { struct ucb* soc; tU08* user_buf_start; tU16 cs; tU08 cs_cnt; tS16 i; if( sochandle > 8 ) { ; {};; return(-1); } if( sochandle < 0 ) { ; {};; return(-1); } if(remip == 0) { ; {};; return(-1); } if(remport == 0) { ; {};; return(-1); } if( dlen > blen ) dlen = blen; if( (dlen + 8) > 1500 - 14 - 8 - 20 + 40) dlen = 1500 - 14 - 8 - 20 + 40 - 8; soc = &udp_socket[sochandle]; if(soc->state != 3 ) { ; {};; return(-3); } if(soc->locport == 0) { ; {};; return(-1); } user_buf_start = buf; buf -= 8; *buf++ = (tU08)(soc->locport >> 8); *buf++ = (tU08)soc->locport; *buf++ = (tU08)(remport >> 8); *buf++ = (tU08)remport; *buf++ = (tU08)((dlen + 8) >> 8); *buf++ = (tU08)(dlen + 8); *buf++ = 0; *buf = 0; buf = user_buf_start; buf -= 8; cs = 0; if( soc->opts & 1) { cs = 0; cs_cnt = 0; cs = ip_checksum(cs, (tU08)(localmachine.localip >> 24), cs_cnt++); cs = ip_checksum(cs, (tU08)(localmachine.localip >> 16), cs_cnt++); cs = ip_checksum(cs, (tU08)(localmachine.localip >> 8), cs_cnt++); cs = ip_checksum(cs, (tU08)localmachine.localip, cs_cnt++); cs = ip_checksum(cs, (tU08)(remip >> 24), cs_cnt++); cs = ip_checksum(cs, (tU08)(remip >> 16), cs_cnt++); cs = ip_checksum(cs, (tU08)(remip >> 8), cs_cnt++); cs = ip_checksum(cs, (tU08)remip, cs_cnt++); cs = ip_checksum(cs, 0, cs_cnt++); cs = ip_checksum(cs, (tU08)17, cs_cnt++); cs = ip_checksum(cs, (tU08)((dlen + 8) >> 8), cs_cnt++); cs = ip_checksum(cs, (tU08)(dlen + 8), cs_cnt++); buf = user_buf_start; buf -= 8; cs = (tU16)(ip_checksum_buf(cs, buf, dlen + 8)); cs = ~ cs; if(cs == 0) cs = 0xFFFF; buf = user_buf_start; buf -= 8; buf += 6; *buf++ = (tU08)(cs >> 8); *buf = (tU08)cs; buf = user_buf_start; buf -= 8; } ; {};; i = process_ip_out(remip, 17, soc->tos, 100, buf, dlen + 8); if( i < 0 ) return(i); ; {};; return(i - 8); } # 517 "/Users/jgurney/work/hcs12/src/sereth/contrib/udp.c" tS16 process_udp_in(struct ip_frame* frame, tU16 len) { struct ucb* soc; tU16 checksum; tU16 i; tS08 sochandle; ; {};; if( frame->protocol != 17 ) { ; {};; return(-1); } NE64InitializeOffsetToReadRxBuffer(frame->buf_index); received_udp_packet.sport = NE64ReadWord(); received_udp_packet.dport = NE64ReadWord(); received_udp_packet.tlen = NE64ReadWord(); received_udp_packet.checksum = NE64ReadWord(); if(received_udp_packet.tlen < 8 ) { ; {};; return(-1); } sochandle = -1; for( i=0; i < 8; i++) { soc = &udp_socket[i]; if(soc->state != 3 ) continue; if(soc->locport != received_udp_packet.dport) continue; sochandle = i; break; } if( sochandle < 0 ) { ; {};; return(-1); } if(soc->opts & 2) { if(received_udp_packet.checksum != 0) { checksum = 0; i = 0; # 590 "/Users/jgurney/work/hcs12/src/sereth/contrib/udp.c" checksum = ip_checksum(checksum, (tU08)(frame->dip >> 24), (tU08)i++); checksum = ip_checksum(checksum, (tU08)(frame->dip >> 16), (tU08)i++); checksum = ip_checksum(checksum, (tU08)(frame->dip >> 8), (tU08)i++); checksum = ip_checksum(checksum, (tU08)frame->dip, (tU08)i++); checksum = ip_checksum(checksum, (tU08)(frame->sip >> 24), (tU08)i++); checksum = ip_checksum(checksum, (tU08)(frame->sip >> 16), (tU08)i++); checksum = ip_checksum(checksum, (tU08)(frame->sip >> 8), (tU08)i++); checksum = ip_checksum(checksum, (tU08)frame->sip, (tU08)i++); checksum = ip_checksum(checksum, 0, (tU08)i++); checksum = ip_checksum(checksum, (tU08)17, (tU08)i++); checksum = ip_checksum(checksum, (tU08)(len >> 8), (tU08)i++); checksum = ip_checksum(checksum, (tU08)len, (tU08)i++); NE64InitializeOffsetToReadRxBuffer(frame->buf_index); for(i=0; i < len; i++) checksum = ip_checksum(checksum, NE64ReadByte(), (tU08)i); checksum = ~ checksum; if(checksum != 0) { ; {};; return (-1); } } ; {};; } received_udp_packet.buf_index = frame->buf_index + 8; NE64InitializeOffsetToReadRxBuffer(received_udp_packet.buf_index); soc->event_listener(sochandle, 64, frame->sip, received_udp_packet.sport, received_udp_packet.buf_index, received_udp_packet.tlen - 8); return(1); } # 649 "/Users/jgurney/work/hcs12/src/sereth/contrib/udp.c" tU16 udp_getfreeport (void){ struct ucb* soc; static tU16 lastport = 1; tU16 start; tU16 i; for( start = lastport++; start != lastport; lastport++) { if(lastport == 1023) lastport = 1; for(i = 0; i < 8; i++) { soc = &udp_socket[i]; if( (soc->state > 2) && (soc->locport == lastport) ) { break; } } if( i == 8) break; } if(lastport == start) { ; {};; return(0); } return(lastport); }