int8_t socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag) { CHECK_SOCKNUM(); switch(protocol) { case Sn_MR_TCP : case Sn_MR_UDP : case Sn_MR_MACRAW : break; #if ( _WIZCHIP_ < 5200 ) case Sn_MR_IPRAW : case Sn_MR_PPPoE : break; #endif default : return SOCKERR_SOCKMODE; } if((flag & 0x06) != 0) return SOCKERR_SOCKFLAG; #if _WIZCHIP_ == 5200 if(flag & 0x10) return SOCKERR_SOCKFLAG; #endif if(flag != 0) { switch(protocol) { case Sn_MR_TCP: if((flag & (SF_TCP_NODELAY|SF_IO_NONBLOCK))==0) return SOCKERR_SOCKFLAG; break; case Sn_MR_UDP: if(flag & SF_IGMP_VER2) { if((flag & SF_MULTI_ENABLE)==0) return SOCKERR_SOCKFLAG; } #if _WIZCHIP_ == 5500 if(flag & SF_UNI_BLOCK) { if((flag & SF_MULTI_ENABLE) == 0) return SOCKERR_SOCKFLAG; } #endif break; default: break; } } close(sn); setSn_MR(sn, (protocol | (flag & 0xF0))); if(!port) { port = sock_any_port++; if(sock_any_port == 0xFFF0) sock_any_port = SOCK_ANY_PORT_NUM; } setSn_PORT(sn,port); setSn_CR(sn,Sn_CR_OPEN); while(getSn_CR(sn)); //mgg1010 line below added - without it, if a socket is re-used, it may inherit the previous // value of NONBLOCK sock_io_mode &= ~(1 << sn); sock_io_mode |= ((flag & SF_IO_NONBLOCK) << sn); sock_is_sending &= ~(1<<sn); sock_remained_size[sn] = 0; sock_pack_info[sn] = 0; while(getSn_SR(sn) == SOCK_CLOSED); return (int8_t)sn; }
int8_t socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag) { CHECK_SOCKNUM(); switch(protocol) { case Sn_MR_TCP : { //M20150601 : Fixed the warning - taddr will never be NULL /* uint8_t taddr[4]; getSIPR(taddr); */ uint32_t taddr; getSIPR((uint8_t*)&taddr); if(taddr == 0) return SOCKERR_SOCKINIT; } case Sn_MR_UDP : case Sn_MR_MACRAW : case Sn_MR_IPRAW : break; #if ( _WIZCHIP_ < 5200 ) case Sn_MR_PPPoE : break; #endif default : return SOCKERR_SOCKMODE; } //M20150601 : For SF_TCP_ALIGN & W5300 //if((flag & 0x06) != 0) return SOCKERR_SOCKFLAG; if((flag & 0x04) != 0) return SOCKERR_SOCKFLAG; #if _WIZCHIP_ == 5200 if(flag & 0x10) return SOCKERR_SOCKFLAG; #endif if(flag != 0) { switch(protocol) { case Sn_MR_TCP: //M20150601 : For SF_TCP_ALIGN & W5300 #if _WIZCHIP_ == 5300 if((flag & (SF_TCP_NODELAY|SF_IO_NONBLOCK|SF_TCP_ALIGN))==0) return SOCKERR_SOCKFLAG; #else if((flag & (SF_TCP_NODELAY|SF_IO_NONBLOCK))==0) return SOCKERR_SOCKFLAG; #endif break; case Sn_MR_UDP: if(flag & SF_IGMP_VER2) { if((flag & SF_MULTI_ENABLE)==0) return SOCKERR_SOCKFLAG; } #if _WIZCHIP_ == 5500 if(flag & SF_UNI_BLOCK) { if((flag & SF_MULTI_ENABLE) == 0) return SOCKERR_SOCKFLAG; } #endif break; default: break; } } close(sn); //M20150601 #if _WIZCHIP_ == 5300 setSn_MR(sn, ((uint16_t)(protocol | (flag & 0xF0))) | (((uint16_t)(flag & 0x02)) << 7) ); #else setSn_MR(sn, (protocol | (flag & 0xF0))); #endif if(!port) { port = sock_any_port++; if(sock_any_port == 0xFFF0) sock_any_port = SOCK_ANY_PORT_NUM; } setSn_PORT(sn,port); setSn_CR(sn,Sn_CR_OPEN); while(getSn_CR(sn)); //A20150401 : For release the previous sock_io_mode sock_io_mode &= ~(1 <<sn); // sock_io_mode |= ((flag & SF_IO_NONBLOCK) << sn); sock_is_sending &= ~(1<<sn); sock_remained_size[sn] = 0; //M20150601 : repalce 0 with PACK_COMPLETED //sock_pack_info[sn] = 0; sock_pack_info[sn] = PACK_COMPLETED; // while(getSn_SR(sn) == SOCK_CLOSED); return (int8_t)sn; }