示例#1
0
void bridge_set_no_ipv4_addr(const char *cmd)
{
	arglist *args;
	char brname[32];
	char * dhcpd_intf = NULL;

	args = librouter_make_args(cmd);

	if (!check_bridge(args->argv[2], brname)) {
		librouter_destroy_args(args);
		return;
	}

	strcpy(brname, BRIDGE_NAME);
	strcat(brname, args->argv[2]);

	/*Verify DHCP Server on intf and shut it down*/
	librouter_dhcp_server_get_iface(&dhcpd_intf);
	if (dhcpd_intf){
		if (!strcmp(brname, dhcpd_intf)){
			printf("%% bridge group %s has DHCP Server assigned.\n", args->argv[2]);
			printf("%% DHCP Server is going to be shut down.\n");
			librouter_dhcp_server_set_status(0);
		}
		free (dhcpd_intf);
	}

	librouter_ip_interface_set_no_addr(brname);

	librouter_destroy_args(args);
}
static int local_write(struct ast_channel *ast, struct ast_frame *f)
{
	struct local_pvt *p = ast_channel_tech_pvt(ast);
	int res = -1;
	int isoutbound;

	if (!p) {
		return -1;
	}

	/* Just queue for delivery to the other side */
	ao2_ref(p, 1); /* ref for local_queue_frame */
	ao2_lock(p);
	isoutbound = IS_OUTBOUND(ast, p);

	if (isoutbound
		&& (f->frametype == AST_FRAME_VOICE || f->frametype == AST_FRAME_VIDEO)) {
		check_bridge(ast, p);
	}

	if (!ast_test_flag(p, LOCAL_ALREADY_MASQED)) {
		res = local_queue_frame(p, isoutbound, f, ast, 1);
	} else {
		ast_debug(1, "Not posting to '%s' queue since already masqueraded out\n",
			ast_channel_name(ast));
		res = 0;
	}
	ao2_unlock(p);
	ao2_ref(p, -1);

	return res;
}
示例#3
0
void bridge_setprio(const char *cmd)
{
	arglist *args;
	char brname[32];

	args = librouter_make_args(cmd);

	if (check_bridge(args->argv[1], brname))
		librouter_br_setbridgeprio(brname, atoi(args->argv[3]));

	librouter_destroy_args(args);
}
示例#4
0
void bridge_stp(const char *cmd) /* no bridge 1 spanning-disabled */
{
	arglist *args;
	char brname[32];

	args = librouter_make_args(cmd);

	if (check_bridge(args->argv[2], brname))
		librouter_br_set_stp(brname, 1);

	librouter_destroy_args(args);
}
示例#5
0
void bridge_show(const char *cmd) /* show bridge 1 */
{
	arglist *args;
	char brname[32];

	args = librouter_make_args(cmd);

	if (check_bridge(args->argv[2], brname)) {
		librouter_br_dump_info(brname, stdout);
	}

	librouter_destroy_args(args);
}
/* Handles incoming LE_ARP_REQ and targetless LE_ARP_REQ.
 * See LANEv2, 7.1.5 and 7.1.30
 * Returns < 0 for serious error
 */
static int handle_le_arp_req(struct ctrl_frame *frame, int size)
{
        int sizeoftlvs, sizeofrsp, retval;
        struct ctrl_frame *rsp;
        struct atmlec_msg *msg;

        if (frame->header.lec_id == htons(lec_params.c14_lec_id)) {
                diag(COMPONENT, DIAG_DEBUG, "Ignoring own LE_ARP_REQUEST\n");
                return 0;
        }

        retval = 0;
        if (frame->target_lan_dst.tag == htons(LAN_DST_MAC_ADDR)) {
                if (memcmp(frame->target_lan_dst.mac, lec_params.c6_mac_addr, ETH_ALEN) != 0)
                        return (check_bridge(frame, size)); /* target was not us */
                sizeofrsp = sizeof(struct ctrl_frame) + lec_params.sizeoftlvs;
                rsp = (struct ctrl_frame *)malloc(sizeofrsp);
                if (rsp == NULL) return 0;
                memcpy(rsp, frame, sizeof(struct ctrl_frame));
                rsp->header.opcode = htons(LE_ARP_RSP);
                memcpy(rsp->target_atm_addr, lec_params.c1n_my_atm_addr, ATM_ESA_LEN);
                rsp->num_tlvs = lec_params.num_tlvs;
                if (lec_params.num_tlvs > 0)
                        memcpy(rsp + 1, lec_params.tlvs, lec_params.sizeoftlvs);

                retval = send_frame(lec_params.ctrl_direct, rsp, sizeofrsp);
                free(rsp);
        } else if (frame->target_lan_dst.tag == htons(LAN_DST_NOT_PRESENT) &&
                   lec_params.c29_v2_capable) {
                sizeoftlvs = size - sizeof(struct ctrl_frame);
                msg = (struct atmlec_msg *)malloc(sizeof(struct atmlec_msg) + sizeoftlvs);
                if (msg == NULL) return -1;
                memset(msg, 0, sizeof(struct atmlec_msg));
                msg->type = l_arp_update;
                memcpy(msg->content.normal.mac_addr, frame->src_lan_dst.mac, ETH_ALEN);
                memcpy(msg->content.normal.atm_addr, frame->src_atm_addr, ATM_ESA_LEN);
                msg->content.normal.flag = (frame->header.flags & REMOTE_ADDRESS) ? 1 : 0;
                msg->content.normal.targetless_le_arp = 1;
                msg->sizeoftlvs = sizeoftlvs;
                if (sizeoftlvs > 0) memcpy(msg + 1, frame + 1, sizeoftlvs);

                retval = msg_to_kernel(msg, sizeof(struct atmlec_msg) + sizeoftlvs);
                free(msg);
        }
        
        return retval;
}
示例#7
0
void bridge_set_ipv4_addr(const char *cmd)
{
	arglist *args;
	char brname[32];
	char *addr, *mask;

	args = librouter_make_args(cmd);

	if (!check_bridge(args->argv[1], brname)) {
		librouter_destroy_args(args);
		return;
	}

	strcpy(brname, BRIDGE_NAME);
	strcat(brname, args->argv[1]);
	addr = args->argv[3];
	mask = args->argv[4];

	librouter_ip_interface_set_addr(brname, addr, mask);

	librouter_destroy_args(args);
}