Example #1
0
static void
isdn_net_ciscohdlck_slarp_send_request(isdn_net_local *mlp)
{
	isdn_net_dev *idev;
	struct sk_buff *skb;
	unsigned char *p;

	if (list_empty(&mlp->online)) {
		isdn_BUG();
		return;
	}
	idev = list_entry(mlp->online.next, isdn_net_dev, online);

	skb = isdn_net_ciscohdlck_alloc_skb(idev, 4 + 14);
	if (!skb)
		return;

	p = skb_put(skb, 4 + 14);

	/* cisco header */
	p += put_u8 (p, CISCO_ADDR_UNICAST);
	p += put_u8 (p, CISCO_CTRL);
	p += put_u16(p, CISCO_TYPE_SLARP);

	/* slarp request */
	p += put_u32(p, CISCO_SLARP_REQUEST);
	p += put_u32(p, 0); // address
	p += put_u32(p, 0); // netmask
	p += put_u16(p, 0); // unused

	isdn_net_write_super(idev, skb);
}
Example #2
0
static int
isdn_ciscohdlck_header(struct sk_buff *skb, struct net_device *dev, 
		      unsigned short type,
		      void *daddr, void *saddr, unsigned plen)
{
	unsigned char *p = skb_push(skb, 4);

	p += put_u8 (p, CISCO_ADDR_UNICAST);
	p += put_u8 (p, CISCO_CTRL);
	p += put_u16(p, type);
	
	return 4;
}
Example #3
0
static uint8_t pack_notify_value(const hrs_measurement_t *meas, uint16_t length, uint8_t *value)
{
        uint8_t *ptr = &value[1];
        uint8_t flags = 0;

        if (meas->bpm > 255) {
                flags |= HRM_FLAG_VAL_16BIT;
                put_u16_inc(&ptr, meas->bpm);
        } else {
                put_u8_inc(&ptr, meas->bpm);
        }

        if (meas->has_energy_expended) {
                flags |= HRM_FLAG_ENERGY_EXPENDED_PRESENT;
                put_u16_inc(&ptr, meas->energy_expended);
        }

        if (meas->rr_num) {
                int idx = 0;
                flags |= HRM_FLAG_RR_INTERVAL_PRESENT;
                while (idx < meas->rr_num && (length - (ptr - value)) >= sizeof(uint16_t)) {
                        put_u16_inc(&ptr, meas->rr[idx++]);
                }
        }

        flags |= (meas->contact_supported ? HRM_FLAG_SENSOR_CONTACT_SUPPORTED : 0);
        flags |= (meas->contact_detected ? HRM_FLAG_SENSOR_CONTACT_DETECTED : 0);
        put_u8(value, flags);

        return ptr - value;
}
Example #4
0
// Our custom key handler function
void key_handler(uint8_t code, bool special)
{
	put_str_P(uart, special ? PSTR("Special: ") : PSTR("Char: "));
	put_c(uart, code); // the actual character
	put_c(uart, ' '); // space
	put_u8(uart, code); // as number
	put_nl(uart); // crlf
}
Example #5
0
static void
isdn_net_ciscohdlck_slarp_send_reply(isdn_net_dev *idev)
{
	isdn_net_local *mlp = idev->mlp;
	struct sk_buff *skb;
	unsigned char *p;
	struct in_device *in_dev = NULL;
	u32 addr = 0;		/* local ipv4 address */
	u32 mask = 0;		/* local netmask */

	if ((in_dev = mlp->dev.ip_ptr) != NULL) {
		/* take primary(first) address of interface */
		struct in_ifaddr *ifa = in_dev->ifa_list;
		if (ifa != NULL) {
			addr = ifa->ifa_local;
			mask = ifa->ifa_mask;
		}
	}

	skb = isdn_net_ciscohdlck_alloc_skb(idev, 4 + 14);
	if (!skb)
		return;

	p = skb_put(skb, 4 + 14);

	/* cisco header */
	p += put_u8 (p, CISCO_ADDR_UNICAST);
	p += put_u8 (p, CISCO_CTRL);
	p += put_u16(p, CISCO_TYPE_SLARP);

	/* slarp reply, send own ip/netmask; if values are nonsense remote
	 * should think we are unable to provide it with an address via SLARP */
	p += put_u32(p, CISCO_SLARP_REPLY);
	p += put_u32(p, addr);	// address
	p += put_u32(p, mask);	// netmask
	p += put_u16(p, 0);	// unused

	isdn_net_write_super(idev, skb);
}
Example #6
0
static void
put_func (Sophon_VM *vm, Sophon_IOFunc func, Sophon_Ptr data,
			Sophon_Function *f)
{
	StoreVarParams svp;
	Sophon_U16 i;

	SOPHON_ASSERT(!(f->flags & SOPHON_FUNC_FL_NATIVE));

	if (f->name)
		put_str(vm, func, data, f->name);
	else
		put_u32(func, data, 0);

	put_u8(func, data, f->flags);
	put_u8(func, data, f->argc);
	put_u16(func, data, f->varc);
	put_u16(func, data, f->stack_size);
	put_u16(func, data, f->ibuf_size);

	SOPHON_ASSERT(f->var_hash.count == f->varc + f->argc);

	svp.func = func;
	svp.data = data;
	sophon_hash_for_each(vm, &f->var_hash, store_var, &svp);

	func(data, f->f.ibuf, f->ibuf_size);

#ifdef SOPHON_LINE_INFO
	put_u16(func, data, f->lbuf_size);
	for (i = 0; i < f->lbuf_size; i++) {
		put_u16(func, data, f->lbuf[i].line);
		put_u16(func, data, f->lbuf[i].offset);
	}
#endif
}
Example #7
0
static void
put_value (Sophon_VM *vm, Sophon_IOFunc func, Sophon_Ptr data,
			Sophon_Value v)
{
	if (sophon_value_is_undefined(v)) {
		put_u8(func, data, TAG_UNDEF);
	} else if (sophon_value_is_null(v)) {
		put_u8(func, data, TAG_NULL);
	} else if (sophon_value_is_bool(v)) {
		Sophon_Bool b;

		b = sophon_value_to_bool(vm, v);
		put_u8(func, data, TAG_BOOL);
		put_u8(func, data, b ? 1 : 0);
	} else if (sophon_value_is_string(v)) {
		Sophon_String *str;

		sophon_value_to_string(vm, v, &str);
		put_u8(func, data, (str->gc_flags & SOPHON_GC_FL_INTERN) ?
					TAG_INTERN_STRING : TAG_STRING);
		put_str(vm, func, data, str);
	} else if (sophon_value_is_number(v)) {
		Sophon_Number n;

		sophon_value_to_number(vm, v, &n);

		if (n == (Sophon_Number)(Sophon_Int)(n)) {
			put_u8(func, data, TAG_INT);
			put_u32(func, data, (Sophon_Int)n);
		} else {
			put_u8(func, data, TAG_DOUBLE);
			put_double(func, data, n);
		}
	} else {
		SOPHON_ASSERT(0);
	}
}
Example #8
0
/* called via cisco_timer.function */
static void
isdn_net_ciscohdlck_slarp_send_keepalive(unsigned long data)
{
	isdn_net_local *mlp = (isdn_net_local *) data;
 	isdn_net_dev *idev;
	struct inl_cisco *cisco = mlp->inl_priv;
	struct sk_buff *skb;
	unsigned char *p;
	unsigned long last_cisco_myseq = cisco->myseq;
	int myseq_diff = 0;

	if (list_empty(&mlp->online)) {
		isdn_BUG();
		return;
	}
	idev = list_entry(mlp->online.next, isdn_net_dev, online);
	cisco->myseq++;

	myseq_diff = cisco->myseq - cisco->mineseen;
	if (cisco->line_state && (myseq_diff >= 3 || myseq_diff <= -3)) {
		/* line up -> down */
		cisco->line_state = 0;
		printk (KERN_WARNING
				"UPDOWN: Line protocol on Interface %s,"
				" changed state to down\n", idev->name);
		/* should stop routing higher-level data accross */
	} else if (!cisco->line_state &&
		myseq_diff >= 0 && myseq_diff <= 2) {
		/* line down -> up */
		cisco->line_state = 1;
		printk (KERN_WARNING
				"UPDOWN: Line protocol on Interface %s,"
				" changed state to up\n", idev->name);
		/* restart routing higher-level data accross */
	}

	if (cisco->debserint)
		printk (KERN_DEBUG "%s: HDLC "
			"myseq %u, mineseen %u%c, yourseen %u, %s\n",
			idev->name, cisco->myseq, cisco->mineseen,
			(last_cisco_myseq == cisco->mineseen) ? '*' : 040,
			cisco->yourseq,
			(cisco->line_state) ? "line up" : "line down");

	skb = isdn_net_ciscohdlck_alloc_skb(idev, 4 + 14);
	if (!skb)
		return;

	p = skb_put(skb, 4 + 14);

	/* cisco header */
	p += put_u8 (p, CISCO_ADDR_UNICAST);
	p += put_u8 (p, CISCO_CTRL);
	p += put_u16(p, CISCO_TYPE_SLARP);

	/* slarp keepalive */
	p += put_u32(p, CISCO_SLARP_KEEPALIVE);
	p += put_u32(p, cisco->myseq);
	p += put_u32(p, cisco->yourseq);
	p += put_u16(p, 0xffff); // reliablity, always 0xffff

	isdn_net_write_super(idev, skb);

	mod_timer(&cisco->timer, jiffies + cisco->keepalive_period * HZ);
}