亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? netbios.c

?? NXPl788上lwip的無(wú)操作系統(tǒng)移植,基于Embest開發(fā)板
?? C
字號(hào):
/**
 * @file
 * NetBIOS name service sample
 *
 */

/*
 * Redistribution and use in source and binary forms, with or without modification, 
 * are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 * 3. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission. 
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
 * OF SUCH DAMAGE.
 *
 * This file is part of the lwIP TCP/IP stack.
 * 
 */

#include "lwip/opt.h"

#if LWIP_UDP  /* don't build if not configured for use in lwipopts.h */

#include "lwip/udp.h"
#include "lwip/netif.h"

#include <string.h>

/** This is an example implementation of a NetBIOS name server.
 * It responds to name queries for a configurable name.
 * Name resolving is not supported.
 *
 * Note that the device doesn't broadcast it's own name so can't
 * detect duplicate names!
 */

/** NetBIOS name of LWIP device
 * This must be uppercase until NETBIOS_STRCMP() is defined to a string
 * comparision function that is case insensitive.
 * If you want to use the netif's hostname, use this (with LWIP_NETIF_HOSTNAME):
 * (ip_current_netif() != NULL ? ip_current_netif()->hostname != NULL ? ip_current_netif()->hostname : "" : "")
 */
#ifndef NETBIOS_LWIP_NAME
#define NETBIOS_LWIP_NAME "NETBIOSLWIPDEV"
#endif

/** Since there's no standard function for case-insensitive string comparision,
 * we need another define here:
 * define this to stricmp() for windows or strcasecmp() for linux.
 * If not defined, comparision is case sensitive and NETBIOS_LWIP_NAME must be
 * uppercase
 */
#ifndef NETBIOS_STRCMP
#define NETBIOS_STRCMP(str1, str2) strcmp(str1, str2)
#endif

/** default port number for "NetBIOS Name service */
#define NETBIOS_PORT     137

/** size of a NetBIOS name */
#define NETBIOS_NAME_LEN 16

/** The Time-To-Live for NetBIOS name responds (in seconds)
 * Default is 300000 seconds (3 days, 11 hours, 20 minutes) */
#define NETBIOS_NAME_TTL 300000

/** NetBIOS header flags */
#define NETB_HFLAG_RESPONSE           0x8000U
#define NETB_HFLAG_OPCODE             0x7800U
#define NETB_HFLAG_OPCODE_NAME_QUERY  0x0000U
#define NETB_HFLAG_AUTHORATIVE        0x0400U
#define NETB_HFLAG_TRUNCATED          0x0200U
#define NETB_HFLAG_RECURS_DESIRED     0x0100U
#define NETB_HFLAG_RECURS_AVAILABLE   0x0080U
#define NETB_HFLAG_BROADCAST          0x0010U
#define NETB_HFLAG_REPLYCODE          0x0008U
#define NETB_HFLAG_REPLYCODE_NOERROR  0x0000U

/** NetBIOS name flags */
#define NETB_NFLAG_UNIQUE             0x8000U
#define NETB_NFLAG_NODETYPE           0x6000U
#define NETB_NFLAG_NODETYPE_HNODE     0x6000U
#define NETB_NFLAG_NODETYPE_MNODE     0x4000U
#define NETB_NFLAG_NODETYPE_PNODE     0x2000U
#define NETB_NFLAG_NODETYPE_BNODE     0x0000U

/** NetBIOS message header */
#ifdef PACK_STRUCT_USE_INCLUDES
#  include "arch/bpstruct.h"
#endif
PACK_STRUCT_BEGIN
struct netbios_hdr {
  PACK_STRUCT_FIELD(u16_t trans_id);
  PACK_STRUCT_FIELD(u16_t flags);
  PACK_STRUCT_FIELD(u16_t questions);
  PACK_STRUCT_FIELD(u16_t answerRRs);
  PACK_STRUCT_FIELD(u16_t authorityRRs);
  PACK_STRUCT_FIELD(u16_t additionalRRs);
} PACK_STRUCT_STRUCT;
PACK_STRUCT_END
#ifdef PACK_STRUCT_USE_INCLUDES
#  include "arch/epstruct.h"
#endif

/** NetBIOS message name part */
#ifdef PACK_STRUCT_USE_INCLUDES
#  include "arch/bpstruct.h"
#endif
PACK_STRUCT_BEGIN
struct netbios_name_hdr {
  PACK_STRUCT_FIELD(u8_t  nametype);
  PACK_STRUCT_FIELD(u8_t  encname[(NETBIOS_NAME_LEN*2)+1]);
  PACK_STRUCT_FIELD(u16_t type);
  PACK_STRUCT_FIELD(u16_t cls);
  PACK_STRUCT_FIELD(u32_t ttl);
  PACK_STRUCT_FIELD(u16_t datalen);
  PACK_STRUCT_FIELD(u16_t flags);
  PACK_STRUCT_FIELD(ip_addr_p_t addr);
} PACK_STRUCT_STRUCT;
PACK_STRUCT_END
#ifdef PACK_STRUCT_USE_INCLUDES
#  include "arch/epstruct.h"
#endif

