Example #1
0
static int open_packet_sk_spkt(PacketSockEntry *pse, int *new_fd)
{
	struct sockaddr addr_spkt;
	int sk;

	sk = socket(PF_PACKET, pse->type, pse->protocol);
	if (sk < 0) {
		pr_perror("Can't create packet socket");
		return -1;
	}

	memset(&addr_spkt, 0, sizeof(addr_spkt));
	addr_spkt.sa_family = AF_PACKET;

	// if the socket was bound to any device
	if (pse->ifindex > 0) {
		const size_t sa_data_size = sizeof(addr_spkt.sa_data);
		struct ifreq req;

		memset(&req, 0, sizeof(req));
		req.ifr_ifindex = pse->ifindex;

		if (ioctl(sk, SIOCGIFNAME, &req) < 0) {
			pr_perror("Can't get interface name (ifindex %d)", pse->ifindex);
			goto err;
		}

		strncpy(addr_spkt.sa_data, req.ifr_name, sa_data_size);
		addr_spkt.sa_data[sa_data_size - 1] = 0;

		if (bind(sk, &addr_spkt, sizeof(addr_spkt)) < 0) {
			pr_perror("Can't bind packet socket to %s", req.ifr_name);
			goto err;
		}
	}

	if (rst_file_params(sk, pse->fown, pse->flags))
		goto err;

	if (restore_socket_opts(sk, pse->opts))
		goto err;

	*new_fd = sk;
	return 0;

err:
	close(sk);
	return -1;
}
Example #2
0
static int open_packet_sk(struct file_desc *d)
{
	struct packet_sock_info *psi;
	PacketSockEntry *pse;
	struct sockaddr_ll addr;
	int sk, yes;

	psi = container_of(d, struct packet_sock_info, d);
	pse = psi->pse;

	pr_info("Opening packet socket id %#x\n", pse->id);

	sk = socket(PF_PACKET, pse->type, pse->protocol);
	if (sk < 0) {
		pr_perror("Can't create packet sock");
		goto err;
	}

	memset(&addr, 0, sizeof(addr));
	addr.sll_family = AF_PACKET;
	addr.sll_ifindex = pse->ifindex;

	if (bind(sk, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
		pr_perror("Can't bind packet socket");
		goto err_cl;
	}

	if (restore_opt(sk, SOL_PACKET, PACKET_VERSION, &pse->version))
		goto err_cl;

	if (restore_opt(sk, SOL_PACKET, PACKET_RESERVE, &pse->reserve))
		goto err_cl;

	if (restore_opt(sk, SOL_PACKET, PACKET_TIMESTAMP, &pse->timestamp))
		goto err_cl;

	if (restore_opt(sk, SOL_PACKET, PACKET_COPY_THRESH, &pse->copy_thresh))
		goto err_cl;

	if (pse->aux_data) {
		yes = 1;
		if (restore_opt(sk, SOL_PACKET, PACKET_AUXDATA, &yes))
			goto err_cl;
	}

	if (pse->orig_dev) {
		yes = 1;
		if (restore_opt(sk, SOL_PACKET, PACKET_ORIGDEV, &yes))
			goto err_cl;
	}

	if (pse->vnet_hdr) {
		yes = 1;
		if (restore_opt(sk, SOL_PACKET, PACKET_VNET_HDR, &yes))
			goto err_cl;
	}

	if (pse->loss) {
		yes = 1;
		if (restore_opt(sk, SOL_PACKET, PACKET_LOSS, &yes))
			goto err_cl;
	}

	if (restore_mreqs(sk, pse))
		goto err_cl;

	if (restore_rings(sk, pse))
		goto err_cl;

	if (pse->has_fanout) {
		pr_info("Restoring fanout %x\n", pse->fanout);
		if (restore_opt(sk, SOL_PACKET, PACKET_FANOUT, &pse->fanout))
			goto err_cl;
	}

	if (rst_file_params(sk, pse->fown, pse->flags))
		goto err_cl;

	if (restore_socket_opts(sk, pse->opts))
		goto err_cl;

	return sk;

err_cl:
	close(sk);
err:
	return -1;
}