Ejemplo n.º 1
0
static void udp_csum_update(struct proto_hdr *hdr)
{
	struct proto_hdr *lower;
	uint16_t total_len;
	uint16_t csum;

	if (hdr->is_csum_valid)
		return;
	if (proto_hdr_field_is_set(hdr, UDP_CSUM))
		return;
	lower = proto_lower_header(hdr);
	if (!lower)
		return;

	total_len = packet_get(hdr->pkt_id)->len - hdr->pkt_offset;

	proto_hdr_field_set_default_be16(hdr, UDP_CSUM, 0);

	switch (lower->ops->id) {
	case PROTO_IP4:
		csum = p4_csum((void *) proto_header_ptr(lower), proto_header_ptr(hdr),
				total_len, IPPROTO_UDP);
		break;
	case PROTO_IP6:
		csum = p6_csum((void *) proto_header_ptr(lower), proto_header_ptr(hdr),
				total_len, IPPROTO_UDP);
		break;
	default:
		csum = 0;
		break;
	}

	proto_hdr_field_set_default_be16(hdr, UDP_CSUM, bswap_16(csum));
	hdr->is_csum_valid = true;
}
Ejemplo n.º 2
0
static void ipv6_packet_finish(struct proto_hdr *hdr)
{
	struct packet *pkt = proto_hdr_packet(hdr);
	uint16_t total_len = pkt->len - hdr->pkt_offset - IPV6_HDR_LEN;

	proto_hdr_field_set_default_be16(hdr, IP6_LEN, total_len);
}
Ejemplo n.º 3
0
static void tcp_header_init(struct proto_hdr *hdr)
{
	proto_lower_default_add(hdr, PROTO_IP4);

	proto_header_fields_add(hdr, tcp_fields, array_size(tcp_fields));

	proto_hdr_field_set_default_be16(hdr, TCP_DOFF, 5);
}
Ejemplo n.º 4
0
static void ipv4_packet_finish(struct proto_hdr *hdr)
{
	struct packet *pkt = proto_hdr_packet(hdr);
	uint16_t total_len;

	total_len = pkt->len - hdr->pkt_offset;
	proto_hdr_field_set_default_be16(hdr, IP4_LEN, total_len);

	ipv4_csum_update(hdr);
}
Ejemplo n.º 5
0
static void udp_packet_finish(struct proto_hdr *hdr)
{
	struct packet *pkt = current_packet();
	uint16_t total_len;

	total_len = pkt->len - hdr->pkt_offset;
	proto_hdr_field_set_default_be16(hdr, UDP_LEN, total_len);

	udp_csum_update(hdr);
}
Ejemplo n.º 6
0
static void pause_header_init(struct proto_hdr *hdr)
{
	uint8_t eth_dst[6] = { 0x01, 0x80, 0xC2, 0x00, 0x00, 0x01 };

	struct proto_hdr *lower;

	lower = proto_lower_default_add(hdr, PROTO_ETH);
	proto_hdr_field_set_default_bytes(lower, ETH_DST_ADDR, eth_dst);

	proto_header_fields_add(hdr, pause_fields, array_size(pause_fields));
	proto_hdr_field_set_default_be16(hdr, PAUSE_OPCODE, 0x1);
}
Ejemplo n.º 7
0
static void arp_header_init(struct proto_hdr *hdr)
{
	struct proto_hdr *lower = proto_lower_default_add(hdr, PROTO_ETH);

	if (lower->ops->id == PROTO_ETH) {
		const uint8_t bcast[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };

		proto_hdr_field_set_default_bytes(lower, ETH_DST_ADDR, bcast);
	}

	proto_header_fields_add(hdr, arp_fields, array_size(arp_fields));

	/* Generate Announce request by default */
	proto_hdr_field_set_default_be16(hdr, ARP_HTYPE, ARPHRD_ETHER);
	proto_hdr_field_set_default_be16(hdr, ARP_PTYPE, ETH_P_IP);
	proto_hdr_field_set_default_u8(hdr, ARP_HLEN, 6);
	proto_hdr_field_set_default_u8(hdr, ARP_PLEN, 4);
	proto_hdr_field_set_default_be16(hdr, ARP_OPER, ARPOP_REQUEST);
	proto_hdr_field_set_default_dev_mac(hdr, ARP_SHA);
	proto_hdr_field_set_default_dev_ipv4(hdr, ARP_SPA);
	proto_hdr_field_set_default_dev_ipv4(hdr, ARP_TPA);
}
Ejemplo n.º 8
0
static void vlan_header_init(struct proto_hdr *hdr)
{
	struct proto_hdr *lower = proto_lower_default_add(hdr, PROTO_ETH);
	uint16_t lower_etype = 0;

	proto_header_fields_add(hdr, vlan_fields, array_size(vlan_fields));

	if (lower->ops->id == PROTO_ETH)
		lower_etype = proto_hdr_field_get_u16(lower, ETH_TYPE);
	else if (lower->ops->id == PROTO_VLAN)
		lower_etype = proto_hdr_field_get_u16(lower, VLAN_ETYPE);

	proto_hdr_field_set_be16(hdr, VLAN_ETYPE, lower_etype);
	proto_hdr_field_set_default_be16(hdr, VLAN_TPID, pid_to_eth(hdr->ops->id));
}
Ejemplo n.º 9
0
static void eth_set_next_proto(struct proto_hdr *hdr, enum proto_id pid)
{
	proto_hdr_field_set_default_be16(hdr, ETH_TYPE, pid_to_eth(pid));
}