/** NetBIOS message */
#ifdef PACK_STRUCT_USE_INCLUDES
#  include "arch/bpstruct.h"
#endif
PACK_STRUCT_BEGIN
struct netbios_resp
{
  struct netbios_hdr      resp_hdr;
  struct netbios_name_hdr resp_name;
} PACK_STRUCT_STRUCT;
PACK_STRUCT_END
#ifdef PACK_STRUCT_USE_INCLUDES
#  include "arch/epstruct.h"
#endif

/** NetBIOS decoding name */
static int
netbios_name_decoding( char *name_enc, char *name_dec, int name_dec_len)
{
  char *pname;
  char  cname;
  char  cnbname;
  int   index = 0;

  LWIP_UNUSED_ARG(name_dec_len);

  /* Start decoding netbios name. */
  pname  = name_enc;
  for (;;) {
    /* Every two characters of the first level-encoded name
     * turn into one character in the decoded name. */
    cname = *pname;
    if (cname == '\0')
      break;    /* no more characters */
    if (cname == '.')
      break;    /* scope ID follows */
    if (cname < 'A' || cname > 'Z') {
      /* Not legal. */
      return -1;
    }
    cname -= 'A';
    cnbname = cname << 4;
    pname++;

    cname = *pname;
    if (cname == '\0' || cname == '.') {
      /* No more characters in the name - but we're in
       * the middle of a pair.  Not legal. */
      return -1;
    }
    if (cname < 'A' || cname > 'Z') {
      /* Not legal. */
      return -1;
    }
    cname -= 'A';
    cnbname |= cname;
    pname++;

    /* Do we have room to store the character? */
    if (index < NETBIOS_NAME_LEN) {
      /* Yes - store the character. */
      name_dec[index++] = (cnbname!=' '?cnbname:'\0');
    }
  }

  return 0;
}

#if 0 /* function currently unused */
/** NetBIOS encoding name */
static int
netbios_name_encoding(char *name_enc, char *name_dec, int name_dec_len)
{
  char         *pname;
  char          cname;
  unsigned char ucname;
  int           index = 0;
  
  /* Start encoding netbios name. */
  pname = name_enc;

  for (;;) {
    /* Every two characters of the first level-encoded name
     * turn into one character in the decoded name. */
    cname = *pname;
    if (cname == '\0')
      break;    /* no more characters */
    if (cname == '.')
      break;    /* scope ID follows */
    if ((cname < 'A' || cname > 'Z') && (cname < '0' || cname > '9')) {
      /* Not legal. */
      return -1;
    }

    /* Do we have room to store the character? */
    if (index >= name_dec_len) {
      return -1;
    }

    /* Yes - store the character. */
    ucname = cname;
    name_dec[index++] = ('A'+((ucname>>4) & 0x0F));
    name_dec[index++] = ('A'+( ucname     & 0x0F));
    pname++;
  }

  /* Fill with "space" coding */
  for (;index<name_dec_len-1;) {
    name_dec[index++] = 'C';
    name_dec[index++] = 'A';
  }

  /* Terminate string */
  name_dec[index]='\0';

  return 0;
}
#endif /* 0 */

