Ejemplo n.º 1
0
Datum
ipaddr_cast_from_text(PG_FUNCTION_ARGS)
{
    text *txt = PG_GETARG_TEXT_PP(0);
    int tlen = VARSIZE_ANY_EXHDR(txt);
    char buf[IP6_STRING_MAX];

    if (tlen < sizeof(buf))
    {
		IP ip;

        memcpy(buf, VARDATA_ANY(txt), tlen);
        buf[tlen] = 0;

		if (strchr(buf,':'))
		{
			if (ip6_raw_input(buf, ip.ip6.bits))
				PG_RETURN_IP_P(ip_pack(PGSQL_AF_INET6, &ip));
		}
		else
		{
			if (ip4_raw_input(buf, &ip.ip4))
				PG_RETURN_IP_P(ip_pack(PGSQL_AF_INET, &ip));
		}
    }

    ereport(ERROR,
            (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
             errmsg("invalid IP value in text")));
    PG_RETURN_NULL();
}
Ejemplo n.º 2
0
static inline
IP_P
ipaddr_transform_2(Datum d1, Datum d2, PGFunction ip4func, PGFunction ip6func)
{
    IP_P ipp1 = DatumGetIP_P(d1);
    IP_P ipp2 = DatumGetIP_P(d2);
	IP ip1;
	IP ip2;
	IP out;
	int af1 = ip_unpack(ipp1, &ip1);
	int af2 = ip_unpack(ipp2, &ip2);

	if (af1 != af2)
		ereport(ERROR,
				(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
				 errmsg("invalid mixing of IP address families")));
				
	switch (af1)
	{
		case PGSQL_AF_INET:
			out.ip4 = DatumGetIP4(DirectFunctionCall2(ip4func, IP4GetDatum(ip1.ip4), IP4GetDatum(ip2.ip4)));
			break;

		case PGSQL_AF_INET6:
			out.ip6 = *(DatumGetIP6P(DirectFunctionCall2(ip6func, IP6PGetDatum(&ip1.ip6), IP6PGetDatum(&ip2.ip6))));
			break;

		default:
			ipaddr_internal_error();
	}

    return ip_pack(af1, &out);
}
Ejemplo n.º 3
0
Datum
ipaddr_cast_from_ip4(PG_FUNCTION_ARGS)
{
	IP ip;

	ip.ip4 = PG_GETARG_IP4(0);

	PG_RETURN_IP_P(ip_pack(PGSQL_AF_INET, &ip));
}
Ejemplo n.º 4
0
Datum
ipaddr_cast_from_ip6(PG_FUNCTION_ARGS)
{
	IP6 *in = PG_GETARG_IP6_P(0);
	IP ip;

	ip.ip6 = *in;

	PG_RETURN_IP_P(ip_pack(PGSQL_AF_INET6, &ip));
}
Ejemplo n.º 5
0
int udp_pack(u32 length)
{
	udp_t *udp = (void *)(send_buf + sizeof(eth_t) + sizeof(ip_t));

	udp->source = eport;
	udp->dest = hport;
	udp->len = htons(sizeof(udp_t) + length);
	udp->check = 0;

	return ip_pack(sizeof(udp_t) + length, 17);
}
Ejemplo n.º 6
0
int udp_pack(unsigned int length, unsigned short port)
{
	udp_h *udp = (void *)(send_buf + sizeof(eth_h) + sizeof(ip_h));

	udp->source = (eport);//eport :PC端口号
	udp->dest = (port);
	udp->len = htons(sizeof(udp_h) + length);
	udp->check = 0;

	return ip_pack(sizeof(udp_h) + length, 17);
}
Ejemplo n.º 7
0
Datum
ipaddr_cast_from_inet(PG_FUNCTION_ARGS)
{
    inet *inetptr = PG_GETARG_INET_P(0);
    inet_struct *in = INET_STRUCT_DATA(inetptr);
	IP ip;

	switch (in->family)
	{
		case PGSQL_AF_INET:
			ip.ip4 = DatumGetIP4(DirectFunctionCall1(ip4_cast_from_inet, InetPGetDatum(inetptr)));
			PG_RETURN_IP_P(ip_pack(PGSQL_AF_INET, &ip));
		case PGSQL_AF_INET6:
			ip.ip6 = *(DatumGetIP6P(DirectFunctionCall1(ip6_cast_from_inet, InetPGetDatum(inetptr))));
			PG_RETURN_IP_P(ip_pack(PGSQL_AF_INET6, &ip));
	}

    ereport(ERROR,
            (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
             errmsg("invalid INET value for conversion to IP")));
    PG_RETURN_NULL();
}
Ejemplo n.º 8
0
Datum
ipaddr_in(PG_FUNCTION_ARGS)
{
    char *str = PG_GETARG_CSTRING(0);
	IP ip;
		
	if (strchr(str,':'))
	{
		if (ip6_raw_input(str, ip.ip6.bits))
			PG_RETURN_IP_P(ip_pack(PGSQL_AF_INET6, &ip));
	}
	else
	{
		if (ip4_raw_input(str, &ip.ip4))
			PG_RETURN_IP_P(ip_pack(PGSQL_AF_INET, &ip));
	}

    ereport(ERROR,
            (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
             errmsg("invalid IP value: '%s'", str)));
    PG_RETURN_NULL();
}
Ejemplo n.º 9
0
int icmp_pack(char type,int seq,int len,short id)
{
	icmp_t *icmp = (void *)(send_buf + sizeof(eth_t) + sizeof(ip_t));
	
	icmp->type = type;
	icmp->code = 0;
	icmp->checksum = 0;
	icmp->id = htons(id);
	icmp->sequence = htons(seq);
	icmp->checksum = cal_sum((void *)icmp,len + sizeof(*icmp));

	return ip_pack(len + sizeof(*icmp), 1);
}
Ejemplo n.º 10
0
Datum
ipaddr_recv(PG_FUNCTION_ARGS)
{
    StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
	IP ip;
	int af, bits, flag, nbytes;

	/* we copy the external format used by inet/cidr, just because. */

	af = pq_getmsgbyte(buf);
	if (af != PGSQL_AF_INET && af != PGSQL_AF_INET6)
		ereport(ERROR,
				(errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
				 errmsg("invalid address family in external IP value")));
	bits = pq_getmsgbyte(buf);
	if (bits != ip_maxbits(af))
		ereport(ERROR,
				(errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
				 errmsg("invalid bit length in external IP value")));
	flag = pq_getmsgbyte(buf);  /* ignored */
	nbytes = pq_getmsgbyte(buf);
	if (nbytes*8 != bits)
		ereport(ERROR,
				(errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
				 errmsg("invalid address length in external IP value")));

	switch (af)
	{
		case PGSQL_AF_INET:
			ip.ip4 = (IP4) pq_getmsgint(buf, sizeof(IP4));
			break;

		case PGSQL_AF_INET6:
			ip.ip6.bits[0] = pq_getmsgint64(buf);
			ip.ip6.bits[1] = pq_getmsgint64(buf);
			break;
	}

	PG_RETURN_IP_P(ip_pack(af, &ip));
}
Ejemplo n.º 11
0
static inline
IP_P
ipaddr_transform_2d(Datum d1, Datum d2, PGFunction ip4func, PGFunction ip6func)
{
    IP_P ipp = DatumGetIP_P(d1);
	IP ip;
	int af = ip_unpack(ipp, &ip);

	switch (af)
	{
		case PGSQL_AF_INET:
			ip.ip4 = DatumGetIP4(DirectFunctionCall2(ip4func, IP4GetDatum(ip.ip4), d2));
			break;

		case PGSQL_AF_INET6:
			ip.ip6 = *(DatumGetIP6P(DirectFunctionCall2(ip6func, IP6PGetDatum(&ip.ip6), d2)));
			break;

		default:
			ipaddr_internal_error();
	}

    return ip_pack(af, &ip);
}
Ejemplo n.º 12
0
static void ipport_pack(uint8_t *data, const IP_Port *source)
{
    ip_pack(data, source->ip);
    memcpy(data + SIZE_IP, &source->port, SIZE_PORT);
}