New function to get BIO method.
FossilOrigin-Name: c1bd435aaa298fa22bb42cc955e1e46d409eeb4a30e96b4ccb01fd112b16fca6
This commit is contained in:
		@ -5,93 +5,114 @@
 | 
			
		||||
#include "conn.h"
 | 
			
		||||
#include "cw_log.h"
 | 
			
		||||
 | 
			
		||||
int dtls_openssl_bio_write(BIO *b, const char *data, int len)
 | 
			
		||||
 | 
			
		||||
BIO_METHOD *dtls_openssl_bio_method()
 | 
			
		||||
{
 | 
			
		||||
	static BIO_METHOD bio_methods;
 | 
			
		||||
 | 
			
		||||
	bio_methods.type = BIO_TYPE_DGRAM;
 | 
			
		||||
	bio_methods.name = "CW packet";
 | 
			
		||||
	bio_methods.bwrite = dtls_openssl_bio_write;
 | 
			
		||||
	bio_methods.bread = dtls_openssl_bio_read;
 | 
			
		||||
	bio_methods.bputs = dtls_openssl_bio_puts;
 | 
			
		||||
	bio_methods.bgets = 0;
 | 
			
		||||
	bio_methods.ctrl = dtls_openssl_bio_ctrl;
 | 
			
		||||
	bio_methods.create = dtls_openssl_bio_new;
 | 
			
		||||
	bio_methods.destroy = dtls_openssl_bio_free;
 | 
			
		||||
	bio_methods.callback_ctrl = 0;
 | 
			
		||||
 | 
			
		||||
	return &bio_methods;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int dtls_openssl_bio_write(BIO * b, const char *data, int len)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	struct conn * conn = b->ptr;
 | 
			
		||||
	struct conn *conn = b->ptr;
 | 
			
		||||
	uint8_t buffer[2048];
 | 
			
		||||
	*((uint32_t*)buffer)=htonl(1<<24);
 | 
			
		||||
	memcpy(buffer+4,data,len);
 | 
			
		||||
	int rc = conn->send_packet(conn,buffer,len+4);
 | 
			
		||||
	*((uint32_t *) buffer) = htonl(1 << 24);
 | 
			
		||||
	memcpy(buffer + 4, data, len);
 | 
			
		||||
	int rc = conn->send_packet(conn, buffer, len + 4);
 | 
			
		||||
 | 
			
		||||
	cw_dbg(DBG_DTLS_BIO,"SSL BIO write: %d bytes, rc=%d, ptr: %p",len, rc, data);
 | 
			
		||||
 | 
			
		||||
	if (rc<0)
 | 
			
		||||
	cw_dbg(DBG_DTLS_BIO, "SSL BIO write: %d bytes, rc=%d, ptr: %p", len, rc, data);
 | 
			
		||||
 | 
			
		||||
	if (rc < 0)
 | 
			
		||||
		return rc;
 | 
			
		||||
	return rc-4;
 | 
			
		||||
	return rc - 4;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int dtls_openssl_bio_read(BIO *b, char *out, int maxlen)
 | 
			
		||||
int dtls_openssl_bio_read(BIO * b, char *out, int maxlen)
 | 
			
		||||
{
 | 
			
		||||
	struct conn * conn = b->ptr;
 | 
			
		||||
	struct dtls_openssl_data * dtls_data = conn->dtls_data;
 | 
			
		||||
	if (dtls_data->len==0){
 | 
			
		||||
		int len  = conn->recv_packet(conn,dtls_data->buffer,2048);
 | 
			
		||||
	cw_dbg(DBG_DTLS_BIO, "SSL BIO read: (maxlen = %d)", maxlen);
 | 
			
		||||
 | 
			
		||||
	struct conn *conn = b->ptr;
 | 
			
		||||
	struct dtls_openssl_data *dtls_data = conn->dtls_data;
 | 
			
		||||
	if (dtls_data->len == 0) {
 | 
			
		||||
		int len = conn->recv_packet(conn, dtls_data->buffer, 2048);
 | 
			
		||||
/*		if (len == -1){
 | 
			
		||||
			printf ("-1 ERRRRRRRRRRRRRRRRR %s\n",strerror(errno));
 | 
			
		||||
		}
 | 
			
		||||
*/
 | 
			
		||||
		if (len<4)
 | 
			
		||||
		if (len < 4)
 | 
			
		||||
			return 0;
 | 
			
		||||
		dtls_data->len=len-4;
 | 
			
		||||
		dtls_data->pos=4;
 | 
			
		||||
		dtls_data->len = len - 4;
 | 
			
		||||
		dtls_data->pos = 4;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (dtls_data->len > maxlen)
 | 
			
		||||
	{
 | 
			
		||||
		memcpy(out,dtls_data->buffer+dtls_data->pos,maxlen);
 | 
			
		||||
		dtls_data->len-=maxlen;
 | 
			
		||||
		dtls_data->pos+=maxlen;
 | 
			
		||||
	if (dtls_data->len > maxlen) {
 | 
			
		||||
		memcpy(out, dtls_data->buffer + dtls_data->pos, maxlen);
 | 
			
		||||
		dtls_data->len -= maxlen;
 | 
			
		||||
		dtls_data->pos += maxlen;
 | 
			
		||||
		return maxlen;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	memcpy(out,dtls_data->buffer+dtls_data->pos,dtls_data->len);
 | 
			
		||||
	memcpy(out, dtls_data->buffer + dtls_data->pos, dtls_data->len);
 | 
			
		||||
	int ret = dtls_data->len;
 | 
			
		||||
	dtls_data->len=0;
 | 
			
		||||
	dtls_data->len = 0;
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int dtls_openssl_bio_new(BIO *bi)
 | 
			
		||||
int dtls_openssl_bio_new(BIO * bi)
 | 
			
		||||
{
 | 
			
		||||
	bi->init = 1;
 | 
			
		||||
	bi->num = 0;
 | 
			
		||||
	bi->flags = 0;
 | 
			
		||||
	bi->ptr = NULL; 
 | 
			
		||||
	bi->ptr = NULL;
 | 
			
		||||
	cw_dbg(DBG_DTLS_BIO, "SSL BIO new");
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int dtls_openssl_bio_puts(BIO *b, const char *str)
 | 
			
		||||
int dtls_openssl_bio_puts(BIO * b, const char *str)
 | 
			
		||||
{
 | 
			
		||||
//	printf("Bio puts: %s\n",str);
 | 
			
		||||
	cw_dbg(DBG_DTLS_BIO, "SSL BIO puts: '%s'", str);
 | 
			
		||||
	return dtls_openssl_bio_write(b, str, strlen(str));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int dtls_openssl_bio_free(BIO *bio)
 | 
			
		||||
int dtls_openssl_bio_free(BIO * bio)
 | 
			
		||||
{
 | 
			
		||||
	if (bio == NULL) 
 | 
			
		||||
	if (bio == NULL)
 | 
			
		||||
		return 0;
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
long dtls_openssl_bio_ctrl(BIO *b, int cmd, long num, void *ptr)
 | 
			
		||||
long dtls_openssl_bio_ctrl(BIO * b, int cmd, long num, void *ptr)
 | 
			
		||||
{
 | 
			
		||||
	long ret = 1;
 | 
			
		||||
//	long sockopt_val = 0;
 | 
			
		||||
//	unsigned int sockopt_len = 0;
 | 
			
		||||
//	BIO_memory_data* pData = (BIO_memory_data*)b->ptr;
 | 
			
		||||
//      long sockopt_val = 0;
 | 
			
		||||
//      unsigned int sockopt_len = 0;
 | 
			
		||||
//      BIO_memory_data* pData = (BIO_memory_data*)b->ptr;
 | 
			
		||||
//
 | 
			
		||||
//	printf("BIO CONTROL cmd=%d,num=%d\n",cmd,num);
 | 
			
		||||
//	exit(1);	
 | 
			
		||||
//      printf("BIO CONTROL cmd=%d,num=%d\n",cmd,num);
 | 
			
		||||
//      exit(1);        
 | 
			
		||||
 | 
			
		||||
	switch (cmd)
 | 
			
		||||
	{
 | 
			
		||||
	switch (cmd) {
 | 
			
		||||
		case BIO_CTRL_RESET:
 | 
			
		||||
		case BIO_CTRL_EOF:
 | 
			
		||||
			ret = 0;
 | 
			
		||||
@ -111,7 +132,7 @@ long dtls_openssl_bio_ctrl(BIO *b, int cmd, long num, void *ptr)
 | 
			
		||||
		case BIO_CTRL_WPENDING:
 | 
			
		||||
			ret = 0;
 | 
			
		||||
			break;
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
		case BIO_CTRL_PENDING:
 | 
			
		||||
			ret = 0;
 | 
			
		||||
			break;
 | 
			
		||||
@ -132,9 +153,9 @@ long dtls_openssl_bio_ctrl(BIO *b, int cmd, long num, void *ptr)
 | 
			
		||||
			ret = 0;
 | 
			
		||||
 | 
			
		||||
		case BIO_CTRL_DGRAM_QUERY_MTU:
 | 
			
		||||
		{
 | 
			
		||||
			ret = 1400;
 | 
			
		||||
			break;
 | 
			
		||||
			{
 | 
			
		||||
				ret = 1400;
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
/*         	sockopt_len = sizeof(sockopt_val);
 | 
			
		||||
			if ((ret = getsockopt(pData->sock, IPPROTO_IP, IP_MTU, (void *)&sockopt_val, &sockopt_len)) < 0 || sockopt_val < 0)
 | 
			
		||||
@ -149,16 +170,16 @@ long dtls_openssl_bio_ctrl(BIO *b, int cmd, long num, void *ptr)
 | 
			
		||||
 | 
			
		||||
			break;	
 | 
			
		||||
 | 
			
		||||
*/		}
 | 
			
		||||
*/ }
 | 
			
		||||
 | 
			
		||||
		case BIO_CTRL_DGRAM_GET_MTU:
 | 
			
		||||
			ret = 1500;
 | 
			
		||||
//			ret = pData->nMtu;
 | 
			
		||||
//                      ret = pData->nMtu;
 | 
			
		||||
			break;
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
		case BIO_CTRL_DGRAM_SET_MTU:
 | 
			
		||||
//			pData->nMtu = num;
 | 
			
		||||
//			ret = num;
 | 
			
		||||
//                      pData->nMtu = num;
 | 
			
		||||
//                      ret = num;
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
@ -168,5 +189,3 @@ long dtls_openssl_bio_ctrl(BIO *b, int cmd, long num, void *ptr)
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user