/** NetBIOS Name service recv callback */
static void
netbios_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, ip_addr_t *addr, u16_t port)
{
  LWIP_UNUSED_ARG(arg);

  /* if packet is valid */
  if (p != NULL) {
    char   netbios_name[NETBIOS_NAME_LEN+1];
    struct netbios_hdr*      netbios_hdr      = (struct netbios_hdr*)p->payload;
    struct netbios_name_hdr* netbios_name_hdr = (struct netbios_name_hdr*)(netbios_hdr+1);
    
    /* we only answer if we got a default interface */
    if (netif_default != NULL) {
      /* @todo: do we need to check answerRRs/authorityRRs/additionalRRs? */
      /* if the packet is a NetBIOS name query question */
      if (((netbios_hdr->flags & PP_NTOHS(NETB_HFLAG_OPCODE)) == PP_NTOHS(NETB_HFLAG_OPCODE_NAME_QUERY)) &&
          ((netbios_hdr->flags & PP_NTOHS(NETB_HFLAG_RESPONSE)) == 0) &&
           (netbios_hdr->questions == PP_NTOHS(1))) {
        /* decode the NetBIOS name */
        netbios_name_decoding( (char*)(netbios_name_hdr->encname), netbios_name, sizeof(netbios_name));
        /* if the packet is for us */
        if (NETBIOS_STRCMP(netbios_name, NETBIOS_LWIP_NAME) == 0) {
          struct pbuf *q;
          struct netbios_resp *resp;

          q = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct netbios_resp), PBUF_RAM);
          if (q != NULL) {
            resp = (struct netbios_resp*)q->payload;

            /* prepare NetBIOS header response */
            resp->resp_hdr.trans_id      = netbios_hdr->trans_id;
            resp->resp_hdr.flags         = PP_HTONS(NETB_HFLAG_RESPONSE |
                                                 NETB_HFLAG_OPCODE_NAME_QUERY |
                                                 NETB_HFLAG_AUTHORATIVE |
                                                 NETB_HFLAG_RECURS_DESIRED);
            resp->resp_hdr.questions     = 0;
            resp->resp_hdr.answerRRs     = PP_HTONS(1);
            resp->resp_hdr.authorityRRs  = 0;
            resp->resp_hdr.additionalRRs = 0;

            /* prepare NetBIOS header datas */
            MEMCPY( resp->resp_name.encname, netbios_name_hdr->encname, sizeof(netbios_name_hdr->encname));
            resp->resp_name.nametype     = netbios_name_hdr->nametype;
            resp->resp_name.type         = netbios_name_hdr->type;
            resp->resp_name.cls          = netbios_name_hdr->cls;
            resp->resp_name.ttl          = PP_HTONL(NETBIOS_NAME_TTL);
            resp->resp_name.datalen      = PP_HTONS(sizeof(resp->resp_name.flags)+sizeof(resp->resp_name.addr));
            resp->resp_name.flags        = PP_HTONS(NETB_NFLAG_NODETYPE_BNODE);
            ip_addr_copy(resp->resp_name.addr, netif_default->ip_addr);

            /* send the NetBIOS response */
            udp_sendto(upcb, q, addr, port);
            
            /* free the "reference" pbuf */
            pbuf_free(q);
          }
        }
      }
    }
    /* free the pbuf */
    pbuf_free(p);
  }
}

