1 /*
2     OWFS -- One-Wire filesystem
3     OWHTTPD -- One-Wire Web Server
4     Written 2003 Paul H Alfille
5     email: paul.alfille@gmail.com
6     Released under the GPL
7     See the header file: ow.h for full attribution
8     1wire/iButton system from Dallas Semiconductor
9 */
10 
11 #include <config.h>
12 #include "owfs_config.h"
13 #include "ow.h"
14 #include "ow_counters.h"
15 #include "ow_connection.h"
16 #include "ow_codes.h"
17 
18 /** BUS_send_data
19     Send a data and expect response match
20  */
BUS_send_bits(const BYTE * data,const size_t len,const struct parsedname * pn)21 GOOD_OR_BAD BUS_send_bits(const BYTE * data, const size_t len, const struct parsedname *pn)
22 {
23 	BYTE resp[len];
24 
25 	if (len == 0) {
26 		return gbGOOD;
27 	}
28 
29 	if ( BAD( BUS_sendback_bits(data, resp, len, pn) ) ) {
30 		STAT_ADD1_BUS(e_bus_errors, pn->selected_connection);
31 		return gbBAD ;
32 	}
33 
34 	RETURN_GOOD_IF_GOOD( BUS_compare_bits( data, resp, len ) ) ;
35 
36 	LEVEL_DEBUG("Response doesn't match bits sent");
37 	STAT_ADD1_BUS(e_bus_errors, pn->selected_connection);
38 	return gbBAD ;
39 }
40 
41 // compare bits (just non-zero or zero)
BUS_compare_bits(const BYTE * data1,const BYTE * data2,const size_t len)42 GOOD_OR_BAD BUS_compare_bits(const BYTE * data1, const BYTE * data2, const size_t len)
43 {
44 	size_t i ;
45 
46 	if (len == 0) {
47 		return gbGOOD;
48 	}
49 
50 	for ( i=0 ; i< len ; ++i ) {
51 		if ( (data1[i]==0) != (data2[i]==0) ) {
52 			return gbBAD ;
53 		}
54 	}
55 	return gbGOOD;
56 }
57 
58 /** readin_data
59   Send 0xFFs and return response block
60  */
BUS_readin_bits(BYTE * data,const size_t len,const struct parsedname * pn)61 GOOD_OR_BAD BUS_readin_bits(BYTE * data, const size_t len, const struct parsedname *pn)
62 {
63 	memset(data, 0xFF, (size_t) len) ;
64 	RETURN_GOOD_IF_GOOD( BUS_sendback_bits( data, data, len, pn) ) ;
65 
66 	STAT_ADD1(BUS_readin_data_errors);
67 	return gbBAD;
68 }
69 
BUS_sendback_bits(const BYTE * databits,BYTE * respbits,const size_t len,const struct parsedname * pn)70 GOOD_OR_BAD BUS_sendback_bits( const BYTE * databits, BYTE * respbits, const size_t len, const struct parsedname * pn )
71 {
72 	GOOD_OR_BAD (*sendback_bits) (const BYTE * databits, BYTE * respbits, const size_t len, const struct parsedname * pn) = ((pn)->selected_connection->iroutines.sendback_bits) ;
73 	if ( sendback_bits != NO_SENDBACKBITS_ROUTINE ) {
74 		return (sendback_bits)((databits),(respbits),(len),(pn)) ;
75 	}
76 	return gbBAD ;
77 }
78 
79