From fdbe2eab1e602d95bfbcf21ebadc072d95de2781 Mon Sep 17 00:00:00 2001 From: skarg Date: Fri, 12 Aug 2005 21:22:50 +0000 Subject: [PATCH] fixing the RTOS-32 port for BACnet/IP. --- bacnet-stack/bip.c | 6 + bacnet-stack/ports/rtos32/bip-init.c | 277 ------------------------- bacnet-stack/ports/rtos32/main.c | 14 ++ bacnet-stack/ports/rtos32/makefile.mak | 2 + bacnet-stack/ports/win32/bacnet.ide | Bin 50668 -> 50668 bytes 5 files changed, 22 insertions(+), 277 deletions(-) diff --git a/bacnet-stack/bip.c b/bacnet-stack/bip.c index 6cd3b70f..465c5954 100644 --- a/bacnet-stack/bip.c +++ b/bacnet-stack/bip.c @@ -96,6 +96,12 @@ void bip_set_addr(struct in_addr *net_address) BIP_Address.s_addr = htonl(net_address->s_addr); } +// Win32 shortcut +unsigned long bip_get_addr(void) +{ + return BIP_Address.s_addr; +} + void bip_set_broadcast_address( uint8_t octet1, uint8_t octet2, diff --git a/bacnet-stack/ports/rtos32/bip-init.c b/bacnet-stack/ports/rtos32/bip-init.c index a36d492b..5d85fdc2 100644 --- a/bacnet-stack/ports/rtos32/bip-init.c +++ b/bacnet-stack/ports/rtos32/bip-init.c @@ -34,87 +34,14 @@ #include // for standard integer types uint8_t etc. #include // for the standard bool type. -#include "net.h" // local port of the stack network includes -#include "bacdcode.h" #include "bip.h" -static int BIP_Socket = -1; -/* port to use - stored in network byte order */ -static uint16_t BIP_Port = 0; -/* IP Address - stored in network byte order */ -static struct in_addr BIP_Address; -/* Broadcast Address */ -static struct in_addr BIP_Broadcast_Address; -/* Subnet Mask */ -static struct in_addr BIP_Subnet_Mask; - -bool bip_valid(void) -{ - return (BIP_Socket != -1); -} - -void bip_cleanup(void) -{ - if (bip_valid()) - close(BIP_Socket); - BIP_Socket = -1; - - return; -} - -static void set_network_address(struct in_addr *net_address, - uint8_t octet1, uint8_t octet2, uint8_t octet3, uint8_t octet4) -{ - union { - uint8_t byte[4]; - uint32_t value; - } long_data = {{0}}; - - long_data.byte[0] = octet1; - long_data.byte[1] = octet2; - long_data.byte[2] = octet3; - long_data.byte[3] = octet4; - - net_address->s_addr = htonl(long_data.value); -} - -void bip_set_address(uint8_t octet1, uint8_t octet2, - uint8_t octet3, uint8_t octet4) -{ - set_network_address(&BIP_Address, octet1, octet2, octet3, octet4); -} - -void bip_set_broadcast_address(uint8_t octet1, uint8_t octet2, - uint8_t octet3, uint8_t octet4) -{ - set_network_address(&BIP_Broadcast_Address, - octet1, octet2, octet3, octet4); -} - -void bip_set_subnet_mask(uint8_t octet1, uint8_t octet2, - uint8_t octet3, uint8_t octet4) -{ - set_network_address(&BIP_Subnet_Mask, - octet1, octet2, octet3, octet4); -} - -void bip_set_port(uint16_t port) -{ - BIP_Port = htons(port); -} - bool bip_init(void) { int rv = 0; // return from socket lib calls struct sockaddr_in sin = {-1}; int value = 1; - /* local broadcast address */ - BIP_Broadcast_Address.s_addr = BIP_Address.s_addr; - BIP_Broadcast_Address.s_addr |= ~(BIP_Subnet_Mask.s_addr); - /* configure standard BACnet/IP port */ - bip_set_port(0xBAC0); - // assumes that the driver has already been initialized BIP_Socket = socket(AF_INET, SOCK_DGRAM, IPROTO_UDP); if (BIP_Socket < 0) @@ -136,207 +63,3 @@ bool bip_init(void) return true; } - -/* function to send a packet out the BACnet/IP socket (Annex J) */ -/* returns number of bytes sent on success, negative number on failure */ -static int bip_send( - struct sockaddr_in *bip_dest, - uint8_t *pdu, // any data to be sent - may be null - unsigned pdu_len) // number of bytes of data -{ - int bytes = 0; - uint8_t mtu[MAX_MPDU] = { 0 }; - int mtu_len = 0; - int i = 0; - - // assumes that the driver has already been initialized - if (BIP_Socket < 0) - return BIP_Socket; - - mtu[0] = 0x81; /* BVLL for BACnet/IP */ - if (bip_dest->sin_addr.s_addr == BIP_Broadcast_Address.s_addr) - mtu[1] = 0x0B; /* Original-Broadcast-NPDU */ - else - mtu[1] = 0x0A; /* Original-Unicast-NPDU */ - mtu_len = 2; - mtu_len += encode_unsigned16(&mtu[mtu_len], pdu_len + 4 /*inclusive*/); - memcpy(&mtu[mtu_len], pdu, pdu_len); - mtu_len += pdu_len; - - /* Send the packet */ - bytes = sendto(BIP_Socket, (char *)mtu, mtu_len, 0, - (struct sockaddr *)bip_dest, - sizeof(struct sockaddr)); - - return bytes; -} - -/* function to send a packet out the BACnet/IP socket (Annex J) */ -/* returns number of bytes sent on success, negative number on failure */ -int bip_send_pdu( - BACNET_ADDRESS *dest, // destination address - uint8_t *pdu, // any data to be sent - may be null - unsigned pdu_len) // number of bytes of data -{ - int i = 0; // counter - struct sockaddr_in bip_dest; - uint32_t network_address = 0; - uint16_t network_port = 0; - - /* load destination IP address */ - bip_dest.sin_family = AF_INET; - if (dest->mac_len == 6) - { - (void)decode_unsigned32(&dest->mac[0], &(bip_dest.sin_addr.s_addr)); - (void)decode_unsigned16(&dest->mac[4], &(bip_dest.sin_port)); - memset(&(bip_dest.sin_zero), '\0', 8); - } - /* broadcast */ - else if (dest->mac_len == 0) - { - bip_dest.sin_addr.s_addr = BIP_Broadcast_Address.s_addr; - bip_dest.sin_port = BIP_Port; - memset(&(bip_dest.sin_zero), '\0', 8); - } - else - return -1; - - /* function to send a packet out the BACnet/IP socket */ - /* returns 1 on success, 0 on failure */ - return bip_send(&bip_dest, // destination address - pdu, // any data to be sent - may be null - pdu_len); // number of bytes of data -} - -// receives a BACnet/IP packet -// returns the number of octets in the PDU, or zero on failure -uint16_t bip_receive( - BACNET_ADDRESS *src, // source address - uint8_t *pdu, // PDU data - uint16_t max_pdu, // amount of space available in the PDU - unsigned timeout) // number of milliseconds to wait for a packet -{ - int received_bytes; - uint8_t buf[MAX_MPDU] = {0}; // data - uint16_t pdu_len = 0; // return value - fd_set read_fds; - int max; - struct timeval select_timeout; - struct sockaddr_in sin = {-1}; - int sin_len = sizeof(sin); - - /* Make sure the socket is open */ - if (BIP_Socket < 0) - return 0; - - /* we could just use a non-blocking socket, but that consumes all - the CPU time. We can use a timeout; it is only supported as - a select. */ - if (timeout >= 1000) - { - select_timeout.tv_sec = timeout / 1000; - select_timeout.tv_usec = - 1000 * (timeout - select_timeout.tv_sec * 1000); - } - else - { - select_timeout.tv_sec = 0; - select_timeout.tv_usec = 1000 * timeout; - } - FD_ZERO(&read_fds); - FD_SET(BIP_Socket, &read_fds); - max = BIP_Socket; - /* see if there is a packet for us */ - if (select(max + 1, &read_fds, NULL, NULL, &select_timeout) > 0) - received_bytes = recvfrom(BIP_Socket, - (char *)&buf[0], MAX_MPDU, 0, - (struct sockaddr *)&sin, &sin_len); - else - return 0; - - /* See if there is a problem */ - if (received_bytes < 0) { - return 0; - } - - /* no problem, just no bytes */ - if (received_bytes == 0) - return 0; - - /* the signature of a BACnet/IP packet */ - if (buf[0] != 0x81) - return 0; - /* Original-Broadcast-NPDU or Original-Unicast-NPDU */ - if ((buf[1] == 0x0B) || (buf[1] == 0x0A)) - { - if (sin.sin_addr.s_addr == BIP_Address.s_addr) - pdu_len = 0; - else - { - // copy the source address - src->mac_len = 6; - (void)encode_unsigned32(&src->mac[0], - sin.sin_addr.s_addr); - (void)encode_unsigned16(&src->mac[4], - sin.sin_port); - // FIXME: check destination address - // see if it is broadcast or for us - /* decode the length of the PDU - length is inclusive of BVLC */ - (void)decode_unsigned16(&buf[2],&pdu_len); - /* copy the buffer into the PDU */ - pdu_len -= 4; /* BVLC header */ - if (pdu_len < max_pdu) - memmove(&pdu[0],&buf[4],pdu_len); - // ignore packets that are too large - // clients should check my max-apdu first - else - pdu_len = 0; - } - } - - return pdu_len; -} - -void bip_get_my_address(BACNET_ADDRESS *my_address) -{ - int i = 0; - - my_address->mac_len = 6; - (void)encode_unsigned32(&my_address->mac[0], - BIP_Address.s_addr); - (void)encode_unsigned16(&my_address->mac[4], - BIP_Port); - my_address->net = 0; /* local only, no routing */ - my_address->len = 0; /* no SLEN */ - for (i = 0; i < MAX_MAC_LEN; i++) - { - /* no SADR */ - my_address->adr[i] = 0; - } - - return; -} - -void bip_get_broadcast_address( - BACNET_ADDRESS *dest) // destination address -{ - int i = 0; // counter - - if (dest) - { - dest->mac_len = 6; - (void)encode_unsigned32(&dest->mac[0], - BIP_Broadcast_Address.s_addr); - (void)encode_unsigned16(&dest->mac[4], - BIP_Port); - dest->net = BACNET_BROADCAST_NETWORK; - dest->len = 0; /* no SLEN */ - for (i = 0; i < MAX_MAC_LEN; i++) - { - /* no SADR */ - dest->adr[i] = 0; - } - } - - return; -} diff --git a/bacnet-stack/ports/rtos32/main.c b/bacnet-stack/ports/rtos32/main.c index 9f7cfef3..bb7b4fde 100644 --- a/bacnet-stack/ports/rtos32/main.c +++ b/bacnet-stack/ports/rtos32/main.c @@ -269,8 +269,22 @@ int main(int argc, char *argv[]) // init the physical layer #ifdef BACDL_BIP NetInitialize(); + bip_set_address(TargetIP[0], TargetIP[1], TargetIP[2], TargetIP[3]); + + // FIXME: + #if 0 bip_set_address(NetMask[0], NetMask[1], NetMask[2], NetMask[3]); +extern unsigned long bip_get_addr(void); + unsigned long broadcast_address = 0; + unsigned long subnet_mask = 0; + + /* local broadcast address */ + broadcast_address = bip_get_addr(); + broadcast_address |= ~(BIP_Subnet_Mask.s_addr); + /* configure standard BACnet/IP port */ + bip_set_port(0xBAC0); + #endif if (!bip_init()) return 1; #endif diff --git a/bacnet-stack/ports/rtos32/makefile.mak b/bacnet-stack/ports/rtos32/makefile.mak index f5ac8906..cce9aa02 100644 --- a/bacnet-stack/ports/rtos32/makefile.mak +++ b/bacnet-stack/ports/rtos32/makefile.mak @@ -38,6 +38,8 @@ SRCS = init.c main.c ethernet.c bip-init.c \ ..\..\iam.c \ ..\..\rp.c \ ..\..\wp.c \ + ..\..\arf.c \ + ..\..\awf.c \ ..\..\device.c \ ..\..\ai.c \ ..\..\ao.c \ diff --git a/bacnet-stack/ports/win32/bacnet.ide b/bacnet-stack/ports/win32/bacnet.ide index 5eda6d06e68579bb200ce9dbf5d0d7c603b9b761..a8d73c866936b65543f6a19d8f267b358e15c80a 100644 GIT binary patch delta 3247 zcmYk84Nz3q7037TKo*KC2v}AjAS-^1lEs4IsZduif)sU^MJ0lWEvbqaKwaD@QDjU& z<@?B&qVlPLi$XUhq(xj?t(pjeKIkT+Gww?|ng%;&CQY15fuI_1dxMvZ>?!+F7(RiaOJ&GrDpL99p@I zI)1XFquGp~JK|VJz|S3V%lxF3XDVH!@cILH%xaD=S2CqcZsDkEx2z{rK%c&a ziBto_Yf~DT(VWu9gx<(1@X{zdeW?Sil)FK8LN>}>gB$g%R4Uh zNt9RDZ@$f}!1P?%D$gjE2W*i?TDHiGWMvjI`m4+mMq9J8Y_1{FDL=&HZ^tJdsQ9&q ziz3g1phu)H{8)AG*1O(a65Ji@NDO4uAb-W+t~QJCGG<| z1%*PXg}jnqg6dF`^lBje(6AJ(3lA@K;gtAFw;x%_?vLe22=~LmFX7(*4Zo69E-**1 z?kcHsrGtxCkAZvXR;p7c@5Am=t8`03%L+*~G?m4xbLa8oC|<0oN_Tn7Wt6Uaw;CW&Wc>vlI3rL6cofDD7 z-yX`7e5bBy*cAn>W97bXY14TUK_^V9P^kw(c#`8p2O(XA#9~S$RjB;^kl5}- z1S8P`yDPN*jln$0cB;(A$_?nR(2`Z)sPJ`rigTjqoEeoWb=Mm_$#kN_koNNB$r4Iz zu2lK|5X6&oCt@BF5%58!)}O~pnp4FKE2(h3QcI4)_m#eGW}L&*IdiL2YWpmnq&U&x zNH-&~loB~rD*ri1tal=`NZ6pFO6y-XlPAeemBm>32F9wiUMVX6n03c(MmVZT*Fgq-;?|BX^nP@ z^pDZqWiVOuu~coV<)!ejHc<+5A&RoPAO~!N6%>GEYT-SCe?hurrJRhCLKzD~C+UP2 zEPJz#*0SrUdA3d`k&l@7I^|V%7Ps!UXb7^2JOUuMIL`z+T4RlYohAb%yZDjkn zk!=T4qfxRxZ`3QL(+HPF6cF09S@I4w(KT#M?9gR+kXKFduTQY%6dhf1Dn^2BEc};+ znA0(@xx=TIQ|&rKgzKj_Q5}LhxS7ow#ko71Bc&l{o9Q`(W_EypHykkS41MytGtA0D z>mai%XDBS5Sw%;7VI}-5g)`5x)t{r)%B=fmDXculPR<8AApIPL%g?dn6{GdVIW3*l zv0Mbw5=r%K^q0#zBUS{Hto>GqaJglxv~BNJI(#(?MJ)WGmCf}IalrSjY;KEAgn4cB zF6?My2TH?odmAgK#fk7`8(X#oecyJby;q5_R@S%Q7NN8~fo|<7GUM&hKGKUTP7oDS z@3<=7R1jqf)U+>v+*3+e*WpD;evJs*I#}29B;0rhTQOp`1O6^+GwNBL%(tO7bkgTj z(#bZe40XU&X8p61{Xa~P){^s-`u%xkHKNsfo(-|!OaA&ieX#)-*pSCqHeO)mmq8*N zll6R!1Fl`5lb*|HK3WUA7}}ML+wY>~+Aj832e3RQm$TN1;NHzp#T*C3$~r(V!rty^ z`ULd9wL`z`j~YaH(#@W2Bl@#@=;)LlHu^DIH9c%xnNfsWJ@gDOd)OJ~|IQB47g<@i zL4@5GX}Rqpy#)4)jLJvK*TSe58%0=Sp=%tlu<`(wugK-TG!edI<-lH6R^TslQ!ne@ zu~~$Q-UR8QP4v<=ye`oY$AbA1>q*2O>m}Bc*mn=Uy~IxVl8l4qGSglQ1=w<#F&URf z0Aw9t8G$>p=8YrpO4dcHN3f)i^$J4*jH#cMejMP-Z!oF8O6_gXvwjzP9c8cvvXmFaym9k4;xiTngq$$Au- zJF=cch8tqM4VhS3Cwh*e5O8EA<~A0h_f2Jo2&0iVt%^cn=3ri@SK4Tu&S& z$rc$uCm4||t%c*|dOc~kEhBtFh@OBwy@gK=MUZ9e;vXWY&1m4Q(~xM+u=CN=5u|5! z@xuZb&$ROvH3ECqMcxpGz_i@Xj|)KaegkiR1wr5Y>3mu^f`Anze2V}qD_VH920={r z0PjTL;6F$ueBBJB(pTQ(ha-?uuQCzdrWNF?_wsuq5d^Gh;MD@Kt+Df|vk>Iw6!8Y- zpNZpsP8s1fuVY?ru9Mg7oueloWBVJ*r4qH|O&>2wz7N5(Ao#FEp~|rSuou22xVK>` zXLtX_5xMa?;jF$c_{WD$DwWp)B9n2buObpzl%$MXNF2?ZHW5y?Lm21w$q?XF~h#W;54?_Bz^!XcK>L<}`8_TtK@T?c97b7v1y?bmkk$S@}^_3qQG5jGm`Ug0=)$Eu5UAQC1?{1&D?pk7tlUMJJ*bR@pnNd z+77f~MMiQF@{6?GFnaaqeFop7rw(v|U$L3XM*DHGk$eu{7HhdW^q!;F2g^#d+yHv! z5+k_;H_(#@;$fn98Q$8i;b#L9iA)FiWiNxG zbSXDy-XN?h{hG7QyX$y$&jK&5uXg}8>`UUi@YR8BpN6yk?;hMn!h&xbRApJ*u&>MU zQCU4t3%@-%4Bq?KQXK6w0-N_cgn5amC?XZmSdkp6!4WIR5%ZII(~nGx_WW!;IgH<7 z7)(8o5t`taNPLmyM1>%G6t5?Lpo*gh6l54qA4m>O$AR4AQ7IPn<5;Od&;|IQC;Unz z&n71)$7jOp2j9bk+jlTIR6bQtDm)USP}YYF?57L-a!}#b;03;iW|HfmI}}AMjt>sS zk{~C3T?HOl{+JaFtri_Agh7i^nvPXtXoV@2iqIDPJU4l$!%$s_ir1)OX{91)96#v| z9*S^OG{ELcUC>^PXNHN*#%YkxHd>80*B*I>A+nP%B;*IUedrRP#zbnNJlf zs}w;G@LpNvp_q+|Ik3A*7o@>Rwns#cku>MMjPEfJs z1Z&TR)K@2Tv=;y6b096T6yHRCk%&zp6JQo`$5+pxr)90M?SNKVd8w<;)O~7B<*s^NmmF*1wta8JwB!FwHYs!R);fOQ=#Yh#ETdOFyOSyqfQUnOxZuhuTIs1MjYI0yE+*AXbHlnW8m{eP$C{4eK`}h`$^>|yW>ORK zi6Xu?-3{AL$I}zgxJRK^Fb+gYx9_YmZZco_N9BCbPzRK(@DR#>la9*&IO z`@Zz#S0_D#*uGeLS!SET)E7sgycACMv7L`&)<_>)Wx$M6c!}Zi(jizb;=-3lpjyPK zMJ~7{;&Ie)mzjPHHHjj2qNZ5Hg?ome_cGgoz8Kt>*|Ikc&mi)On2M6MA~xWL8%3NK mG6Hu*`~b0^lj*xY|2L#K*+D+q_bu#pvhwy>jz2ozkp3TA