void netbios_init(void)
{
  struct udp_pcb *pcb;

  LWIP_ASSERT("NetBIOS name is too long!", strlen(NETBIOS_LWIP_NAME) < NETBIOS_NAME_LEN);

  pcb = udp_new();
  if (pcb != NULL) {
    /* we have to be allowed to send broadcast packets! */
    pcb->so_options |= SOF_BROADCAST;
    udp_bind(pcb, IP_ADDR_ANY, NETBIOS_PORT);
    udp_recv(pcb, netbios_recv, pcb);
  }
}
#endif /* LWIP_UDP */

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区二区| av电影在线不卡| 日韩精品一区二区三区在线播放| 亚洲国产va精品久久久不卡综合| 欧美日韩国产一区| 日韩av不卡在线观看| 欧美成人女星排行榜| 麻豆传媒一区二区三区| 精品国一区二区三区| 国产一区二区影院| 中文字幕在线观看不卡视频| 9久草视频在线视频精品| 亚洲精品videosex极品| 欧美三日本三级三级在线播放| 亚洲国产精品一区二区久久 | 欧美一区二区三区婷婷月色| 麻豆成人久久精品二区三区小说| 久久综合九色综合97婷婷| 国产91精品在线观看| 亚洲欧美日韩在线不卡| 欧美日韩三级在线| 国产一区在线观看视频| 国产精品久久久爽爽爽麻豆色哟哟 | 久久www免费人成看片高清| 精品国产精品网麻豆系列| 成人午夜电影网站| 一区二区视频免费在线观看| 日韩一区二区三区视频在线观看| 国产成人夜色高潮福利影视| 亚洲视频图片小说| 日韩欧美在线1卡| www.日韩精品| 奇米亚洲午夜久久精品| **欧美大码日韩| 3d动漫精品啪啪| 国产ts人妖一区二区| 亚洲综合免费观看高清在线观看| www国产精品av| 在线免费观看成人短视频| 国产综合久久久久影院| 亚洲精品亚洲人成人网在线播放| 欧美精品一区二区三| 色拍拍在线精品视频8848| 韩国v欧美v亚洲v日本v| 亚洲网友自拍偷拍| 欧美激情在线看| 日韩欧美一区电影| 色综合 综合色| 国产在线精品一区二区三区不卡 | 一区二区三区中文免费| 国产婷婷色一区二区三区四区 | eeuss鲁一区二区三区| 人禽交欧美网站| 亚洲男帅同性gay1069| 欧美一区二区在线视频| 高清av一区二区| 中文字幕国产一区二区| 色香色香欲天天天影视综合网| 日韩一区精品字幕| 日本一二三不卡| 日韩一级片网站| 色哟哟亚洲精品| 极品少妇一区二区三区精品视频| 亚洲欧美日韩国产中文在线| 日韩精品资源二区在线| 色欧美乱欧美15图片| 天堂久久一区二区三区| 亚洲乱码中文字幕综合| 久久综合网色—综合色88| 色狠狠色噜噜噜综合网| 国产高清视频一区| 一区二区三区日韩| 国产精品三级av在线播放| 91精品国产一区二区三区蜜臀| 99国产精品国产精品久久| 久久99精品久久只有精品| 亚洲大片一区二区三区| 国产精品视频线看| 久久久国际精品| 欧美成人a视频| 欧美高清视频不卡网| 亚洲精品一区二区三区影院 | 欧美日韩久久一区| 91丨九色丨蝌蚪丨老版| 国内精品国产成人| 日韩中文字幕一区二区三区| 久久亚洲一级片| 99热这里都是精品| 亚洲v精品v日韩v欧美v专区| 亚洲同性同志一二三专区| 久久精品视频免费| 日韩欧美二区三区| 欧美一区二区三区四区五区| 欧美一区二区三区四区五区| 欧美日韩精品免费| 欧美视频你懂的| 91色九色蝌蚪| 97se亚洲国产综合自在线| 国产一区免费电影| 另类成人小视频在线| 26uuu亚洲综合色欧美| 在线一区二区观看| 成人免费视频一区二区| 麻豆一区二区三区| 亚洲精品水蜜桃| 日本三级亚洲精品| 日韩精品亚洲专区| 免费人成在线不卡| 久久99精品国产麻豆婷婷| 视频一区二区三区入口| 蜜臀av一区二区三区| 国产又黄又大久久| 粉嫩av一区二区三区| av一区二区三区在线| 99国产欧美久久久精品| 色综合视频在线观看| 一本大道av一区二区在线播放| 欧美日免费三级在线| 777a∨成人精品桃花网| 欧美精品日韩一区| 欧美mv和日韩mv国产网站| 国产欧美一区二区三区在线老狼| 亚洲国产成人一区二区三区| 亚洲欧洲精品一区二区三区| 亚洲小少妇裸体bbw| 免费日本视频一区| 大桥未久av一区二区三区中文| 97aⅴ精品视频一二三区| 欧洲av在线精品| 日韩一卡二卡三卡四卡| 国产精品色呦呦| 天堂av在线一区| 国产精品一卡二| 色婷婷亚洲婷婷| 欧美岛国在线观看| 中文字幕一区日韩精品欧美| 亚洲国产成人av网| 成人黄色软件下载| 777午夜精品免费视频| 日本一区二区免费在线观看视频| 中文字幕在线观看一区二区| 免费欧美在线视频| 粉嫩嫩av羞羞动漫久久久| 欧美日韩在线观看一区二区 | 成人一区在线看| 欧洲精品视频在线观看| 久久久精品免费免费| 亚洲最大的成人av| 蜜桃视频免费观看一区| 欧美唯美清纯偷拍| 欧美国产激情一区二区三区蜜月| 午夜久久久久久| 不卡电影一区二区三区| 欧美第一区第二区| 亚洲一区二区三区影院| 黑人巨大精品欧美一区| 一本久久a久久精品亚洲| 在线播放91灌醉迷j高跟美女| 国产精品久久精品日日| 蜜桃精品视频在线观看| 99精品久久久久久| 91麻豆精品国产91| 亚洲黄色小视频| 大胆亚洲人体视频| 精品成人一区二区三区四区| 亚洲第一二三四区| 97精品久久久午夜一区二区三区| 国产午夜一区二区三区| 美女免费视频一区二区| 欧美午夜精品久久久久久超碰| 国产精品国产三级国产有无不卡| 加勒比av一区二区| 91精品国产91久久久久久最新毛片 | 久久久精品tv| 激情综合色综合久久| 日韩精品一区二区三区四区视频| 午夜精品爽啪视频| 欧美日韩在线直播| 亚洲在线观看免费| 一本大道久久a久久精品综合| 国产精品久久午夜| 国产精品1024久久| 中文字幕亚洲不卡| 9人人澡人人爽人人精品| 欧美激情一区二区三区不卡| 国模少妇一区二区三区| 精品奇米国产一区二区三区| 免费观看30秒视频久久| 日韩小视频在线观看专区| 久久精品国产第一区二区三区| 欧美一级黄色录像| 久久国产剧场电影| 精品久久久久99| 国产在线视频一区二区| 日韩久久精品一区| 成人av网址在线观看| 亚洲男人都懂的| 色婷婷精品大在线视频| 午夜成人免费电影| 欧美一级精品大片|